From: <js...@us...> - 2008-02-15 15:47:50
|
Revision: 4972 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4972&view=rev Author: jswhit Date: 2008-02-15 07:47:46 -0800 (Fri, 15 Feb 2008) Log Message: ----------- added "bluemarble" method, make sure data is cached correctly in warpimage. Modified Paths: -------------- trunk/toolkits/basemap/examples/README trunk/toolkits/basemap/examples/warpimage.py trunk/toolkits/basemap/lib/mpl_toolkits/basemap/basemap.py Modified: trunk/toolkits/basemap/examples/README =================================================================== --- trunk/toolkits/basemap/examples/README 2008-02-15 13:45:41 UTC (rev 4971) +++ trunk/toolkits/basemap/examples/README 2008-02-15 15:47:46 UTC (rev 4972) @@ -80,9 +80,8 @@ stereographic, lambert azimuthal equal area, azimuthal equidistant projections (prefixed by 'np' and 'sp'). -warpimage.py shows how to interpolate (warp) an image from one -map projection to another using the 'warpimage' Basemap method. -Requires PIL. +warpimage.py shows how to use an image as a map background with the +'warpimage' and 'bluemarble' Basemap methods. Requires PIL. garp.py makes a 'World According to Garp' map - an azimuthal equidistant projection centered on a specified location. Straight lines from that Modified: trunk/toolkits/basemap/examples/warpimage.py =================================================================== --- trunk/toolkits/basemap/examples/warpimage.py 2008-02-15 13:45:41 UTC (rev 4971) +++ trunk/toolkits/basemap/examples/warpimage.py 2008-02-15 15:47:46 UTC (rev 4972) @@ -11,7 +11,7 @@ # define orthographic projection centered on North America. m = Basemap(projection='ortho',lat_0=40,lon_0=-100,resolution='l') # display a non-default image. -m.warpimage(file='earth_lights_lrg.jpg') +m.warpimage(image='earth_lights_lrg.jpg') # draw coastlines. m.drawcoastlines(linewidth=0.5,color='0.5') # draw lat/lon grid lines every 30 degrees. @@ -20,16 +20,16 @@ P.title("Lights at Night image warped from 'cyl' to 'ortho' projection",fontsize=12) print 'warp to orthographic map ...' -# redisplay should be fast. +# redisplay (same image specified) should be fast since data is cached. fig = P.figure() -m.warpimage() +m.warpimage(image='earth_lights_lrg.jpg') # create new figure fig=P.figure() # define cylindrical equidistant projection. m = Basemap(projection='cyl',llcrnrlon=-180,llcrnrlat=-90,urcrnrlon=180,urcrnrlat=90,resolution='l') # plot (unwarped) rgba image. -im = m.warpimage() +im = m.bluemarble() # draw coastlines. m.drawcoastlines(linewidth=0.5,color='0.5') # draw lat/lon grid lines. @@ -43,7 +43,7 @@ # define orthographic projection centered on Europe. m = Basemap(projection='ortho',lat_0=40,lon_0=40,resolution='l') # plot warped rgba image. -im = m.warpimage(masked=True) +im = m.bluemarble() # draw coastlines. m.drawcoastlines(linewidth=0.5,color='0.5') # draw lat/lon grid lines every 30 degrees. @@ -58,7 +58,7 @@ m = Basemap(llcrnrlon=-145.5,llcrnrlat=1.,urcrnrlon=-2.566,urcrnrlat=46.352,\ rsphere=(6378137.00,6356752.3142),lat_1=50.,lon_0=-107.,\ resolution='i',area_thresh=1000.,projection='lcc') -im = m.warpimage() +im = m.bluemarble() # draw coastlines. m.drawcoastlines(linewidth=0.5,color='0.5') # draw parallels and meridians. @@ -77,7 +77,7 @@ resolution=None,projection='omerc',\ lon_0=-100,lat_0=15,lon_2=-120,lat_2=65,lon_1=-50,lat_1=-55) # plot warped rgba image. -im = m.warpimage() +im = m.bluemarble() # draw lat/lon grid lines every 20 degrees. m.drawmeridians(numpy.arange(0,360,20),color='0.5') m.drawparallels(numpy.arange(-80,81,20),color='0.5') Modified: trunk/toolkits/basemap/lib/mpl_toolkits/basemap/basemap.py =================================================================== --- trunk/toolkits/basemap/lib/mpl_toolkits/basemap/basemap.py 2008-02-15 13:45:41 UTC (rev 4971) +++ trunk/toolkits/basemap/lib/mpl_toolkits/basemap/basemap.py 2008-02-15 15:47:46 UTC (rev 4972) @@ -2674,8 +2674,18 @@ im = self.imshow(rgba,interpolation='nearest',ax=ax,**kwargs) return im - def warpimage(self,file=None,**kwargs): + def bluemarble(self,ax=None): """ + display blue marble image (from http://visibleearth.nasa.gov) + as map background. + """ + if ax is not None: + self.warpimage(image='bluemarble',ax=ax) + else: + self.warpimage(image='bluemarble') + + def warpimage(self,image="bluemarble",**kwargs): + """ display an image (given by file keyword) as a background. Default (if file not specified) is to display 'blue marble next generation' image from http://visibleearth.nasa.gov/. @@ -2700,25 +2710,31 @@ ax = kwargs.pop('ax') # default image file is blue marble next generation # from NASA (http://visibleearth.nasa.gov). - if file is None: + if image == "bluemarble": file = os.path.join(basemap_datadir,'bmng.jpg') - newfile = False else: + file = image + # if image is same as previous invocation, used cached data. + # if not, regenerate rgba data. + if not hasattr(self,'_bm_file') or self._bm_file != file: newfile = True + else: + newfile = False + self._bm_file = file # read in jpeg image to rgba array of normalized floats. - if not hasattr(self,'bm_rgba') or newfile: - pilImage = Image.open(file) - self.bm_rgba = pil_to_array(pilImage) + if not hasattr(self,'_bm_rgba') or newfile: + pilImage = Image.open(self._bm_file) + self._bm_rgba = pil_to_array(pilImage) # convert to normalized floats. - self.bm_rgba = self.bm_rgba.astype(npy.float32)/255. + self._bm_rgba = self._bm_rgba.astype(npy.float32)/255. # define lat/lon grid that image spans. - nlons = self.bm_rgba.shape[1]; nlats = self.bm_rgba.shape[0] + nlons = self._bm_rgba.shape[1]; nlats = self._bm_rgba.shape[0] delta = 360./float(nlons) - self.bm_lons = npy.arange(-180.+0.5*delta,180.,delta) - self.bm_lats = npy.arange(-90.+0.5*delta,90.,delta) + self._bm_lons = npy.arange(-180.+0.5*delta,180.,delta) + self._bm_lats = npy.arange(-90.+0.5*delta,90.,delta) if self.projection != 'cyl': - if newfile or not hasattr(self,'bm_rgba_warped'): + if newfile or not hasattr(self,'_bm_rgba_warped'): # transform to nx x ny regularly spaced native # projection grid. # nx and ny chosen to have roughly the @@ -2726,15 +2742,15 @@ dx = 2.*npy.pi*self.rmajor/float(nlons) nx = int((self.xmax-self.xmin)/dx)+1 ny = int((self.ymax-self.ymin)/dx)+1 - self.bm_rgba_warped = npy.zeros((ny,nx,4),npy.float64) + self._bm_rgba_warped = npy.zeros((ny,nx,4),npy.float64) # interpolate rgba values from geographic coords (proj='cyl') # to map projection coords. # if masked=True, values outside of # projection limb will be masked. for k in range(4): - self.bm_rgba_warped[:,:,k],x,y = \ - self.transform_scalar(self.bm_rgba[:,:,k],\ - self.bm_lons,self.bm_lats,nx,ny,returnxy=True) + self._bm_rgba_warped[:,:,k],x,y = \ + self.transform_scalar(self._bm_rgba[:,:,k],\ + self._bm_lons,self._bm_lats,nx,ny,returnxy=True) # for ortho,geos mask pixels outside projection limb. if self.projection in ['geos','ortho']: lonsr,latsr = self(x,y,inverse=True) @@ -2742,14 +2758,14 @@ mask[:,:,0] = npy.logical_or(lonsr>1.e20,latsr>1.e30) for k in range(1,4): mask[:,:,k] = mask[:,:,0] - self.bm_rgba_warped = \ - ma.masked_array(self.bm_rgba_warped,mask=mask) + self._bm_rgba_warped = \ + ma.masked_array(self._bm_rgba_warped,mask=mask) # make points outside projection limb transparent. - self.bm_rgba_warped = self.bm_rgba_warped.filled(0.) + self._bm_rgba_warped = self._bm_rgba_warped.filled(0.) # plot warped rgba image. - im = self.imshow(self.bm_rgba_warped,ax=ax) + im = self.imshow(self._bm_rgba_warped,ax=ax) else: - im = self.imshow(self.bm_rgba,ax=ax) + im = self.imshow(self._bm_rgba,ax=ax) return im ### End of Basemap class This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |