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]

我想做的是创建一个for循环以遍历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)工作正常,但如果我只想遍历唯一值列表,则对填充列毫无用处。

这是一个已知的问题?到目前为止,谷歌还不是很有用。我该怎么办才能解决这个问题?

Answers:


11

SetValueAsInt方法需要python int类型,而不是numpy uint16类型。

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

以下作品:

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

3

如果使用vals = numpy.unique(data).tolist(),它将自动将每个值转换为python int类型。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.