Saya mencoba untuk membakar shapefile ke raster menggunakan GDAL's RasterizeLayer. Saya pra-membuat area yang menarik raster dari shapefile yang berbeda, mengingat ukuran piksel tertentu. AOI ini kemudian berfungsi sebagai basis untuk semua rasterisasi berikut (jumlah kolom dan baris yang sama, proyeksi dan geotransformasi yang sama).
Masalahnya terjadi, bagaimanapun, ketika saya pergi untuk membakar bentuk ke raster mereka sendiri, berdasarkan pada ukuran dan proyeksi piksel yang sama. Tautan di bawah ini (tidak memiliki cukup perwakilan untuk memposting gambar), menunjukkan shapefile asli di tan, dan merah muda gelap tempat RasterizeLayer membakar data. Merah muda muda adalah nilai nodata untuk data raster merah muda gelap. Abu-abu adalah AOI berdasarkan yang membakar selesai shapefile.
Mengingat luasnya poligon shapefile, saya akan berharap untuk melihat nilai bakar di dua sudut bawah, serta dua piksel di bawah data yang ditampilkan. Namun, jelas bukan itu masalahnya.
Sebagai berikut adalah kode yang saya gunakan untuk menghasilkan ini. Semua bentuk dibuat menggunakan QGIS, dan semuanya dibuat dalam proyeksi yang sama. (Perlu dicatat bahwa kisi-kisi dalam gambar yang ditampilkan hanya untuk memberikan gambaran tentang ukuran piksel yang saya gunakan.)
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])
Apakah ini bug dalam GDAL, atau apakah RasterizeLayer membakar data berdasarkan pada sesuatu selain dari hanya ada atau tidak adanya poligon dalam area piksel yang ditentukan?
File-file yang saya gunakan dapat ditemukan di sini .
sumber
Jawaban:
Saya sudah bermain dengan GDALRasterizeLayers minggu ini dan punya ide bagus tentang apa yang dilakukannya. Secara default, ini akan merasterisasi piksel jika pusat piksel berada dalam poligon. Jika tidak ada apa-apa di tengah, itu tidak akan dirasterisasi, bahkan jika ada bagian dari poligon dalam batas piksel. Untuk memungkinkan rasterisasi bekerja seperti yang Anda inginkan, coba opsi "ALL_TOUCHED":
sumber
['ALL_TOUCHED=TRUE']
, meskipun sayangnya, itu hanya memperbaiki lapisan poligon. Lapisan shapefile titik saya masih super miring, dan muncul satu piksel lebih dari tempat mereka ditempatkan.