Python, GDAL i budowanie tabel atrybutów rastrowych

14

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ę valsi 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 ijest wiersz (rekord), 0indeks 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?

hendra
źródło

Odpowiedzi:

11

Metoda SetValueAsInt oczekuje typu int python , a nie typu numpy uint16 .

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

Następujące prace:

rat.SetValueAsInt(i, 0, int(vals[i]))
użytkownik2856
źródło
3

Jeśli użyjesz vals = numpy.unique(data).tolist()zamiast tego, automatycznie skonwertuje każdą wartość na typ int python.

Brian
źródło