def drawtopography(self,resolution=5000,cmap=matplotlib.cm.gray,vmin=None,vmax=None,**kwargs): #try: # url = '/cmld/data5/hinest/Data/SRTM/SoCal.h5' # etopodata = Dataset(url) #except RuntimeError: url = 'http://ferret.pmel.noaa.gov/thredds/dodsC/data/PMEL/etopo1.nc' etopodata = Dataset(url) lons = etopodata.variables['x'][:] lats = etopodata.variables['y'][:] # This leads to branch cut issues if dealing with datasets that go # over the prime meridian xidx = (lons > self.lonmin) & (lons < self.lonmax) yidx = (lats > self.latmin) & (lats < self.latmax) lons = lons[xidx] lats = lats[yidx] topoin = etopodata.variables['rose'][yidx,xidx] topoin = np.ma.masked_array(topoin,np.isnan(topoin)) topoin.data[topoin.mask] = 0.0 nx = int((self.xmax-self.xmin)/resolution)+1 ny = int((self.ymax-self.ymin)/resolution)+1 topodat = self.transform_scalar(topoin,lons,lats,nx,ny,order=3,masked=True) ls = LightSource(azdeg = 270,altdeg = 45) #rgb = ls.shade(topodat,cmap) rgb = set_shade(topodat,cmap=cmap,scale=10.0,azdeg=300.0,altdeg=45.0,vmin=vmin,vmax=vmax) self.imshow(rgb,**kwargs)
def drawtopography(self,resolution=200,cmap=matplotlib.cm.gray,vmin=None,vmax=None,**kwargs): try: etopodata = h5py.File('/cmld/data5/hinest/Projects/MyPlot/data/ETOPO1.h5') except IOError: print('cannot open ETOPO1') return lons = etopodata['longitude'][...] lats = etopodata['latitude'][...] lonmin = self.lonmin lonmax = self.lonmax # add a 10% buffer lonmin -= 0.1*(lonmax - lonmin) lonmax += 0.1*(lonmax - lonmin) latmin = self.latmin latmax = self.latmax latmin -= 0.1*(latmax - latmin) latmax += 0.1*(latmax - latmin) xidx = (lons > lonmin) & (lons < lonmax) xidx = xidx.nonzero()[0] xstart = xidx[0] xend = xidx[-1] yidx = (lats > latmin) & (lats < latmax) yidx = yidx.nonzero()[0] ystart = yidx[0] yend = yidx[-1] lons = lons[xstart:xend] lats = lats[ystart:yend] data = etopodata['elevation'][ystart:yend,xstart:xend] etopodata.close() nx = resolution#int((self.xmax-self.xmin)/resolution)+1 ny = resolution#int((self.ymax-self.ymin)/resolution)+1 topodat = self.transform_scalar(data,lons,lats,nx,ny,order=3,masked=True) rgb = set_shade(topodat,cmap=cmap,scale=10.0,azdeg=300.0,altdeg=45.0,vmin=vmin,vmax=vmax) self.imshow(rgb,**kwargs)
def drawscalar(self,val,lonlat,topography=False,resolution=200,penalty=0.0,cmap=matplotlib.cm.seismic,**kwargs): lonmin = self.lonmin lonmax = self.lonmax # add a 10% buffer lonmin -= 0.1*(lonmax - lonmin) lonmax += 0.1*(lonmax - lonmin) latmin = self.latmin latmax = self.latmax latmin -= 0.1*(latmax - latmin) latmax += 0.1*(latmax - latmin) # form data interpolant A = RBFInterpolant(lonlat,val,order=0,basis=rbf.basis.phs1,penalty=penalty) nx = resolution#int((self.xmax-self.xmin)/resolution) ny = resolution#int((self.ymax-self.ymin)/resolution) lons = np.linspace(lonmin,lonmax,nx) lats = np.linspace(latmin,latmax,ny) latitp,lonitp = np.meshgrid(lats,lons) latitp = latitp.flatten() lonitp = lonitp.flatten() positp = np.array([lonitp,latitp]).T valitp = A(positp) valitp = np.reshape(valitp,(nx,ny)).T data = self.transform_scalar(valitp,lons,lats,nx,ny,order=3) # form topography based intensity if topography is True if topography: try: etopodata = h5py.File('/cmld/data5/hinest/Projects/MyPlot/data/ETOPO1.h5') except IOError: print('cannot open ETOPO1') return lons = etopodata['longitude'][...] lats = etopodata['latitude'][...] xidx = (lons > lonmin) & (lons < lonmax) xidx = xidx.nonzero()[0] xstart = xidx[0] xend = xidx[-1] yidx = (lats > latmin) & (lats < latmax) yidx = yidx.nonzero()[0] ystart = yidx[0] yend = yidx[-1] lons = lons[xstart:xend] lats = lats[ystart:yend] topo_data = etopodata['elevation'][ystart:yend,xstart:xend] lonsgrid,latsgrid = np.meshgrid(lons,lats) topo_data = self.transform_scalar(topo_data,lons,lats,nx,ny,order=3,masked=True) intensity = hillshade(topo_data,scale=10.0,azdeg=300.0,altdeg=45.0) etopodata.close() rgb = set_shade(data,intensity=intensity,cmap=cmap) return self.imshow(rgb,cmap=cmap,**kwargs) else: return self.imshow(data,cmap=cmap,**kwargs)