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?

Odpowiedzi:



3

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.