Sto cercando di masterizzare uno shapefile su un raster usando RasterizeLayer di GDAL. Pre-creo un'area di interesse raster da un file di forma diverso, data una dimensione pixel specifica. Questo AOI funge quindi da base per tutte le successive rasterizzazioni (stesso numero di colonne e file, stessa proiezione e geotrasformazione).
Il problema si verifica, tuttavia, quando vado a masterizzare le forme sul loro raster, in base alle stesse dimensioni dei pixel e alle proiezioni. Il link in basso (non ha abbastanza rappresentante per pubblicare l'immagine), mostra lo shapefile originale in marrone chiaro e il rosa scuro dove RasterizeLayer ha masterizzato i dati. Il rosa chiaro è valori nodati per i dati raster rosa scuro. Il grigio è l'AOI in base al quale è stata completata l'ustione dello shapefile.
Date le estensioni dei poligoni dello shapefile, mi aspetterei di vedere i valori di burn nei due angoli inferiori, così come i due pixel sotto i dati che mostrano. Ovviamente, tuttavia, non è così.
Di seguito è riportato il codice che ho usato per generare questi. Tutte le forme sono state create usando QGIS e sono state create nella stessa proiezione. (Va notato che la griglia nell'immagine mostrata era solo per dare un'idea della dimensione dei pixel che stavo usando.)
from osgeo import ogr
from osgeo import gdal
aoi_uri = 'AOI_Raster.tif'
aoi_raster = gdal.Open(aoi_uri)
def new_raster_from_base(base, outputURI, format, nodata, datatype):
cols = base.RasterXSize
rows = base.RasterYSize
projection = base.GetProjection()
geotransform = base.GetGeoTransform()
bands = base.RasterCount
driver = gdal.GetDriverByName(format)
new_raster = driver.Create(str(outputURI), cols, rows, bands, datatype)
new_raster.SetProjection(projection)
new_raster.SetGeoTransform(geotransform)
for i in range(bands):
new_raster.GetRasterBand(i + 1).SetNoDataValue(nodata)
new_raster.GetRasterBand(i + 1).Fill(nodata)
return new_raster
shape_uri = 'activity_3.shp'
shape_datasource = ogr.Open(shape_uri)
shape_layer = shape_datasource.GetLayer()
raster_out = 'new_raster.tif'
raster_dataset = new_raster_from_base(aoi_raster, raster_out, 'GTiff',
-1, gdal.GDT_Int32)
band = raster_dataset.GetRasterBand(1)
nodata = band.GetNoDataValue()
band.Fill(nodata)
gdal.RasterizeLayer(raster_dataset, [1], shape_layer, burn_values=[1])
È un bug in GDAL o RasterizeLayer sta bruciando dati basati su qualcosa di diverso dalla semplice presenza o mancanza di un poligono all'interno di un'area pixel specificata?
I file che stavo usando possono essere trovati qui .