Poligonizzare GDAL in pitone creando poligono vuoto?


12

Sto riscontrando problemi nell'uso della funzione Polygonize in Python. L'esempio del libro di cucina per questo può essere trovato qui .

La parte rilevante del mio codice è:

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

So che la band ha informazioni pertinenti, ecco uno snippet di 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 apro la tabella degli attributi in QGIS, è vuota: Screencapture QGIS

Modificare:

La conversione funziona perfettamente in QGIS usando lo strumento Raster -> Conversione -> Poligonizza

Schermata del raster da poligonizzare:

raster da poligonizzare

E screenshot della conversione risultante dallo strumento QGIS:

raster poligonale dallo strumento QGIS

Sto usando la distro Enthought su Windows 7, versione GDAL 1.10.0-3

Il problema è che non riesco a poligonizzare un raster in Python usando GDAL e l'esempio del ricettario, posso poligonizzare questo stesso raster senza alcun problema nella GUI di QGIS


Che aspetto ha il tuo raster? Contiene davvero poligoni? Funziona se usi invece gdal_polygonize.py?
BradHards,

Modificato per aggiungere screenshot del processo di lavoro in QGIS
camdenl

Qual è il vero problema qui?
Fezter

Aggiunto problema specifico
camdenl

3
Ho avuto un problema simile (creazione del file di forma vuoto) e la creazione del campo non ha aiutato. Quello che stavo facendo di sbagliato era che non avevo chiuso lo shapefile nel mio codice prima di chiamare poligonimizzare. Lo chiudi nel tuo esempio, sto solo pubblicando questo come riferimento per gli altri.
Stephanie,

Risposte:


19

Il problema è che non stavo creando un campo per memorizzare la banda raster. Dopo aver scavato nel file gdal_polygonize.py, mi sono reso conto che questo non è fatto automaticamente quando si chiama gdal.Polygonize, che invece utilizza la funzione trovata qui .

Ecco il passaggio aggiuntivo necessario per creare un campo e scrivere una banda sul campo:

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

Possiamo quindi scrivere la banda in questo campo, con un indice di 0:

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

Sto anche cercando di usare la funzione gdal.Polygonize () per ottenere il mio raster come poligono in Python. Ma alla fine mostra errore di runtime !! perché?
Shiuli Pervin,

Funziona bene con file raster georeferenziati. Il risultato sono troppi poligoni, ma voglio solo un grande poligono che mostri il contorno del raster. Qualcuno ha idea di come funzioni allo stesso tempo?
Shiuli Pervin,

Sto ancora ottenendo lo shapefile vuoto, ma ho file nel file dbf. Per favore, chiariscimi!
Satya Chandra,

Ho appena avuto questo problema ma invece di aggiungere un campo fittizio, puoi inserire un indice di -1. Vedi qui quel campo viene aggiunto solo se indice> = 0.
jon_two
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.