Tôi có một raster số nguyên mà tôi muốn xây dựng bảng thuộc tính raster bằng Python và GDAL. Tôi có thể tạo bảng thuộc tính raster GDAL trong Python như sau:
>>> rat = gdal.RasterAttributeTable()
Điều này hoạt động tốt, như chúng ta có thể thấy:
>>> rat
<osgeo.gdal.RasterAttributeTable; proxy of <Swig Object of type 'GDALRasterAttributeTableShadow *' at 0x0000000002A53D50> >
Bảng do đó được tạo không có hàng hoặc cột:
>>> rat.GetRowCount()
0
>>> rat.GetColumnCount()
0
Tôi tạo một cột có tên là "Giá trị" để lưu trữ các giá trị duy nhất trong raster:
>>> rat.CreateColumn("Value", gdalconst.GFT_Integer, gdalconst.GFU_MinMax)
0
Điều này là tốt, và số lượng cột được cập nhật:
>>> rat.GetColumnCount()
1
Bây giờ tôi phải thêm các giá trị (bản ghi) vào cột để nó được sử dụng. Tôi có thể nhận được một danh sách các giá trị duy nhất từ ban nhạc của raster như vậy:
>>> 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]
Những gì tôi muốn làm là tạo một vòng lặp for để lặp qua vals
và điền vào cột trong bảng thuộc tính. Tôi nghĩ rằng tôi có thể làm một cái gì đó như thế này:
>>> for i in range(len(vals)):
rat.SetValueAsInt(i, 0, vals[i])
... ở đâu i
là hàng (bản ghi), 0
là chỉ mục trường và vals[i]
là giá trị số nguyên tôi muốn chèn. Nhưng nó gây ra lỗ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'
Lỗi xảy ra do tôi sử dụng vals[i]
trong lệnh gọi SetValueAsInt()
thay vì sử dụng trực tiếp một số nguyên. Ví dụ, rat.SetValueAsInt(0, 0, 0)
hoạt động tốt, nhưng vô dụng để điền vào cột nếu tôi chỉ muốn lặp qua danh sách các giá trị duy nhất.
Đây có phải là một vấn đề được biết đến? Google cho đến nay không phải là rất hữu ích. Tôi có thể làm gì để khắc phục vấn đề này?