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 vals
e 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 i
está 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?
fonte