Я намагаюся записати файл форми на растр за допомогою RasterizeLayer GDAL. Я заздалегідь створюю растрову область, що цікавить, із іншого файлу форми, враховуючи певний розмір пікселя. Потім AOI служить основою для всіх наступних растризацій (однакова кількість стовпців і рядків, однакова проекція та геотрансформація).
Однак проблема виникає, коли я переходжу записати фігури до їх власного растру на основі однакового розміру пікселів та проекцій. Посилання внизу (не вистачає представника для розміщення зображення), показує оригінальний файл форми із засмагою та темно-рожевий, де RasterizeLayer записав дані. Світло-рожевий - значення nodata для темно-рожевих растрових даних. Сірий - це AOI, на основі якого було завершено запис файлів форми.
Враховуючи розширення полігонів форм-файлів, я б очікував побачити значення запису в двох нижніх кутах, а також два пікселі під даними, які відображаються. Очевидно, однак це не так.
Далі йде код, який я використовував для їх створення. Усі форми були створені за допомогою QGIS, і всі вони були створені в одній проекції. (Слід зазначити, що сітка на зображеному зображенні була лише для того, щоб дати уявлення про розмір пікселя, який я використовував.)
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])
Це помилка в GDAL, чи дані спалювання RasterizeLayer ґрунтуються на чомусь іншому, ніж просто наявність чи відсутність багатокутника у визначеній області пікселів?
Файли, які я використовував, можна знайти тут .