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 tool

Снимок экрана растрового полигона:

растр для полигонизации

И скриншот результирующего преобразования из инструмента QGIS:

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

Я использую дистрибутив Enthought на Windows 7, GDAL версии 1.10.0-3

Проблема в том, что я не могу полигонизировать растр в python, используя GDAL и пример поваренной книги, я могу полигонизировать этот же растр без проблем в QGIS GUI

camdenl
источник
Как выглядит ваш растр? Это действительно содержит многоугольники? Это работает, если вы используете вместо этого gdal_polygonize.py?
BradHards
Отредактировано для добавления скриншотов рабочего процесса в QGIS
camdenl
В чем здесь проблема?
Фезтер
Добавлена ​​конкретная проблема
camdenl
3
У меня была похожая проблема (создавался пустой шейп-файл), и создание поля не помогло. Что я делал неправильно, так это то, что я не закрывал шейп-файл в своем коде до вызова polygonize. Вы закрываете это в своем примере, я просто публикую это для справки других.
Стефани,

Ответы:

19

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

Вот дополнительный шаг, необходимый для создания поля и записи полосы в поле:

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

Затем мы можем записать группу в это поле с индексом 0:

gdal.Polygonize(band, None, outLayer, 0, [], callback=None )
camdenl
источник
Я также пытаюсь использовать функцию gdal.Polygonize (), чтобы получить мой растр как многоугольник в python. Но в конце строки он показывает ошибку времени выполнения !! Зачем?
Шиули Первин
Хорошо работает с растровыми файлами с географической привязкой. В результате получается слишком много полигонов, но мне нужен только один большой полигон, показывающий контур растра. У кого-нибудь есть идеи, как это работает одновременно?
Шиули Первин
Тем не менее я получаю пустой шейп-файл, но у меня есть строки в файле DBF. Пожалуйста, уточните меня!
Сатья Чандра
У меня просто была эта проблема, но вместо добавления фиктивного поля вы можете ввести индекс -1. Смотрите здесь, это поле добавляется только если index> = 0.
jon_two