def __init__(self, topaz, wepp, data, watershed): self.topaz = topaz self.wepp = int(wepp) self.data = data self.n = len(data) # will define these later # a list of indices in projected, georeferenced # raster that coorespond to the hillslope self.indices = self.findProjectionIndices() self.wat = None if watershed.hdf5 is not None: if 'wat' in watershed.hdf5.keys(): watershed.hdf5['wat'] self.wat = Wat() self.wat.read_hdf5(self.wepp, watershed.hdf5['wat'][str(self.wepp)])
class Subcatchment: """ Represents a Subcatchment """ def __init__(self, topaz, wepp, data, watershed): self.topaz = topaz self.wepp = int(wepp) self.data = data self.n = len(data) # will define these later # a list of indices in projected, georeferenced # raster that coorespond to the hillslope self.indices = self.findProjectionIndices() self.wat = None if watershed.hdf5 is not None: if 'wat' in watershed.hdf5.keys(): watershed.hdf5['wat'] self.wat = Wat() self.wat.read_hdf5(self.wepp, watershed.hdf5['wat'][str(self.wepp)]) def __str__(self): return 'dn: %i\nlen(data): %s'%(self.dn, self.n) def centroid(self): centroid = Polygon(self.data).centroid return (centroid.x, centroid.y) def findProjectionIndices(self): global georefTiff # This function is based loosely off of Frank's tests for # gdal.RasterizeLayer. # https://svn.osgeo.org/gdal/trunk/autotest/alg/rasterize.py # open the reference # we use this to find the size, projection, # spatial reference, and geotransform to # project the subcatchment to ds = gdal.Open(georefTiff) pszProjection = ds.GetProjectionRef() if pszProjection is not None: srs = osr.SpatialReference() if srs.ImportFromWkt(pszProjection ) == gdal.CE_None: pszPrettyWkt = srs.ExportToPrettyWkt(False) geoTransform = ds.GetGeoTransform() # initialize a new raster in memory driver = gdal.GetDriverByName('MEM') target_ds = driver.Create('', ds.RasterXSize, ds.RasterYSize, 1, gdal.GDT_Byte ) target_ds.SetGeoTransform(geoTransform) target_ds.SetProjection(pszProjection) # close the reference ds = None # Create a memory layer to rasterize from. rast_ogr_ds = ogr.GetDriverByName('Memory') \ .CreateDataSource( 'wrk' ) rast_mem_lyr = rast_ogr_ds.CreateLayer( 'poly', srs=srs ) # Add a polygon. coords = ','.join(['%f %f'%(lng,lat) for lng,lat in self.data]) wkt_geom = 'POLYGON((%s))'%coords feat = ogr.Feature( rast_mem_lyr.GetLayerDefn() ) feat.SetGeometryDirectly( ogr.Geometry(wkt = wkt_geom) ) rast_mem_lyr.CreateFeature( feat ) # Run the rasterization algorithm err = gdal.RasterizeLayer( target_ds, [1], rast_mem_lyr, burn_values = [255] ) rast_ogr_ds = None rast_mem_lyr = None band = target_ds.GetRasterBand(1) data = band.ReadAsArray() # find nonzero indices and return return np.nonzero(data)