Exemplo n.º 1
0
    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)])
Exemplo n.º 2
0
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)