Tengo un ráster entero para el que me gustaría construir una tabla de atributos ráster usando Python y GDAL. Puedo crear una tabla de atributos ráster GDAL en Python de la siguiente manera:
>>> rat = gdal.RasterAttributeTable()
Esto funciona bien, como podemos ver:
>>> rat
<osgeo.gdal.RasterAttributeTable; proxy of <Swig Object of type 'GDALRasterAttributeTableShadow *' at 0x0000000002A53D50> >
La tabla así creada no tiene filas ni columnas:
>>> rat.GetRowCount()
0
>>> rat.GetColumnCount()
0
Creo una columna llamada "Valor" para almacenar los valores únicos en el ráster:
>>> rat.CreateColumn("Value", gdalconst.GFT_Integer, gdalconst.GFU_MinMax)
0
Esto está bien y el recuento de columnas se actualiza:
>>> rat.GetColumnCount()
1
Ahora tengo que agregar valores (registros) a la columna para que sea de utilidad. Puedo obtener una lista de valores únicos de la banda de la trama así:
>>> 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]
Lo que me gustaría hacer es crear un bucle for para recorrer vals
y completar la columna en la tabla de atributos. Pensé que podría hacer algo como esto:
>>> for i in range(len(vals)):
rat.SetValueAsInt(i, 0, vals[i])
... donde i
está la fila (registro), 0
es el índice de campo y vals[i]
es el valor entero que quiero insertar. Pero causa un error:
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'
El error se debe a que uso vals[i]
en la llamada en SetValueAsInt()
lugar de usar un entero directamente. Por ejemplo, rat.SetValueAsInt(0, 0, 0)
funciona bien, pero es inútil para llenar la columna si solo quiero recorrer la lista de valores únicos.
¿Es este un problema conocido? Google hasta ahora no ha sido muy útil. ¿Qué puedo hacer para solucionar este problema?