Python、GDAL、およびラスター属性テーブルの構築


14

PythonとGDALを使用してラスター属性テーブルを構築したい整数ラスターがあります。次のように、PythonでGDALラスター属性テーブルを作成できます。

>>> rat = gdal.RasterAttributeTable()

ご覧のとおり、これは正常に機能します。

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

このようにして作成されたテーブルには行も列もありません。

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

「値」という列を作成して、ラスターに一意の値を保存します。

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

これで問題ありません。列数が更新されます。

>>> rat.GetColumnCount()
1

ここで、列を使用するために値(レコード)を列に追加する必要があります。次のように、ラスターのバンドから一意の値のリストを取得できます。

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

私がやりたいのは、ループしてループを作成valsし、属性テーブルの列に入力するためのforループを作成することです。私はこのようなことができると思った:

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

... iは行(レコード)、0フィールドインデックス、およびvals[i]挿入する整数値です。ただし、エラーが発生します。

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'

このエラーは、整数を直接使用するのではなくvals[i]、呼び出しで使用するために発生SetValueAsInt()します。たとえば、rat.SetValueAsInt(0, 0, 0)正常に機能しますが、一意の値のリストをループするだけの場合、列にデータを入力することは役に立ちません。

これは既知の問題ですか?これまでのところ、Googleはあまり役に立ちませんでした。この問題を回避するにはどうすればよいですか?

回答:


11

SetValueAsIntメソッドは、numpy uint16型ではなく、Python int型を予期しています。

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

次の作品:

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

3

vals = numpy.unique(data).tolist()代わりに使用すると、各値が自動的にpython int型に変換されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.