Mam liczbę całkowitą rastrową, dla której chciałbym zbudować tabelę atrybutów rastrowych przy użyciu Pythona i GDAL. Mogę utworzyć tabelę atrybutów rastrowych GDAL w Pythonie w następujący sposób:
>>> rat = gdal.RasterAttributeTable()
Działa to dobrze, jak widzimy:
>>> rat
<osgeo.gdal.RasterAttributeTable; proxy of <Swig Object of type 'GDALRasterAttributeTableShadow *' at 0x0000000002A53D50> >
Tak utworzona tabela nie ma wierszy ani kolumn:
>>> rat.GetRowCount()
0
>>> rat.GetColumnCount()
0
Tworzę kolumnę o nazwie „Wartość” do przechowywania unikalnych wartości w rastrze:
>>> rat.CreateColumn("Value", gdalconst.GFT_Integer, gdalconst.GFU_MinMax)
0
To dobrze, a liczba kolumn jest aktualizowana:
>>> rat.GetColumnCount()
1
Teraz muszę dodać wartości (rekordy) do kolumny, aby była ona użyteczna. Mogę uzyskać listę unikalnych wartości z pasma rastrowego w następujący sposób:
>>> 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]
Chciałbym utworzyć pętlę for, która przejdzie przez pętlę vals
i wypełni kolumnę w tabeli atrybutów. Myślałem, że mogę zrobić coś takiego:
>>> for i in range(len(vals)):
rat.SetValueAsInt(i, 0, vals[i])
... gdzie i
jest wiersz (rekord), 0
indeks pola i vals[i]
wartość całkowita, którą chcę wstawić. Ale powoduje błąd:
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'
Błąd jest spowodowany, ponieważ używam vals[i]
w wywołaniu SetValueAsInt()
raczej niż bezpośredniej liczby całkowitej. Na przykład rat.SetValueAsInt(0, 0, 0)
działa dobrze, ale jest bezużyteczny do zapełniania kolumny, jeśli chcę tylko zapętlić listę unikalnych wartości.
Czy to znany problem? Google do tej pory nie był zbyt przydatny. Co mogę zrobić, aby obejść ten problem?