GDAL полігонізувати в python, створюючи порожній багатокутник?


12

У мене виникають проблеми з використанням функції Polygonize в python. Приклад кулінарної книги для цього можна знайти тут .

Відповідна частина мого коду:

sourceRaster = gdal.Open('myraster.tif')
band = sourceRaster.GetRasterBand(1)
bandArray = band.ReadAsArray()
outShapefile = "polygonized"
driver = ogr.GetDriverByName("ESRI Shapefile")
if os.path.exists(outShapefile+".shp"):
    driver.DeleteDataSource(outShapefile+".shp")
outDatasource = driver.CreateDataSource(outShapefile+ ".shp")
outLayer = outDatasource.CreateLayer("polygonized", srs=None)
gdal.Polygonize( band, None, outLayer, -1, [], callback=None )
outDatasource.Destroy()
sourceRaster = None

Я знаю, що група має відповідну інформацію, ось фрагмент bandArray:

array([[ 4.,  4.,  3.,  3.,  3.,  2.,  2.,  2.,  2.,  3.,  3.,  3.,  3.,
         3.,  3.,  3.,  3.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,
         4.,  4.,  4.,  4.],

Коли я відкриваю таблицю атрибутів у QGIS, вона порожня: Скріншот QGIS

Редагувати:

Перетворення працює чудово в QGIS за допомогою інструменту Raster -> Conversion -> Polygonize

Скріншот растру, який потрібно полігонізувати:

растр полігонізувати

І скріншот результативного перетворення з інструменту QGIS:

полігонізований растр від інструменту QGIS

Я використовую дистрибутив Enthought у Windows 7, версія GDAL 1.10.0-3

Проблема полягає в тому, що я не можу полігонізувати растр у python за допомогою GDAL та прикладу кулінарної книги, я можу полігонізувати цей самий растр без проблем у графічному інтерфейсі QGIS


Як виглядає ваш растр? Чи дійсно він містить багатокутники? Чи працює, якщо ви замість цього використовуєте gdal_polygonize.py?
BradHards

Редаговано, щоб додати скріншоти робочого процесу в QGIS
camdenl

У чому тут актуальна проблема?
Фестер

Додано конкретну проблему
camdenl

3
У мене була аналогічна проблема (створюється порожній форм-файл), і створення поля не допомогло. Що я робив неправильно, це те, що я не закрив файл форми у своєму коді до виклику полігонізації. Ви закриваєте це у своєму прикладі, я просто розміщую це для довідки інших.
Стефанія

Відповіді:


19

Проблема полягає в тому, що я не створював поля для зберігання растрової смуги. Після перекопування файлу gdal_polygonize.py я зрозумів, що це не робиться автоматично при виклику gdal.Polygonize, який замість цього використовує функцію, знайдену тут .

Ось додатковий крок, необхідний для створення поля та запису смуги в поле:

newField = ogr.FieldDefn('MYFLD', ogr.OFTInteger)
outLayer.CreateField(newField)

Потім ми можемо записати смугу в це поле з індексом 0:

gdal.Polygonize(band, None, outLayer, 0, [], callback=None )

Я також намагаюся використовувати функцію gdal.Polygonize (), щоб отримати свій растр як багатокутник у python. Але в кінці рядка відображається помилка виконання !! чому?
Шиулі Первін

Він добре працює з геореференційними растровими файлами. В результаті виходить занадто багато багатокутників, але мені хочеться лише одного великого багатокутника, що показує контур растра. Хтось має уявлення, як це працює одночасно?
Шиулі Первін

Ще я отримую порожній shapefile, але у мене є рядки у dbf-файлі. Будь ласка, очистіть мене!
Сатья Чандра

У мене просто була ця проблема, але замість того, щоб додавати фіктивне поле, ви можете ввести індекс -1. Дивіться тут, що поле додається, лише якщо індекс> = 0.
jon_two
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.