我们从Python开源项目中,提取了以下10个代码示例,用于说明如何使用osgeo.gdal.RasterizeLayer()。
def createRasterFromGeoJson(srcGeoJson, srcRasterFileName, outRasterFileName): NoData_value = 0 source_ds = ogr.Open(srcGeoJson) source_layer = source_ds.GetLayer() srcRaster = gdal.Open(srcRasterFileName) # Create the destination data source target_ds = gdal.GetDriverByName('GTiff').Create(outRasterFileName, srcRaster.RasterXSize, srcRaster.RasterYSize, 1, gdal.GDT_Byte) target_ds.SetGeoTransform(srcRaster.GetGeoTransform()) target_ds.SetProjection(srcRaster.GetProjection()) band = target_ds.GetRasterBand(1) band.SetNoDataValue(NoData_value) # Rasterize gdal.RasterizeLayer(target_ds, [1], source_layer, burn_values=[1]) band.FlushCache()
def create_mask_from_vector(vector_data_path, cols, rows, geo_transform, projection, target_value=1, output_fname='', dataset_format='MEM'): """ Rasterize the given vector (wrapper for gdal.RasterizeLayer). Return a gdal.Dataset. :param vector_data_path: Path to a shapefile :param cols: Number of columns of the result :param rows: Number of rows of the result :param geo_transform: Returned value of gdal.Dataset.GetGeoTransform (coefficients for transforming between pixel/line (P,L) raster space, and projection coordinates (Xp,Yp) space. :param projection: Projection definition string (Returned by gdal.Dataset.GetProjectionRef) :param target_value: Pixel value for the pixels. Must be a valid gdal.GDT_UInt16 value. :param output_fname: If the dataset_format is GeoTIFF, this is the output file name :param dataset_format: The gdal.Dataset driver name. [default: MEM] """ data_source = gdal.OpenEx(vector_data_path, gdal.OF_VECTOR) if data_source is None: report_and_exit("File read failed: %s", vector_data_path) layer = data_source.GetLayer(0) driver = gdal.GetDriverByName(dataset_format) target_ds = driver.Create(output_fname, cols, rows, 1, gdal.GDT_UInt16) target_ds.SetGeoTransform(geo_transform) target_ds.SetProjection(projection) gdal.RasterizeLayer(target_ds, [1], layer, burn_values=[target_value]) return target_ds
def rasterize(self,inRaster,inShape,inField): filename = tempfile.mktemp('.tif') data = gdal.Open(inRaster,gdal.GA_ReadOnly) shp = ogr.Open(inShape) lyr = shp.GetLayer() driver = gdal.GetDriverByName('GTiff') dst_ds = driver.Create(filename,data.RasterXSize,data.RasterYSize, 1,gdal.GDT_Byte) dst_ds.SetGeoTransform(data.GetGeoTransform()) dst_ds.SetProjection(data.GetProjection()) OPTIONS = 'ATTRIBUTE='+inField gdal.RasterizeLayer(dst_ds, [1], lyr, None,options=[OPTIONS]) data,dst_ds,shp,lyr=None,None,None,None return filename
def rasterize_polygons(polygon_shp, template_raster, out_raster, field): """ generate a categorical raster based on polygons :rtype: None :param polygon_shp: input polygon shapefile :param template_raster: raster template for cellsize and extent :param out_raster: output raster file """ # Source: https://pcjericks.github.io/py-gdalogr-cookbook/raster_layers.html gdal.UseExceptions() # Get template raster specs src_ds = gdal.Open(template_raster) if src_ds is None: print 'Unable to open %s' % template_raster sys.exit(1) try: srcband = src_ds.GetRasterBand(1) except RuntimeError, e: print 'No band %i found' % 0 print e sys.exit(1) # Open the data source and read in the extent source_ds = ogr.Open(polygon_shp) source_layer = source_ds.GetLayer() target_ds = gdal.GetDriverByName('GTiff').Create(out_raster, src_ds.RasterXSize, src_ds.RasterYSize, 1, gdal.GDT_Float32) target_ds.SetGeoTransform(src_ds.GetGeoTransform()) target_ds.SetProjection(src_ds.GetProjection()) band = target_ds.GetRasterBand(1) band.SetNoDataValue(srcband.GetNoDataValue()) # Rasterize gdal.RasterizeLayer(target_ds, [1], source_layer, options=["ATTRIBUTE={}".format(field)])
def clipRaster(raster, newRaster, vector): raster = gdal.Open(raster) vect = ogr.Open(vector) lyr = vect.GetLayer() ext = lyr.GetExtent() gTrans = raster.GetGeoTransform() #get the x start of the left most pixel xlP = int((ext[0] - gTrans[0])/gTrans[1])*gTrans[1] - abs(gTrans[0]) #get the x end of the right most pixel xrP = math.ceil((ext[1] - gTrans[0])/gTrans[1])*gTrans[1] - abs(gTrans[0]) #get the y start of the upper most pixel yuP = abs(gTrans[3]) - int((gTrans[3] - ext[3])/gTrans[5])*gTrans[5] #get the y end of the lower most pixel ylP = abs(gTrans[3]) - math.floor((gTrans[3] - ext[2])/gTrans[5])*gTrans[5] gdal.Translate('tmp.tif', raster, projWin = [xlP, yuP, xrP, ylP]) del raster tRas = gdal.Open('tmp.tif') band = tRas.GetRasterBand(1) noDat = band.GetNoDataValue() # store a copy before rasterize fullRas = band.ReadAsArray().astype(numpy.float) gdal.RasterizeLayer(tRas, [1], lyr, None, None, [-9999], ['ALL_TOUCHED=TRUE']) # now tRas is modified finRas = tRas.GetRasterBand(1).ReadAsArray().astype(numpy.float) for i, row in enumerate(finRas): for j, col in enumerate(row): if col == -9999.: finRas[i, j] = fullRas[i, j] else: finRas[i, j] = noDat array2raster(newRaster, 'tmp.tif', finRas, noDat, "float32") os.remove('tmp.tif') del fullRas, finRas, band, tRas # create a reference raster with random values
def makeDensityRaster(speciesOcc, inVector, pixelSize, outRas, noData): srcVector = ogr.Open(inVector) srcLayer = srcVector.GetLayer() srs = srcLayer.GetSpatialRef() # if the layer is not wgs84 if srs.GetAttrValue("AUTHORITY", 1) != '4326': print('Layer projection should be WGS84!') return xMin, xMax, yMin, yMax = srcLayer.GetExtent() # Create the destination data source xRes = int((xMax - xMin) / pixelSize) yRes = int((yMax - yMin) / pixelSize) targetRas = gdal.GetDriverByName('GTiff').Create(outRas, xRes, yRes, 1, 6) # 6 == float targetRas.SetGeoTransform((xMin, pixelSize, 0, yMax, 0, -pixelSize)) band = targetRas.GetRasterBand(1) band.SetNoDataValue(noData) # Rasterize clips the raster band gdal.RasterizeLayer(targetRas, [1], srcLayer, None, None, [0], ['ALL_TOUCHED=TRUE']) #os.remove(outRas) g = band.ReadAsArray() for point in speciesOcc.iterrows(): xi = int((point[1]['x'] - xMin) / pixelSize) yi = int((point[1]['y'] - yMax) / -pixelSize) try: if g[yi,xi] != noData: g[yi,xi] += 1 else: print('point ({}, {}) out of bounds'.format(point[1]['x'], point[1]['y'])) except: print('point ({}, {}) out of bounds'.format(point[1]['x'], point[1]['y'])) pass band.WriteArray(g) targetRasSRS = osr.SpatialReference() targetRasSRS.ImportFromWkt(srs.ExportToWkt()) targetRas.SetProjection(targetRasSRS.ExportToWkt()) band.FlushCache()
def createRaster(outRas, extCells, pixelSize, cellValues = 'lat', dataType = "float32", noData = -9999, inVector = None): NP2GDAL_CONVERSION = { "uint8": 1, "uint16": 2, "int16": 3, "uint32": 4, "int32": 5, "float32": 6, "float64": 7, "complex64": 10, "complex128": 11, } if os.path.exists(outRas): print('Raster file already excists!') return # Create the destination data source xRes = int(numpy.ceil((extCells[2] - extCells[0]) / pixelSize)) yRes = int(numpy.ceil((extCells[3] - extCells[1]) / pixelSize)) targetRas = gdal.GetDriverByName('GTiff').Create(outRas, xRes, yRes, 1, NP2GDAL_CONVERSION[dataType]) targetRas.SetGeoTransform((extCells[0], pixelSize, 0, extCells[3], 0, -pixelSize)) band = targetRas.GetRasterBand(1) band.SetNoDataValue(noData) if inVector != None: srcVector = ogr.Open(inVector) srcLayer = srcVector.GetLayer() srs = srcLayer.GetSpatialRef() # if the layer is not wgs84 if srs.GetAttrValue("AUTHORITY", 1) != '4326': print('Layer projection should be WGS84!') os.remove(outRas) return # Rasterize clips the raster band gdal.RasterizeLayer(targetRas, [1], srcLayer, None, None, [0], ['ALL_TOUCHED=TRUE']) g = band.ReadAsArray() else: g = numpy.zeros((yRes,xRes), eval('numpy.{}'.format(dataType))) #populate matrix with random numbers for i in range(yRes): for j in range(xRes): if g[i,j] != noData: if cellValues == 'lat': g[i,j] = i elif cellValues == 'lon': g[i,j] = j elif cellValues == 'random': g[i,j] = numpy.random.randint(50) band.WriteArray(g) targetRasSRS = osr.SpatialReference() targetRasSRS.ImportFromEPSG(4326) targetRas.SetProjection(targetRasSRS.ExportToWkt()) band.FlushCache() #function to filter raster cells based on the coverage by some vector features
def shp2array(shp_fn, r_ds=None, res=None, extent=None, t_srs=None): """Rasterize input shapefile to match existing raster Dataset (or specified res/extent/t_srs) """ shp_ds = ogr.Open(shp_fn) lyr = shp_ds.GetLayer() #This returns xmin, ymin, xmax, ymax shp_extent = lyr_extent(lyr) shp_srs = lyr.GetSpatialRef() # dst_dt = gdal.GDT_Byte ndv = 0 if r_ds is not None: r_extent = ds_extent(r_ds) res = get_res(r_ds, square=True)[0] if extent is None: extent = r_extent r_srs = get_ds_srs(r_ds) r_geom = ds_geom(r_ds) # dst_ns = r_ds.RasterXSize # dst_nl = r_ds.RasterYSize #Convert raster extent to shp_srs cT = osr.CoordinateTransformation(r_srs, shp_srs) r_geom_reproj = geom_dup(r_geom) r_geom_reproj.Transform(cT) r_geom_reproj.AssignSpatialReference(t_srs) lyr.SetSpatialFilter(r_geom_reproj) #lyr.SetSpatialFilter(ogr.CreateGeometryFromWkt(wkt)) else: #TODO: clean this up if res is None: sys.exit("Must specify input res") if extent is None: print("Using input shp extent") extent = shp_extent if t_srs is None: t_srs = r_srs if not shp_srs.IsSame(t_srs): print("Input shp srs: %s" % shp_srs.ExportToProj4()) print("Specified output srs: %s" % t_srs.ExportToProj4()) out_ds = lyr_proj(lyr, t_srs) outlyr = out_ds.GetLayer() else: outlyr = lyr #outlyr.SetSpatialFilter(r_geom) m_ds = mem_ds(res, extent, srs=t_srs, dtype=gdal.GDT_Byte) b = m_ds.GetRasterBand(1) b.SetNoDataValue(ndv) gdal.RasterizeLayer(m_ds, [1], outlyr, burn_values=[1]) a = b.ReadAsArray() a = ~(a.astype('Bool')) return a
def Vector_to_Raster(Dir, shapefile_name, reference_raster_data_name): """ This function creates a raster of a shp file Keyword arguments: Dir -- str: path to the basin folder shapefile_name -- 'C:/....../.shp' str: Path from the shape file reference_raster_data_name -- 'C:/....../.tif' str: Path to an example tiff file (all arrays will be reprojected to this example) """ from osgeo import gdal, ogr geo, proj, size_X, size_Y=Open_array_info(reference_raster_data_name) x_min = geo[0] x_max = geo[0] + size_X * geo[1] y_min = geo[3] + size_Y * geo[5] y_max = geo[3] pixel_size = geo[1] # Filename of the raster Tiff that will be created Dir_Basin_Shape = os.path.join(Dir,'Basin') if not os.path.exists(Dir_Basin_Shape): os.mkdir(Dir_Basin_Shape) Basename = os.path.basename(shapefile_name) Dir_Raster_end = os.path.join(Dir_Basin_Shape, os.path.splitext(Basename)[0]+'.tif') # Open the data source and read in the extent source_ds = ogr.Open(shapefile_name) source_layer = source_ds.GetLayer() # Create the destination data source x_res = int(round((x_max - x_min) / pixel_size)) y_res = int(round((y_max - y_min) / pixel_size)) # Create tiff file target_ds = gdal.GetDriverByName('GTiff').Create(Dir_Raster_end, x_res, y_res, 1, gdal.GDT_Float32, ['COMPRESS=LZW']) target_ds.SetGeoTransform(geo) srse = osr.SpatialReference() srse.SetWellKnownGeogCS(proj) target_ds.SetProjection(srse.ExportToWkt()) band = target_ds.GetRasterBand(1) target_ds.GetRasterBand(1).SetNoDataValue(-9999) band.Fill(-9999) # Rasterize the shape and save it as band in tiff file gdal.RasterizeLayer(target_ds, [1], source_layer, None, None, [1], ['ALL_TOUCHED=TRUE']) target_ds = None # Open array Raster_Basin = Open_tiff_array(Dir_Raster_end) return(Raster_Basin)
def dump_raster(self, filename, driver='GTiff', attr=None, pixel_size=1., remove=True): """ Output layer to GDAL Rasterfile Parameters ---------- filename : string path to shape-filename driver : string GDAL Raster Driver attr : string attribute to burn into raster pixel_size : float pixel Size in source units remove : bool if True removes existing output file """ layer = self.ds.GetLayer() layer.ResetReading() x_min, x_max, y_min, y_max = layer.GetExtent() cols = int((x_max - x_min) / pixel_size) rows = int((y_max - y_min) / pixel_size) # Todo: at the moment, always writing floats ds_out = io.gdal_create_dataset('MEM', '', cols, rows, 1, gdal_type=gdal.GDT_Float32) ds_out.SetGeoTransform((x_min, pixel_size, 0, y_max, 0, -pixel_size)) proj = layer.GetSpatialRef() if proj is None: proj = self._srs ds_out.SetProjection(proj.ExportToWkt()) band = ds_out.GetRasterBand(1) band.FlushCache() print("Rasterize layers") if attr is not None: gdal.RasterizeLayer(ds_out, [1], layer, burn_values=[0], options=["ATTRIBUTE={0}".format(attr), "ALL_TOUCHED=TRUE"], callback=gdal.TermProgress) else: gdal.RasterizeLayer(ds_out, [1], layer, burn_values=[1], options=["ALL_TOUCHED=TRUE"], callback=gdal.TermProgress) io.write_raster_dataset(filename, ds_out, driver, remove=remove) del ds_out