Hi,

this scalebar is a really good idea!

However, I suggest that all parameters must be optional:
- The position could be by default somewhere in the lower left corner
(for example). It may be interesting to find a "best" position using
the algo of legend.
- Then length could be estimated from automatically from the map coordinates.


On Tue, Mar 4, 2008 at 3:47 PM, Michael Hearne <[EMAIL PROTECTED]> wrote:
>  Jeff - I think the way GMT does it would be okay - they have a latitude of
> true scale, which I usually choose as the center latitude of the map.
>
> I was thinking we should allow people to choose the "simple" or "fancy"
> options.  Do you think it will be okay to have the height of the bar and the
> text offset be relative to the length of it?  I suppose if the height
> becomes a problem, people could use the yoffset keyword...
>
> --Mike
>
>
> On Mar 4, 2008, at 6:05 AM, Jeff Whitaker wrote:
>
> Michael Hearne wrote:
> Jeff - That would replicate the "simple" scale-bar from GMT.  Below is my
> not-complete attempt at replicating the "fancy" scale bar.  It would need
> some options for specifying different units (miles, nautical miles, etc.)
> and perhaps some more attention to spacing of the text from the scale bar
> and tick marks...
>
> --Mike
>
> Mike:  Very nice!  Do you want the scale to show the true distance on the
> earth (in which case the labels will vary depending on where the label is
> placed), or the distance in map projection coordinates (in which case the
> labels are constant)?  Or perhaps a lat/lon value could be given to specify
> where the scale is true?
>
> -Jeff
>
> from numpy import *
> from matplotlib.toolkits.basemap import Basemap, pyproj
> from pylab import *
> # add drawscale method to Basemap class.
> class Basemap2(Basemap):
>    def drawscale(self,lon,lat,length,yoffset=None):
>        """draw a fancy map scale from lon-length/2,lat-yoffset to
>        lon-length/2,lat-yoffset, label it with actual distance in km"""
>        length = length*1000 #input length is km
>
>        #we need 5 sets of x coordinates (in map units)
>        #center of scale
>        xc,yc = self(lon,lat)
>        #left edge of scale
>        lon1,lat1 = self(xc-length/2,yc,inverse=True)
>        x1,y1 = self(lon1,lat1)
>        #quarter scale
>        lon2,lat2 = self(xc-length/4,yc,inverse=True)
>        x2,y2 = self(lon2,lat2)
>        #three quarter scale
>        lon3,lat3 = self(xc+length/4,yc,inverse=True)
>        x3,y3 = self(lon3,lat3)
>        #right edge of scale
>        lon4,lat4 = self(xc+length/2,yc,inverse=True)
>        x4,y4 = self(lon4,lat4)
>               if yoffset is None: yoffset = 0.1*length
>
>        #plot top line
>        ytop = yc+yoffset/2
>        ybottom = yc-yoffset/2
>        ytick = ybottom - yoffset/2
>        ytext = ytick - yoffset/2
>        m.plot([x1,x4],[ytop,ytop],color='k')
>        #plot bottom line
>        m.plot([x1,x4],[ybottom,ybottom],color='k')
>        #plot left edge
>        m.plot([x1,x1],[ybottom,ytop],color='k')
>        #plot right edge
>        m.plot([x4,x4],[ybottom,ytop],color='k')
>
>        #make a filled black box from left edge to 1/4 way across
>        fill([x1,x2,x2,x1,x1],[ytop,ytop,ybottom,ybottom,ytop],'k')
>        #make a filled white box from 1/4 way across to 1/2 way across
>        fill([x2,xc,xc,x2,x2],[ytop,ytop,ybottom,ybottom,ytop],'w')
>        #make a filled white box from 1/2 way across to 3/4 way across
>        fill([xc,x3,x3,xc,xc],[ytop,ytop,ybottom,ybottom,ytop],'k')
>        #make a filled white box from 3/4 way across to end
>        fill([x3,x4,x4,x3,x3],[ytop,ytop,ybottom,ybottom,ytop],'w')
>               #plot 3 tick marks at left edge, center, and right edge
>        m.plot([x1,x1],[ytick,ybottom],color='k')
>        m.plot([xc,xc],[ytick,ybottom],color='k')
>        m.plot([x4,x4],[ytick,ybottom],color='k')
>
>        #label 3 tick marks
>        text(x1,ytext,'%d' % (0),\
>    horizontalalignment='center',\
>    verticalalignment='top',\
>    fontsize=9)
>        text(xc,ytext,'%d' % (round((length/2)/1000)),\
>    horizontalalignment='center',\
>    verticalalignment='top',\
>    fontsize=9)
>        text(x4,ytext,'%d' % (round((length)/1000)),\
>    horizontalalignment='center',\
>    verticalalignment='top',\
>    fontsize=9)
>
>        #put units on top
>        text(xc,ytop+yoffset/2,'km',\
>    horizontalalignment='center',\
>    verticalalignment='bottom',\
>    fontsize=9)
>
> # setup of basemap ('lcc' = lambert conformal conic).
> # use major and minor sphere radii from WGS84 ellipsoid.
> m =
> Basemap2(llcrnrlon=-145.5,llcrnrlat=1.,urcrnrlon=-2.566,urcrnrlat=46.352,\
>      rsphere=(6378137.00,6356752.3142),\
>      resolution='l',area_thresh=1000.,projection='lcc',\
>      lat_1=50.,lon_0=-107.)
> # draw coastlines and political boundaries.
> m.drawcoastlines()
> m.fillcontinents()
> # draw parallels and meridians.
> # label on left, right and bottom of map.
> m.drawparallels(arange(0.,80,20.),labels=[1,1,0,1])
> m.drawmeridians(arange(10.,360.,30.),labels=[1,1,0,1])
> # draw a line from x1,y to x2,y and label it with distance in km.
> length = 3000 #kilometers
> x1,y1 = 0.25*m.xmax, 0.25*m.ymax
> lon1,lat1 = m(x1,y1,inverse=True)
> m.drawscale(lon1,lat1,length)
> title('a fancy map scale')
> show()
>
>
>
>
> ------------------------------------------------------
> Michael Hearne
> [EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>
> (303) 273-8620
> USGS National Earthquake Information Center
> 1711 Illinois St. Golden CO 80401
> Senior Software Engineer
> Synergetics, Inc.
> ------------------------------------------------------
>
>
>
>
>
> --
> Jeffrey S. Whitaker         Phone : (303)497-6313
> NOAA/OAR/CDC  R/PSD1        FAX   : (303)497-6449
> 325 Broadway                Boulder, CO, USA 80305-3328
>
>
>
>
>
> ------------------------------------------------------
> Michael Hearne
> [EMAIL PROTECTED]
> (303) 273-8620
> USGS National Earthquake Information Center
> 1711 Illinois St. Golden CO 80401
> Senior Software Engineer
> Synergetics, Inc.
> ------------------------------------------------------
>
>
> -------------------------------------------------------------------------
>  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-users mailing list
>  Matplotlib-users@lists.sourceforge.net
>  https://lists.sourceforge.net/lists/listinfo/matplotlib-users
>
>



-- 
Stephane Raynaud

-------------------------------------------------------------------------
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-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to