Python, GDAL und Erstellen von Rasterattributtabellen


13

Ich habe ein ganzzahliges Raster, für das ich eine Raster-Attributtabelle mit Python und GDAL erstellen möchte. Ich kann eine GDAL-Rasterattributtabelle in Python wie folgt erstellen:

>>> rat = gdal.RasterAttributeTable()

Das funktioniert gut, wie wir sehen können:

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

Die so erstellte Tabelle enthält keine Zeilen oder Spalten:

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

Ich erstelle eine Spalte mit dem Namen "Value", um die eindeutigen Werte im Raster zu speichern:

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

Dies ist in Ordnung und die Spaltenanzahl wird aktualisiert:

>>> rat.GetColumnCount()
1

Jetzt muss ich der Spalte Werte (Datensätze) hinzufügen, damit sie von Nutzen ist. Ich kann eine Liste mit eindeutigen Werten aus der Raster-Gruppe abrufen, und zwar wie folgt:

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

Ich möchte eine for-Schleife erstellen, um valsdie Spalte in der Attributtabelle zu durchlaufen und zu füllen. Ich dachte, ich könnte so etwas machen:

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

... wo iist die Zeile (Datensatz), 0ist der Feldindex und vals[i]ist der ganzzahlige Wert, den ich einfügen möchte. Aber es verursacht einen Fehler:

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'

Der Fehler wird dadurch verursacht, dass ich vals[i]im Aufruf SetValueAsInt()eine Ganzzahl benutze , anstatt sie direkt zu verwenden. Funktioniert beispielsweise rat.SetValueAsInt(0, 0, 0)einwandfrei, ist jedoch nicht zum Auffüllen der Spalte geeignet, wenn ich nur die Liste der eindeutigen Werte durchlaufen möchte.

Ist das ein bekanntes Problem? Google war bisher nicht sehr nützlich. Was kann ich tun, um dieses Problem zu umgehen?

Antworten:


11

Die SetValueAsInt-Methode erwartet einen Python-Int- Typ, keinen Numpy-Uint16- Typ.

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

Die folgenden Arbeiten:

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

3

Wenn Sie vals = numpy.unique(data).tolist()stattdessen verwenden, wird jeder Wert automatisch in einen Python-Int-Typ konvertiert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.