Python, GDAL e construção de tabelas de atributos raster

14

Eu tenho uma varredura inteira para a qual gostaria de criar uma tabela de atributos de varredura usando Python e GDAL. Posso criar uma tabela de atributos de varredura GDAL em Python da seguinte maneira:

>>> rat = gdal.RasterAttributeTable()

Isso funciona bem, como podemos ver:

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

A tabela assim criada não possui linhas ou colunas:

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

Eu crio uma coluna chamada "Valor" para armazenar os valores exclusivos na varredura:

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

Isso é bom e a contagem de colunas é atualizada:

>>> rat.GetColumnCount()
1

Agora eu tenho que adicionar valores (registros) à coluna para que seja útil. Eu posso obter uma lista de valores únicos da banda da varredura assim:

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

O que eu gostaria de fazer é criar um loop for para percorrer valse preencher a coluna na tabela de atributos. Eu pensei que poderia fazer algo assim:

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

... onde iestá a linha (registro), 0é o índice do campo e vals[i]é o valor inteiro que quero inserir. Mas isso causa um erro:

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'

O erro é causado porque eu uso vals[i]a chamada em SetValueAsInt()vez de usar um número inteiro diretamente. Por exemplo, rat.SetValueAsInt(0, 0, 0)funciona bem, mas é inútil para preencher a coluna se eu apenas quiser fazer um loop sobre a lista de valores exclusivos.

Isso é um problema conhecido? Até agora, o Google não tem sido muito útil. O que posso fazer para solucionar esse problema?

hendra
fonte

Respostas:

11

O método SetValueAsInt está esperando um tipo int python , não um tipo uint16 numpy .

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

Os seguintes trabalhos:

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

Se você usar, vals = numpy.unique(data).tolist()ele converterá automaticamente cada valor em um tipo int python.

Brian
fonte