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

Camdenl
fonte
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 )
Camdenl
fonte
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