Apologies, I see I didn't need to change the xin, yin variables in the interp function. I have it working now, but I still don't quite have the plotting correct... be back with a report. -john
On Mon, Oct 25, 2010 at 9:27 PM, John <washa...@gmail.com> wrote: > Jeff, thanks for the answer. Unfortunately I have a problem due to the > 'polar' nature of the grid, the xin, yin values are not increasing. I > tried both passing lat and lon grids or flattened vectors of the > original data, but neither works. You can see my method here, which is > a new method of my NSIDC class: > > def regrid2globe(self,dres=0.5): > """ use parameters from > http://nsidc.org/data/polar_stereo/ps_grids.html > to regrid the data onto a lat/lon grid with degree resolution of dres > """ > a = 6378.273e3 > ec = 0.081816153 > b = a*np.sqrt(1.-ec**2) > > map = Basemap(projection='stere',lat_0=90,lon_0=315,lat_ts=70,\ > llcrnrlat=33.92,llcrnrlon=279.96,\ > urcrnrlon=102.34,urcrnrlat=31.37,\ > rsphere=(a,b)) > # Basemap coordinate system starts with 0,0 at lower left corner > nx = self.lons.shape[0] > ny = self.lats.shape[0] > xin = np.linspace(map.xmin,map.xmax,nx) # nx is the number of > x points on the grid > yin = np.linspace(map.ymin,map.ymax,ny) # ny in the number of > y points on the grid > # 0.5 degree grid > lons = np.arange(-180,180.01,0.5) > lats = np.arange(-90,90.01,0.5) > lons, lats = np.meshgrid(lons,lats) > xout,yout = map(lons, lats) > # datain is the data on the nx,ny stereographic grid. > # masked=True returns masked values for points outside projection grid > dataout = interp(self.ice.flatten(), self.lons.flatten(), > self.lats.flatten(),\ > xout, yout,masked=True) > > self.regridded = dataout > > Thank you, > john > > On Mon, Oct 25, 2010 at 1:51 PM, Jeff Whitaker <jsw...@fastmail.fm> wrote: >> On 10/25/10 2:27 AM, John wrote: >>> >>> Hello, >>> >>> I'm trying to take a npstereographic grid of points and reproject it >>> so that I can save out a file in regular 0.5 degree lat lon grid >>> coordinates. The description of the grid points in the current >>> projection is here: >>> http://nsidc.org/data/docs/daac/nsidc0051_gsfc_seaice.gd.html >>> >>> I've written the following class for handling the data: >>> >>> class NSIDC(object): >>> """ Maybe a set of functions for NSIDC data """ >>> >>> def __init__(self,infile): >>> self.infile = infile >>> self.data = self.readseaice() >>> >>> def readseaice(self): >>> """ reads the binary sea ice data and returns >>> the header and the data >>> see: >>> http://nsidc.org/data/docs/daac/nsidc0051_gsfc_seaice.gd.html >>> """ >>> #use the BinaryFile class to access data >>> from francesc import BinaryFile >>> raw = BinaryFile(self.infile,'r') >>> >>> #start reading header values >>> """ >>> File Header >>> Bytes Description >>> 1-6 Missing data integer value >>> 7-12 Number of columns in polar stereographic grid >>> 13-18 Number of rows in polar stereographic grid >>> 19-24 Unused/internal >>> 25-30 Latitude enclosed by pointslar stereographic grid >>> 31-36 Greenwich orientation of polar stereographicic grid >>> 37-42 Unused/internal >>> 43-48 J-coordinate of the grid intersection at the pole >>> 49-54 I-coordinate of the grid intersection at the pole >>> 55-60 Five-character instrument descriptor (SMMR, SSM/I) >>> 61-66 Two descriptionriptors of two characters each that >>> describe the data; >>> for example, 07 cn = Nimbus-7 SMMR ice concentration >>> 67-72 Starting Julian day of grid dayta >>> 73-78 Starting hour of grid data (if available) >>> 79-84 Starting minute of grid data (if available) >>> 85-90 Ending Julian day of grid data >>> 91-916 Ending hour of grid data (if available) >>> 97-102 Ending minute of grid data (if available) >>> 103-108 Year of grid data >>> 109-114 Julian day of gridarea(xld data >>> 115-120 Three-digit channel descriptor (000 for ice >>> concentrationns) >>> 121-126 Integer scaling factor >>> 127-150 24-character file name >>> 151-24 Unused3080-character image title >>> 231-300 70-character data information (creation date, data >>> source, etc.) >>> """ >>> hdr = raw.read(np.dtype('a1'),(300)) >>> header = {} >>> header['baddata'] = int(''.join(hdr[:6])) >>> header['COLS'] = int(''.join(hdr[6:12])) >>> header['ROWS'] = int(''.join(hdr[12:18])) >>> header['lat'] = float(''.join(hdr[24:30])) >>> header['lon0'] = float(''.join(hdr[30:36])) >>> header['jcoord'] = float(''.join(hdr[42:48])) >>> header['icoord'] = float(''.join(hdr[48:54])) >>> header['instrument'] = ''.join(hdr[54:60]) >>> header['descr'] = ''.join(hdr[60:66]) >>> header['startjulday'] = int(''.join(hdr[66:72])) >>> header['starthour'] = int(''.join(hdr[72:78])) >>> header['startminute'] = int(''.join(hdr[78:84])) >>> header['endjulday'] = int(''.join(hdr[84:90])) >>> header['endhour'] = int(''.join(hdr[90:96])) >>> header['endminute'] = int(''.join(hdr[96:102])) >>> header['year'] = int(''.join(hdr[102:108])) >>> header['julday'] = int(''.join(hdr[108:114])) >>> header['chan'] = int(''.join(hdr[114:120])) >>> header['scale'] = int(''.join(hdr[120:126])) >>> header['filename'] = ''.join(hdr[126:150]) >>> header['imagetitle'] = ''.join(hdr[150:230]) >>> header['datainfo'] = ''.join(hdr[230:300]) >>> >>> #pdb.set_trace() >>> >>> >>> seaiceconc = raw.read(np.uint8,(header['COLS'],header['ROWS'])) >>> >>> return {'header':header,'data':seaiceconc} >>> >>> def conv2percentage(self): >>> self.seaicepercentage = self.data['data']/2.5 >>> >>> def classify(self): >>> """ classify the data into land, coast, missing, hole """ >>> data = self.data['data'] >>> self.header = self.data['header'] >>> >>> for a in >>> [('land',254),('coast',253),('hole',251),('missing',255)]: >>> zeros = np.zeros(data.shape) >>> zeros[np.where(data==a[1])] = 1 >>> exec('self.%s = zeros' % a[0]) >>> >>> #filter data >>> data[data>250] = 0 >>> self.ice = data >>> >>> def geocoordinate(self): >>> """ use NSIDC grid files to assign lats/lons to grid. >>> see: >>> http://nsidc.org/data/polar_stereo/tools_geo_pixel.html#psn25_pss25_lats >>> """ >>> >>> try: >>> ROWS = self.header['ROWS'] >>> COLS = self.header['COLS'] >>> except: >>> raise AttributeError('object needs to have header, \ >>> did you run self.classify?') >>> >>> datadir = 'nsidc0081_ssmi_nrt_seaice' >>> >>> lonfile = os.path.join(datadir,'psn25lons_v2.dat') >>> lons = np.fromfile(lonfile,dtype=np.dtype('i4'))/100000. >>> self.lons = lons.reshape(COLS,ROWS) >>> >>> latfile = os.path.join(datadir,'psn25lats_v2.dat') >>> lats = np.fromfile(latfile,dtype=np.dtype('i4'))/100000. >>> self.lats = lats.reshape(COLS,ROWS) >>> >>> areafile = os.path.join(datadir,'psn25area_v2.dat') >>> area = np.fromfile(latfile,dtype=np.dtype('i4'))/100000. >>> self.area = area.reshape(COLS,ROWS) >>> >>> >>> >>> >>> Once I have the data in python, I've done some plotting with some >>> weird results, I'm clearly not doing something correctly. I'd like to >>> know the best way to do this, and I suspect it would require GDAL. >>> Here's what I'm trying to do: >>> >>> from NSIDC import NSIDC >>> import numpy as np >>> from matplotlib import mlab, pyplot as plt >>> >>> #load the data >>> d = jfb.NSIDC('nsidc0081_ssmi_nrt_seaice/nt_20080827_f17_nrt_n.bin') >>> d.classify() >>> d.geocoordinate() >>> >>> x = d.lons.ravel(); y = d.lats.ravel(); z = d.ice.ravel() >>> >>> #create a regular lat/lon grid 0.5 degrees >>> dres=0.5 >>> reg_lon = np.arange(-180,180,dres,'f') >>> reg_lat=np.arange(-90,90,dres,'f') >>> >>> #regrid the data into the regular grid >>> Z = mlab.griddata(x,y,z,reg_lon,reg_lat) >>> >>> >>> >>> My result is confusing: >>> plotting the data as imshow, demonstrates I'm loading it okay: >>> plt.imshow(d.ice) >>> yields: >>> http://picasaweb.google.com/washakie/Temp#5531888474069952818 >>> >>> however, if I try to plot the reprojected grid on to a map, I get >>> something strange: >>> http://picasaweb.google.com/washakie/Temp#5531888480458500386 >>> >>> But if I use the same map object to plot my original data using the >>> scatter function: >>> m.scatter(x,y,c=z) >>> I also get a strange result, so possibly I'm not reading the grid in >>> properly, but it seems strange, since all the 'points' are where they >>> are supposed to be, but I would not expect this color pattern: >>> http://picasaweb.google.com/washakie/Temp#5531895787146118914 >>> >>> >>> Is anyone willing to write a quick tutorial or script on how this >>> would be achieved properly in gdal or basemap? >>> >>> Thanks, >>> john >>> >>> >> John: Basemap provides an 'interp' function that can be used to reproject >> data from one projection grid to another using bilinear interpolation. >> >> http://matplotlib.sourceforge.net/basemap/doc/html/api/basemap_api.html#mpl_toolkits.basemap.interp >> >> griddata is really for unstructured, scattered data. Since you have a >> regular grid, interp should be much faster. In your case, this should do it >> (untested). >> >> import numpy as np >> from mpl_toolkits.basemap import Basemap, interp >> # from http://nsidc.org/data/polar_stereo/ps_grids.html >> a = 6378.273e3 >> ec = 0.081816153 >> b = a*np.sqrt(1.-ec**2) >> map =\ >> Basemap(projection='stere',lat_0=90,lon_0=315,lat_ts=70, >> llcrnrlat=33.92,llcrnrlon=279.96,urcrnrlon=102.34,urcrnrlat=31.37, >> rsphere=(a,b)) >> # Basemap coordinate system starts with 0,0 at lower left corner >> xin = np.linspace(map.xmin,map.xmax,nx) # nx is the number of x points on >> the grid >> yin = np.linspace(map.ymin,map.ymax,ny) # ny in the number of y points on >> the grid >> # 0.5 degree grid >> lons = np.arange(-180,180.01,0.5) >> lats = np.arange(-90,90.01,0.5) >> lons, lats = np.meshgrid(lons,lats) >> xout,yout = map(lons, lats) >> # datain is the data on the nx,ny stereographic grid. >> # masked=True returns masked values for points outside projection grid >> dataout = interp(datain, xin, yin, xout, yout,masked=True) >> >> -Jeff >> >> >> >> > > > > -- > Configuration > `````````````````````````` > Plone 2.5.3-final, > CMF-1.6.4, > Zope (Zope 2.9.7-final, python 2.4.4, linux2), > Python 2.6 > PIL 1.1.6 > Mailman 2.1.9 > Postfix 2.4.5 > Procmail v3.22 2001/09/10 > -- Configuration `````````````````````````` Plone 2.5.3-final, CMF-1.6.4, Zope (Zope 2.9.7-final, python 2.4.4, linux2), Python 2.6 PIL 1.1.6 Mailman 2.1.9 Postfix 2.4.5 Procmail v3.22 2001/09/10 ------------------------------------------------------------------------------ Nokia and AT&T present the 2010 Calling All Innovators-North America contest Create new apps & games for the Nokia N8 for consumers in U.S. and Canada $10 million total in prizes - $4M cash, 500 devices, nearly $6M in marketing Develop with Nokia Qt SDK, Web Runtime, or Java and Publish to Ovi Store http://p.sf.net/sfu/nokia-dev2dev _______________________________________________ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users