Python, GDAL ve bina tarama nitelik tabloları


14

Python ve GDAL kullanarak bir raster öznitelik tablosu oluşturmak istiyorum bir tamsayı raster var. Python'da aşağıdaki gibi bir GDAL tarama özelliği tablosu oluşturabilirim:

>>> rat = gdal.RasterAttributeTable()

Gördüğümüz gibi bu iyi çalışıyor:

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

Bu şekilde oluşturulan tablonun satırları veya sütunları yoktur:

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

Rasterde benzersiz değerleri saklamak için "Değer" adlı bir sütun oluşturuyorum:

>>> rat.CreateColumn("Value", gdalconst.GFT_Integer, gdalconst.GFU_MinMax)
0

Bu iyidir ve sütun sayısı güncellenir:

>>> rat.GetColumnCount()
1

Şimdi sütuna herhangi bir kullanım için değerler (kayıtlar) eklemeliyim. Raster grubundan benzersiz değerlerin bir listesini şöyle alabilirsiniz:

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

Ne yapmak istiyorum döngü valsve öznitelik tablosundaki sütun doldurmak için bir döngü oluşturmaktır . Böyle bir şey yapabileceğimi düşündüm:

>>> for i in range(len(vals)):
        rat.SetValueAsInt(i, 0, vals[i])

... isatır (kayıt) nerede , 0alan dizini ve vals[i]eklemek istediğim tamsayı değeridir. Ancak bir hataya neden olur:

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'

Doğrudan bir tamsayı kullanmak yerine vals[i]çağrısında kullandığım hataya neden olur SetValueAsInt(). Örneğin, iyi rat.SetValueAsInt(0, 0, 0)çalışıyor, ancak yalnızca benzersiz değerler listesi üzerinde döngü yapmak istiyorsam sütunu doldurmak için işe yaramaz.

Bu bilinen bir sorun mu? Google şu ana kadar pek kullanışlı olmamıştı. Bu sorunu aşmak için ne yapabilirim?

Yanıtlar:


11

SetValueAsInt yöntemi, bir numpy uint16 türü değil, bir python int türü bekliyor .

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

Aşağıdaki işler:

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

3

Eğer kullanırsanız vals = numpy.unique(data).tolist()yerine otomatik bir piton int türüne her değeri dönüştürür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.