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()
python类RasterizeLayer()的实例源码
classify.py 文件源码
项目:python_scripting_for_spatial_data_processing
作者: upsdeepak
项目源码
文件源码
阅读 27
收藏 0
点赞 0
评论 0
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