Python, GDAL et construction de tables d'attributs raster


14

J'ai un raster entier pour lequel je voudrais construire une table d'attributs raster en utilisant Python et GDAL. Je peux créer une table d'attributs raster GDAL en Python comme suit:

>>> rat = gdal.RasterAttributeTable()

Cela fonctionne bien, comme nous pouvons le voir:

>>> rat
<osgeo.gdal.RasterAttributeTable; proxy of <Swig Object of type 'GDALRasterAttributeTableShadow *' at 0x0000000002A53D50> >

Le tableau ainsi créé ne comporte ni lignes ni colonnes:

>>> rat.GetRowCount()
0
>>> rat.GetColumnCount()
0

Je crée une colonne appelée "Value" pour stocker les valeurs uniques dans le raster:

>>> rat.CreateColumn("Value", gdalconst.GFT_Integer, gdalconst.GFU_MinMax)
0

C'est très bien, et le nombre de colonnes est mis à jour:

>>> rat.GetColumnCount()
1

Maintenant, je dois ajouter des valeurs (enregistrements) à la colonne pour qu'elle soit utile. Je peux obtenir une liste de valeurs uniques de la bande du raster comme ceci:

>>> data = band.ReadAsArray(0, 0, dataset.RasterXSize, dataset.RasterYSize)
>>> vals = list(numpy.unique(data))
>>> vals
[3, 7, 8, 10, 11, 12, 13, 14, 17, 18, 20, 22, 23, 25, 27, 28, 41, 45, 52, 56]

Ce que je voudrais faire, c'est créer une boucle for à parcourir valset remplir la colonne dans la table attributaire. Je pensais pouvoir faire quelque chose comme ça:

>>> for i in range(len(vals)):
        rat.SetValueAsInt(i, 0, vals[i])

... où iest la ligne (enregistrement), 0est l'index du champ et vals[i]est la valeur entière que je veux insérer. Mais cela provoque une erreur:

Traceback (most recent call last):
  File "<pyshell#32>", line 2, in <module>
    rat.SetValueAsInt(i, 0, vals[i])
  File "C:\Python27\lib\site-packages\osgeo\gdal.py", line 1139, in SetValueAsInt
    return _gdal.RasterAttributeTable_SetValueAsInt(self, *args)
TypeError: in method 'RasterAttributeTable_SetValueAsInt', argument 4 of type 'int'

L'erreur est due au fait que j'utilise vals[i]dans l'appel à SetValueAsInt()plutôt que d'utiliser directement un entier. Par exemple, rat.SetValueAsInt(0, 0, 0)fonctionne très bien, mais est inutile pour remplir la colonne si je veux simplement parcourir la liste des valeurs uniques.

est-ce un problème connu? Jusqu'à présent, Google n'a pas été très utile. Que puis-je faire pour contourner ce problème?

Réponses:


11

La méthode SetValueAsInt attend un type int python , pas un type uint16 numpy .

>>> print type(vals[0])
<type 'numpy.uint16'>

Les oeuvres suivantes:

rat.SetValueAsInt(i, 0, int(vals[i]))

3

Si vous utilisez à la vals = numpy.unique(data).tolist()place, il convertira automatiquement chaque valeur en un type int python.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.