GDAL RasterizeLayer не спалює всі полігони до растру?


12

Я намагаюся записати файл форми на растр за допомогою 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 ґрунтуються на чомусь іншому, ніж просто наявність чи відсутність багатокутника у визначеній області пікселів?

Файли, які я використовував, можна знайти тут .


Чи можете ви надати посилання на "activity_3.shp" та "AOI_Raster.tif"? Я хочу побачити, чи зможу я відтворити на своєму кінці.
Багатий

Відповіді:


10

Я грав на GDALRasterizeLayers на цьому тижні і маю досить гарне уявлення про те, що він робить. За замовчуванням піксель буде растрований, якщо піксельний центр знаходиться в полігоні. Якщо в центрі нічого немає, воно не буде розсіяно, навіть якщо в межах пікселів є частини багатокутника. Щоб дозволити растеризації працювати так, як ви плануєте, спробуйте варіант "ALL_TOUCHED":

gdal.RasterizeLayer(raster_dataset, [1], shape_layer, None, None, [1], ['ALL_TOUCHED=TRUE'])

ТАК! Мабуть ['ALL_TOUCHED=TRUE'], хоча, на жаль, лише фіксовані багатокутні шари. Мої точкові шари формфайлу все ще залишаються надзвичайно вибагливими і показують один піксель там, де вони розміщені.
Жайворонок

Він закінчує тим, як це . Це в тій же проекції, що й інші, і я сподівався, що це якось магічно виправить це, але це, здається, вперто спалює один піксель там, де він насправді знаходиться.
Жайворонок

Це, безумовно, виглядає гідно, коли температура опіку компенсується dx / 2 та dy / 2. Цікаво, чи зберігається ця помилка з останньою магістраллю.
Майк Т

Це не! Він працює в 1.9.0. Дуже дякую!
Жайворонок

1
Тут також є непоганий рецепт: gis.stackexchange.com/a/16916/9942
j08lue
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.