Python, GDAL 및 건물 래스터 속성 테이블


14

파이썬과 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

래스터에 고유 한 값을 저장하기 위해 "Value"라는 열을 만듭니다.

>>> 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)잘 작동하지만 고유 값 목록을 반복하려는 경우 열을 채우는 데 쓸모가 없습니다.

이것은 알려진 문제입니까? 구글은 지금까지 유용하지 않았다. 이 문제를 해결하려면 어떻게해야합니까?

답변:


11

SetValueAsInt 메소드는 numpy uint16 유형이 아닌 python int 유형을 예상합니다 .

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