Python, GDAL e creazione di tabelle di attributi raster


14

Ho un raster intero per il quale vorrei creare una tabella degli attributi raster usando Python e GDAL. Posso creare una tabella degli attributi raster GDAL in Python come segue:

>>> rat = gdal.RasterAttributeTable()

Funziona bene, come possiamo vedere:

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

La tabella così creata non ha righe o colonne:

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

Creo una colonna denominata "Valore" per memorizzare i valori univoci nel raster:

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

Questo va bene e il conteggio delle colonne viene aggiornato:

>>> rat.GetColumnCount()
1

Ora devo aggiungere valori (record) alla colonna perché possa essere utile. Posso ottenere un elenco di valori univoci dalla band del raster in questo modo:

>>> 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]

Quello che vorrei fare è creare un ciclo for per scorrere valse popolare la colonna nella tabella degli attributi. Pensavo di poter fare qualcosa del genere:

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

... dov'è ila riga (record), 0è l'indice di campo ed vals[i]è il valore intero che voglio inserire. Ma provoca un errore:

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'errore è causato perché uso vals[i]nella chiamata SetValueAsInt()anziché utilizzare direttamente un numero intero. Ad esempio, rat.SetValueAsInt(0, 0, 0)funziona bene, ma è inutile per popolare la colonna se voglio solo scorrere l'elenco di valori univoci.

È un problema noto? Finora Google non è stato molto utile. Cosa posso fare per aggirare questo problema?

Risposte:



3

Se lo usi vals = numpy.unique(data).tolist()invece, convertirà automaticamente ogni valore in un tipo int python.

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.