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 vals
et 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ù i
est la ligne (enregistrement), 0
est 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?
la source