On Thu, Mar 6, 2008 at 6:15 PM, Jeff Whitaker <[EMAIL PROTECTED]> wrote:
> Stephane Raynaud wrote:
> > 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.
> >
> >
> >
> Stephane: While I agree it would be nice to be able to just say 'give
> me a scalebar', I don't think having Basemap choose a default location
> and size would be very useful. You want the scalebar to be where there
> is nothing else drawn on the map, and this will be different in every
> case.
Sure, but the algorithm used by legend tries to put the legend where
there is nothing drawn.
> Plus, you probably want the length to be a nice round number, not
> an arbitrary fraction of the map domain.
I was not thinking about a simple fraction, but a nice length taken
within values derived from a Locator scaled by a fraction on the map
domain.
>
> -Jeff
>
>
> > 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
> >> [email protected]
> >> https://lists.sourceforge.net/lists/listinfo/matplotlib-users
> >>
> >>
> >>
> >
> >
> >
> >
>
>
> --
> Jeffrey S. Whitaker Phone : (303)497-6313
> NOAA/OAR/CDC R/PSD1 FAX : (303)497-6449
> 325 Broadway Boulder, CO, USA 80305-3328
>
>
--
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-users