Python, GDAL dan membangun tabel atribut raster

14

Saya memiliki integer raster yang ingin saya buat tabel atribut raster menggunakan Python dan GDAL. Saya bisa membuat tabel atribut raster GDAL dengan Python sebagai berikut:

>>> rat = gdal.RasterAttributeTable()

Ini berfungsi dengan baik, seperti yang bisa kita lihat:

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

Tabel yang dibuat tidak memiliki baris atau kolom:

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

Saya membuat kolom yang disebut "Nilai" untuk menyimpan nilai unik dalam raster:

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

Ini baik, dan jumlah kolom diperbarui:

>>> rat.GetColumnCount()
1

Sekarang saya harus menambahkan nilai (catatan) ke kolom agar dapat digunakan. Saya bisa mendapatkan daftar nilai unik dari band raster seperti:

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

Apa yang ingin saya lakukan adalah membuat for loop untuk mengulang valsdan mengisi kolom pada tabel atribut. Saya pikir saya bisa melakukan sesuatu seperti ini:

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

... di mana ibaris (catatan), 0adalah indeks bidang dan vals[i]merupakan nilai integer yang ingin saya masukkan. Tapi itu menyebabkan kesalahan:

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'

Kesalahan ini disebabkan karena saya menggunakan vals[i]panggilan SetValueAsInt()daripada menggunakan integer secara langsung. Misalnya, rat.SetValueAsInt(0, 0, 0)berfungsi dengan baik, tetapi tidak berguna untuk mengisi kolom jika saya hanya ingin mengulang daftar nilai unik.

Apakah ini masalah yang diketahui? Google sejauh ini tidak terlalu berguna. Apa yang bisa saya lakukan untuk mengatasi masalah ini?

hendra
sumber

Jawaban:

11

Metode SetValueAsInt mengharapkan tipe int python , bukan tipe uint16 numpy .

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

Karya-karya berikut:

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

Jika Anda menggunakan vals = numpy.unique(data).tolist()itu akan secara otomatis mengkonversi setiap nilai ke tipe int python.

Brian
sumber