GDAL poligonaliza em python criando polígono em branco?


12

Estou tendo problemas para usar a função Polygonize em python. O exemplo do livro de receitas para isso pode ser encontrado aqui .

A parte relevante do meu código é:

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

Eu sei que a banda tem informações relevantes, aqui está um trecho de 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.],

Quando abro a tabela de atributos no QGIS, ela está vazia: Captura de tela QGIS

Editar:

A conversão funciona bem no QGIS usando a ferramenta Raster -> Conversion -> Polygonize

Captura de tela da varredura a ser poligonizada:

varredura para poligonalizar

E captura de tela da conversão resultante da ferramenta QGIS:

varredura poligonalizada da ferramenta QGIS

Estou usando a distribuição Enthought no Windows 7, GDAL versão 1.10.0-3

O problema é que não consigo poligonizar uma varredura em python usando GDAL e o exemplo do livro de receitas, posso poligonizar essa mesma varredura sem nenhum problema na GUI do QGIS


Como é a sua varredura? Realmente contém polígonos? Funciona se você usar gdal_polygonize.py?
— BradHards

Editado para adicionar capturas de tela do processo de trabalho no QGIS
— camdenl

Qual é o problema real aqui?
— Fezter

Problema específico adicionado
— camdenl

3
Eu tive um problema semelhante (arquivo shapefile em branco sendo criado) e a criação do campo não ajudou. O que eu estava fazendo de errado era que não havia fechado o shapefile no meu código antes de chamar polygonize. Você fecha no seu exemplo, estou postando isso apenas para referência de outras pessoas.
— Stephanie

Respostas:


19

O problema é que eu não estava criando um campo para armazenar a banda raster. Depois de pesquisar no arquivo gdal_polygonize.py, percebi que isso não é feito automaticamente ao chamar gdal.Polygonize, que usa a função encontrada aqui .

Aqui está a etapa extra necessária para criar um campo e gravar uma banda no campo:

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

Podemos então gravar a banda nesse campo, com um índice de 0:

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

Também estou tentando usar a função gdal.Polygonize () para obter minha varredura como polígono em python. Mas na linha final está mostrando erro de execução !! porque?
— Shiuli Pervin

Funciona bem com arquivos raster georreferenciados. O resultado são muitos polígonos, mas eu quero apenas um polígono grande mostrando o contorno da varredura. Alguém tem alguma idéia de como funciona ao mesmo tempo?
— Shiuli Pervin

Ainda estou recebendo o shapefile vazio, mas tenho linhas no arquivo dbf. Por favor, me esclareça!
— Satya Chandra

Acabei de ter esse problema, mas em vez de adicionar um campo fictício, você pode inserir um índice de -1. Veja aqui que o campo é adicionado apenas se índice> = 0.
— jon_two
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.