Python, GDAL และสร้างตารางแอตทริบิวต์ raster


14

ฉันมีแรสเตอร์จำนวนเต็มที่ฉันต้องการสร้างตารางแอตทริบิวต์แรสเตอร์โดยใช้ Python และ GDAL ฉันสามารถสร้างตารางแอตทริบิวต์ GDAL raster ใน Python ดังนี้

>>> rat = gdal.RasterAttributeTable()

ใช้งานได้ดีอย่างที่เราเห็น:

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

ตารางที่สร้างขึ้นจึงไม่มีแถวหรือคอลัมน์:

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

ฉันสร้างคอลัมน์ชื่อ "ค่า" เพื่อเก็บค่าที่ไม่ซ้ำใน raster:

>>> 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 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 วิธีการที่คาดว่าจะเป็นชนิดหลาม intไม่ใช่ชนิดuint16 numpy

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