def display_asc(fname, path='', radians=True, *args, **kwargs): """Displays an ascii file as a pylab image.""" from pylab import imshow lon,lat,data = asc_to_ndarray(fname,path) if radians: lon *= np.pi/180. lat *= np.pi/180. imshow(grid_convert(data,'y-x+','y+x+'),extent=[lon.min(),lon.max(),lat.min(),lat.max()],*args,**kwargs)
def asc_to_locs(fname, path='', thin=1, bufsize=1): """Converts an ascii grid to a list of locations where prediction is desired.""" lon,lat,data = asc_to_ndarray(fname,path) data = grid_convert(data,'y-x+','x+y+') unmasked = buffer(True-data[::thin,::thin].mask, n=bufsize) # unmasked = None lat,lon = [dir[unmasked] for dir in np.meshgrid(lat[::thin],lon[::thin])] if np.any(np.abs(lon)>180.) or np.any(np.abs(lat)>90.): raise ValueError, 'Ascii file %s has incorrect header. Lower left corner is (%f,%f); upper right corner is (%f,%f).'%(fname,lat.min(),lon.min(),lat.max(),lon.max()) # lon,lat = [dir.ravel() for dir in np.meshgrid(lon[::thin],lat[::thin])] return np.vstack((lon,lat)).T*np.pi/180., unmasked
def vec_to_asc(vec, fname, out_fname, unmasked, path=''): """ Converts a vector of outputs on a thin, unmasked, ravelled subset of an ascii grid to an ascii file matching the original grid. """ if np.any(np.isnan(vec)): raise ValueError, 'NaN in vec' header, headlines = get_header(fname,path) lon,lat,data = asc_to_ndarray(fname,path) data = grid_convert(data,'y-x+','x+y+') data_thin = np.zeros(unmasked.shape) data_thin[unmasked] = vec mapgrid = np.array(mgrid[0:data.shape[0],0:data.shape[1]], dtype=float) normalize_for_mapcoords(mapgrid[0], data_thin.shape[0]-1) normalize_for_mapcoords(mapgrid[1], data_thin.shape[1]-1) if data_thin.shape == data.shape: out = np.ma.masked_array(data_thin, mask=data.mask) else: out = np.ma.masked_array(ndimage.map_coordinates(data_thin, mapgrid), mask=data.mask) if np.any(np.isnan(out)): raise ValueError, 'NaN in output' # import pylab as pl # pl.close('all') # pl.figure() # pl.imshow(out, interpolation='nearest', vmin=0.) # pl.colorbar() # pl.title('Resampled') # # pl.figure() # pl.imshow(np.ma.masked_array(data_thin, mask=True-unmasked), interpolation='nearest', vmin=0) # pl.colorbar() # pl.title('Original') out_conv = grid_convert(out,'x+y+','y-x+') header['NODATA_value'] = -9999 exportAscii(out_conv.data,out_fname,header,True-out_conv.mask) return out
def asc_to_vals(fname, path='', thin=1, unmasked=None): """ Converts an ascii grid to a list of values where prediction is desired. If the unmasked argument is provided, the mask of the ascii grid is checked against that mask. """ lon,lat,data = asc_to_ndarray(fname, path) data = grid_convert(data,'y-x+','x+y+') if unmasked is not None: input_unmasked = True-data[::thin,::thin].mask if not (unmasked == input_unmasked).all(): where_mismatch = np.where(input_unmasked != unmasked) import pylab as pl pl.clf() pl.plot(lon[where_mismatch[0]],lat[where_mismatch[1]],'k.',markersize=2) pl.savefig('mismatch.pdf') msg = '%s: mask does not match input mask at the following pixels (in decimal degrees):\n'%fname for i,j in zip(*where_mismatch): msg += "\t%f, %f\n"%(lon[i],lat[j]) msg += 'Image of mismatched points saved as mismatch.pdf' raise ValueError, msg return data.data[unmasked]