def generate_lat_raster(cfg): """Generate latitude raster""" dem_file = cfg.spatials.filldem ds = RasterUtilClass.read_raster(dem_file) src_srs = ds.srs if not src_srs.ExportToProj4(): raise ValueError('The source raster %s has not coordinate, ' 'which is required!' % dem_file) dst_srs = osr_SpatialReference() dst_srs.ImportFromEPSG(4326) # WGS84 # dst_wkt = dst_srs.ExportToWkt() transform = osr_CoordinateTransformation(src_srs, dst_srs) point_ll = ogr_CreateGeometryFromWkt('POINT (%f %f)' % (ds.xMin, ds.yMin)) point_ur = ogr_CreateGeometryFromWkt('POINT (%f %f)' % (ds.xMax, ds.yMax)) point_ll.Transform(transform) point_ur.Transform(transform) lower_lat = point_ll.GetY() up_lat = point_ur.GetY() rows = ds.nRows cols = ds.nCols delta_lat = (up_lat - lower_lat) / float(rows) def cal_cell_lat(row, col): """calculate latitude of cell by row number""" return up_lat - (row + 0.5) * delta_lat data_lat = fromfunction(cal_cell_lat, (rows, cols)) data_lat = where(ds.validZone, data_lat, ds.data) RasterUtilClass.write_gtiff_file(cfg.spatials.cell_lat, rows, cols, data_lat, ds.geotrans, ds.srs, ds.noDataValue, GDT_Float32)
def read_raster(raster_file): """Read raster by GDAL. Args: raster_file: raster file path. Returns: Raster object. """ ds = gdal_Open(raster_file) band = ds.GetRasterBand(1) data = band.ReadAsArray() xsize = band.XSize ysize = band.YSize nodata_value = band.GetNoDataValue() geotrans = ds.GetGeoTransform() dttype = band.DataType srs = osr_SpatialReference() srs.ImportFromWkt(ds.GetProjection()) # print(srs.ExportToProj4()) if nodata_value is None: nodata_value = DEFAULT_NODATA band = None ds = None return Raster(ysize, xsize, data, nodata_value, geotrans, srs, dttype)
def read_raster(raster_file): """Read raster by GDAL. Args: raster_file: raster file path. Returns: Raster object. """ ds = gdal_Open(raster_file) band = ds.GetRasterBand(1) data = band.ReadAsArray() xsize = band.XSize ysize = band.YSize nodata_value = band.GetNoDataValue() geotrans = ds.GetGeoTransform() dttype = band.DataType srs = osr_SpatialReference() srs.ImportFromWkt(ds.GetProjection()) # print(srs.ExportToProj4()) if nodata_value is None: nodata_value = DEFAULT_NODATA band = None ds = None return Raster(ysize, xsize, data, nodata_value, geotrans, srs, dttype)
def generate_lat_raster(cfg): """Generate latitude raster""" dem_file = cfg.spatials.filldem ds = RasterUtilClass.read_raster(dem_file) src_srs = ds.srs if not src_srs.ExportToProj4(): raise ValueError('The source raster %s has not coordinate, ' 'which is required!' % dem_file) dst_srs = osr_SpatialReference() dst_srs.ImportFromEPSG(4326) # WGS84 # dst_wkt = dst_srs.ExportToWkt() transform = osr_CoordinateTransformation(src_srs, dst_srs) point_ll = ogr_CreateGeometryFromWkt('POINT (%f %f)' % (ds.xMin, ds.yMin)) point_ur = ogr_CreateGeometryFromWkt('POINT (%f %f)' % (ds.xMax, ds.yMax)) point_ll.Transform(transform) point_ur.Transform(transform) lower_lat = point_ll.GetY() up_lat = point_ur.GetY() rows = ds.nRows cols = ds.nCols delta_lat = (up_lat - lower_lat) / float(rows) def cal_cell_lat(row, col): """calculate latitude of cell by row number""" return up_lat - (row + 0.5) * delta_lat data_lat = fromfunction(cal_cell_lat, (rows, cols)) data_lat = where(ds.validZone, data_lat, ds.data) RasterUtilClass.write_gtiff_file(cfg.spatials.cell_lat, rows, cols, data_lat, ds.geotrans, ds.srs, ds.noDataValue, GDT_Float32)
def raster2shp(rasterfile, vectorshp, layername=None, fieldname=None, band_num=1, mask='default'): """Convert raster to ESRI shapefile""" FileClass.remove_files(vectorshp) FileClass.check_file_exists(rasterfile) # this allows GDAL to throw Python Exceptions gdal.UseExceptions() src_ds = gdal.Open(rasterfile) if src_ds is None: print('Unable to open %s' % rasterfile) sys.exit(1) try: srcband = src_ds.GetRasterBand(band_num) except RuntimeError as e: # for example, try GetRasterBand(10) print('Band ( %i ) not found, %s' % (band_num, e)) sys.exit(1) if mask == 'default': maskband = srcband.GetMaskBand() elif mask is None or mask.upper() == 'NONE': maskband = None else: mask_ds = gdal.Open(mask) maskband = mask_ds.GetRasterBand(1) # create output datasource if layername is None: layername = FileClass.get_core_name_without_suffix(rasterfile) drv = ogr_GetDriverByName(str('ESRI Shapefile')) dst_ds = drv.CreateDataSource(vectorshp) srs = None if src_ds.GetProjection() != '': srs = osr_SpatialReference() srs.ImportFromWkt(src_ds.GetProjection()) dst_layer = dst_ds.CreateLayer(str(layername), srs=srs) if fieldname is None: fieldname = layername.upper() fd = ogr_FieldDefn(str(fieldname), OFTInteger) dst_layer.CreateField(fd) dst_field = 0 result = gdal.Polygonize(srcband, maskband, dst_layer, dst_field, ['8CONNECTED=8'], callback=None) return result
def raster2shp(rasterfile, vectorshp, layername=None, fieldname=None, band_num=1, mask='default'): """Convert raster to ESRI shapefile""" FileClass.remove_files(vectorshp) FileClass.check_file_exists(rasterfile) # this allows GDAL to throw Python Exceptions gdal.UseExceptions() src_ds = gdal.Open(rasterfile) if src_ds is None: print('Unable to open %s' % rasterfile) sys.exit(1) try: srcband = src_ds.GetRasterBand(band_num) except RuntimeError as e: # for example, try GetRasterBand(10) print('Band ( %i ) not found, %s' % (band_num, e)) sys.exit(1) if mask == 'default': maskband = srcband.GetMaskBand() elif mask is None or mask.upper() == 'NONE': maskband = None else: mask_ds = gdal.Open(mask) maskband = mask_ds.GetRasterBand(1) # create output datasource if layername is None: layername = FileClass.get_core_name_without_suffix(rasterfile) drv = ogr_GetDriverByName(str('ESRI Shapefile')) dst_ds = drv.CreateDataSource(vectorshp) srs = None if src_ds.GetProjection() != '': srs = osr_SpatialReference() srs.ImportFromWkt(src_ds.GetProjection()) dst_layer = dst_ds.CreateLayer(str(layername), srs=srs) if fieldname is None: fieldname = layername.upper() fd = ogr_FieldDefn(str(fieldname), OFTInteger) dst_layer.CreateField(fd) dst_field = 0 result = gdal.Polygonize(srcband, maskband, dst_layer, dst_field, ['8CONNECTED=8'], callback=None) return result