Python, GDAL и создание таблиц растровых атрибутов

14

У меня есть целочисленный растр, для которого я хотел бы построить таблицу атрибутов растра, используя Python и GDAL. Я могу создать таблицу атрибутов растра GDAL в Python следующим образом:

>>> 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)работает нормально, но бесполезно для заполнения столбца, если я просто хочу перебрать список уникальных значений.

Это известная проблема? Google пока что не очень полезен. Что я могу сделать, чтобы обойти эту проблему?

Hendra
источник

Ответы:

11

Метод SetValueAsInt ожидает тип Python int , а не тип numpy uint16 .

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

Следующие работы:

rat.SetValueAsInt(i, 0, int(vals[i]))
user2856
источник
3

Если вы используете vals = numpy.unique(data).tolist()вместо этого, он автоматически преобразует каждое значение в тип Python Int.

Брайан
источник