Revision: 4992
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4992&view=rev
Author:   jswhit
Date:     2008-03-04 13:59:45 -0800 (Tue, 04 Mar 2008)

Log Message:
-----------
added drawmapscale method.

Modified Paths:
--------------
    trunk/toolkits/basemap/Changelog
    trunk/toolkits/basemap/README
    trunk/toolkits/basemap/lib/mpl_toolkits/basemap/basemap.py

Modified: trunk/toolkits/basemap/Changelog
===================================================================
--- trunk/toolkits/basemap/Changelog    2008-02-29 14:04:48 UTC (rev 4991)
+++ trunk/toolkits/basemap/Changelog    2008-03-04 21:59:45 UTC (rev 4992)
@@ -1,4 +1,6 @@
 version 0.99
+           * added drawmapscale method to create a map scale bar similar
+             to that available with the GMT's psbasemap.
            * Now lives in mpl_toolkits.basemap.  Instead
              of 'from matplotlib.toolkits.basemap import Basemap',
              use 'from mpl_toolkits.basemap import Basemap'.

Modified: trunk/toolkits/basemap/README
===================================================================
--- trunk/toolkits/basemap/README       2008-02-29 14:04:48 UTC (rev 4991)
+++ trunk/toolkits/basemap/README       2008-03-04 21:59:45 UTC (rev 4992)
@@ -114,5 +114,6 @@
 Scott Sinclair
 Ivan Lima
 Erik Andersen
+Michael Hearne
 
 for valuable contributions.

Modified: trunk/toolkits/basemap/lib/mpl_toolkits/basemap/basemap.py
===================================================================
--- trunk/toolkits/basemap/lib/mpl_toolkits/basemap/basemap.py  2008-02-29 
14:04:48 UTC (rev 4991)
+++ trunk/toolkits/basemap/lib/mpl_toolkits/basemap/basemap.py  2008-03-04 
21:59:45 UTC (rev 4992)
@@ -2768,6 +2768,176 @@
             im = self.imshow(self._bm_rgba,ax=ax)
         return im
 
+    def drawmapscale(self,lon,lat,lon0,lat0,length,barstyle='simple',\
+                     units='km',fontsize=9,yoffset=None,labelstyle='simple',\
+                     fontcolor='k',fillcolor1='w',fillcolor2='k',ax=None):
+        """
+        draw a map scale at lon,lat representing distance in the map
+        projection coordinates at lon0,lat0. The length of the scale
+        is specified by the length argument, with units given by the units
+        keyword (default 'km').  Two styles of scale bar are available
+        (specified by the labelstyle keyword) - 'simple' and 'fancy', which
+        correspond roughly to the corresponding styles provided by 
+        the Generic Mapping Tools software. Default is 'simple'.
+
+        The fontsize and color of the map scale annotations can be specified
+        with the fontsize (default 9) and fontcolor (default black) keywords.
+
+        labelstyle='simple' results in basic annotation (the units on top
+        of the scalebar and the distance below).  This is the default.
+        If labelstyle='fancy' the map scale factor (ratio between
+        the actual distance and map projection distance at lon0,lat0) and
+        the value of lon0,lat0 are also printed on top of the scale bar.
+
+        yoffset controls how tall the scale bar is, and how far the annotations
+        are offset from the scale bar.  Default is 0.02 times the height of 
the map
+        (0.02*(self.ymax-self.ymin)).
+
+        fillcolor1 and fillcolor2 are only relevant for the 'fancy' scale bar.
+        They are the colors of the alternating filled regions (default white
+        and black).
+        """
+        # get current axes instance (if none specified).
+        if ax is None and self.ax is None:
+            try:
+                ax = pylab.gca()
+            except:
+                import pylab
+                ax = pylab.gca()
+        elif ax is None and self.ax is not None:
+            ax = self.ax
+        # not valid for cylindrical projection
+        if self.projection == 'cyl':
+            raise ValueError("cannot draw map scale for projection='cyl'")
+        # convert length to meters
+        if units == 'km':
+            lenlab = length
+            length = length*1000 
+        elif units == 'mi':
+            lenlab = length
+            length = length*1609.344
+        elif units == 'nmi':
+            lenlab = length
+            length = length*1852
+        else:
+            msg = "units must be 'km' (kilometers), "\
+            "'mi' (miles) or 'nmi' (nautical miles)"
+            raise KeyError(msg)
+        # reference point and center of scale.
+        x0,y0 = self(lon0,lat0)
+        xc,yc = self(lon,lat)
+        # make sure lon_0 between -180 and 180
+        lon_0 = ((lon0+360) % 360) - 360
+        if lat0>0:
+            if lon>0:
+                lonlatstr = u'%g\N{DEGREE SIGN}N, %g\N{DEGREE SIGN}E' % 
(lat0,lon_0)
+            elif lon<0:
+                lonlatstr = u'%g\N{DEGREE SIGN}N, %g\N{DEGREE SIGN}W' % 
(lat0,lon_0)
+            else:
+                lonlatstr = u'%g\N{DEGREE SIGN}, %g\N{DEGREE SIGN}W' % 
(lat0,lon_0)
+        else:
+            if lon>0:
+                lonlatstr = u'%g\N{DEGREE SIGN}S, %g\N{DEGREE SIGN}E' % 
(lat0,lon_0)
+            elif lon<0:
+                lonlatstr = u'%g\N{DEGREE SIGN}S, %g\N{DEGREE SIGN}W' % 
(lat0,lon_0)
+            else:
+                lonlatstr = u'%g\N{DEGREE SIGN}S, %g\N{DEGREE SIGN}' % 
(lat0,lon_0)
+        # left edge of scale
+        lon1,lat1 = self(x0-length/2,y0,inverse=True)
+        x1,y1 = self(lon1,lat1)
+        # right edge of scale
+        lon4,lat4 = self(x0+length/2,y0,inverse=True)
+        x4,y4 = self(lon4,lat4)
+        x1 = x1-x0+xc; y1 = y1-y0+yc
+        x4 = x4-x0+xc; y4 = y4-y0+yc
+        if x1 > 1.e20 or x4 > 1.e20 or y1 > 1.e20 or y4 > 1.e20:
+            raise ValueError("scale bar positioned outside projection limb")
+        # scale factor for true distance
+        gc = pyproj.Geod(a=self.rmajor,b=self.rminor)
+        az12,az21,dist = gc.inv(lon1,lat1,lon4,lat4)
+        scalefact = dist/length
+        # label to put on top of scale bar.
+        if labelstyle=='simple':
+            labelstr = units
+        elif labelstyle == 'fancy':
+            labelstr = units+" (scale factor %4.2f at 
%s)"%(scalefact,lonlatstr)
+        else:
+            raise KeyError("labelstyle must be 'simple' or 'fancy'")
+        # default y offset is 2 percent of map height.
+        if yoffset is None: yoffset = 0.02*(self.ymax-self.ymin)
+        # 'fancy' style
+        if barstyle == 'fancy':
+            #we need 5 sets of x coordinates (in map units)
+            #quarter scale
+            lon2,lat2 = self(x0-length/4,y0,inverse=True)
+            x2,y2 = self(lon2,lat2)
+            x2 = x2-x0+xc; y2 = y2-y0+yc
+            #three quarter scale
+            lon3,lat3 = self(x0+length/4,y0,inverse=True)
+            x3,y3 = self(lon3,lat3)
+            x3 = x3-x0+xc; y3 = y3-y0+yc
+            #plot top line
+            ytop = yc+yoffset/2
+            ybottom = yc-yoffset/2
+            ytick = ybottom - yoffset/2
+            ytext = ytick - yoffset/2
+            self.plot([x1,x4],[ytop,ytop],color=fontcolor)
+            #plot bottom line
+            self.plot([x1,x4],[ybottom,ybottom],color=fontcolor)
+            #plot left edge
+            self.plot([x1,x1],[ybottom,ytop],color=fontcolor)
+            #plot right edge
+            self.plot([x4,x4],[ybottom,ytop],color=fontcolor)
+            #make a filled black box from left edge to 1/4 way across
+            ax.fill([x1,x2,x2,x1,x1],[ytop,ytop,ybottom,ybottom,ytop],\
+                    ec=fontcolor,fc=fillcolor1)
+            #make a filled white box from 1/4 way across to 1/2 way across
+            ax.fill([x2,xc,xc,x2,x2],[ytop,ytop,ybottom,ybottom,ytop],\
+                    ec=fontcolor,fc=fillcolor2)
+            #make a filled white box from 1/2 way across to 3/4 way across
+            ax.fill([xc,x3,x3,xc,xc],[ytop,ytop,ybottom,ybottom,ytop],\
+                    ec=fontcolor,fc=fillcolor1)
+            #make a filled white box from 3/4 way across to end
+            ax.fill([x3,x4,x4,x3,x3],[ytop,ytop,ybottom,ybottom,ytop],\
+                    ec=fontcolor,fc=fillcolor2)
+            #plot 3 tick marks at left edge, center, and right edge
+            self.plot([x1,x1],[ytick,ybottom],color=fontcolor)
+            self.plot([xc,xc],[ytick,ybottom],color=fontcolor)
+            self.plot([x4,x4],[ytick,ybottom],color=fontcolor)
+            #label 3 tick marks
+            ax.text(x1,ytext,'%d' % (0),\
+            horizontalalignment='center',\
+            verticalalignment='top',\
+            fontsize=fontsize,color=fontcolor)
+            ax.text(xc,ytext,'%d' % (0.5*lenlab),\
+            horizontalalignment='center',\
+            verticalalignment='top',\
+            fontsize=fontsize,color=fontcolor)
+            ax.text(x4,ytext,'%d' % (lenlab),\
+            horizontalalignment='center',\
+            verticalalignment='top',\
+            fontsize=fontsize,color=fontcolor)
+            #put units, scale factor on top
+            ax.text(xc,ytop+yoffset/2,labelstr,\
+            horizontalalignment='center',\
+            verticalalignment='bottom',\
+            fontsize=fontsize,color=fontcolor)
+        # 'simple' style
+        elif barstyle == 'simple':
+            self.plot([x1,x4],[yc,yc],color=fontcolor)
+            self.plot([x1,x1],[yc-yoffset,yc+yoffset],color=fontcolor)
+            self.plot([x4,x4],[yc-yoffset,yc+yoffset],color=fontcolor)
+            ax.text(xc,yc-yoffset,'%d' % lenlab,\
+            verticalalignment='top',horizontalalignment='center',\
+            fontsize=fontsize,color=fontcolor)
+            #put units, scale factor on top
+            ax.text(xc,yc+yoffset,labelstr,\
+            horizontalalignment='center',\
+            verticalalignment='bottom',\
+            fontsize=fontsize,color=fontcolor)
+        else:
+            raise KeyError("barstyle must be 'simple' or 'fancy'")
+
 ### End of Basemap class
 
 def _searchlist(a,x):


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to