Python, GDAL y creación de tablas de atributos ráster


14

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 valsy 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 iestá la fila (registro), 0es 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?

Respuestas:


11

El método SetValueAsInt espera un tipo python int , no un tipo nuinty uint16 .

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

Los siguientes trabajos:

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

3

Si lo utiliza vals = numpy.unique(data).tolist(), convertirá automáticamente cada valor a un tipo int de python.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.