Python, GDAL và xây dựng bảng thuộc tính raster


13

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 valsvà đ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 ilà hàng (bản ghi), 0là 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?

Câu trả lời:


11

Phương thức SetValueAsInt đang mong đợi một kiểu int python , không phải là kiểu uint16 numpy .

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

Các công việc sau đây:

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

3

Nếu bạn sử dụng vals = numpy.unique(data).tolist()thay vào đó, nó sẽ tự động chuyển đổi từng giá trị thành kiểu int python.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.