GDAL polygone en python créant un polygone vide?

12

J'ai du mal à utiliser la fonction Polygonize en python. L'exemple de livre de cuisine pour cela peut être trouvé ici .

La partie pertinente de mon code est:

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

Je sais que le groupe a des informations pertinentes, voici un extrait 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.],

Lorsque j'ouvre la table attributaire dans QGIS, elle est vide: Capture d'écran QGIS

Éditer:

La conversion fonctionne très bien dans QGIS en utilisant Raster -> Conversion -> Outil Polygonize

Capture d'écran du raster à polygoniser:

raster à polygoniser

Et capture d'écran de la conversion résultante de l'outil QGIS:

raster polygonisé à partir de l'outil QGIS

J'utilise la distribution Enthought sur Windows 7, GDAL version 1.10.0-3

Le problème est que je ne peux pas polygoniser un raster en python en utilisant GDAL et l'exemple de livre de recettes, je peux polygoniser ce même raster sans problème dans l'interface graphique QGIS

camdenl
la source
À quoi ressemble votre raster? Contient-il vraiment des polygones? Est-ce que cela fonctionne si vous utilisez plutôt gdal_polygonize.py?
BradHards
Modifié pour ajouter des captures d'écran du processus de travail dans QGIS
camdenl
Quel est le vrai problème ici?
Fezter
Problème spécifique ajouté
camdenl
3
J'ai eu un problème similaire (création d'un fichier de formes vierge) et la création du champ n'a pas aidé. Ce que je faisais mal, c'est que je n'avais pas fermé le fichier de formes dans mon code avant d'appeler polygonize. Vous le fermez dans votre exemple, je ne fais que poster ceci pour la référence des autres.
Stephanie

Réponses:

19

Le problème est que je ne créais pas de champ pour stocker la bande raster. Après avoir fouillé dans le fichier gdal_polygonize.py, j'ai réalisé que cela ne se faisait pas automatiquement lors de l'appel à gdal.Polygonize, qui utilise à la place la fonction trouvée ici .

Voici l'étape supplémentaire nécessaire pour créer un champ et écrire une bande dans le champ:

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

On peut alors écrire la bande dans ce champ, avec un indice de 0:

gdal.Polygonize(band, None, outLayer, 0, [], callback=None )
camdenl
la source
J'essaie également d'utiliser la fonction gdal.Polygonize () pour obtenir mon raster sous forme de polygone en python. Mais à la fin, il montre une erreur d'exécution !! Pourquoi?
Shiuli Pervin
Cela fonctionne bien avec les fichiers raster géoréférencés. Le résultat est trop de polygones, mais je ne veux qu'un seul grand polygone montrant le contour du raster. Quelqu'un a-t-il une idée de comment cela fonctionne en même temps?
Shiuli Pervin
Je reçois toujours un fichier de formes vide, mais j'ai des lignes dans le fichier dbf. S'il vous plaît me clearifier!
Satya Chandra
Je viens d'avoir ce problème mais au lieu d'ajouter un champ factice, vous pouvez entrer un indice de -1. Voir ici ce champ n'est ajouté que si index> = 0.
jon_two