पायथन, GDAL और भवन रेखापुंज विशेषता तालिकाओं


14

मेरे पास एक पूर्णांक रेखापुंज है जिसके लिए मैं पायथन और GDAL का उपयोग करके एक रास्टर विशेषता तालिका बनाना चाहूंगा। मैं पायथन में एक 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]

जो मैं करना चाहता हूं वह लूप के लिए लूप बनाने के लिए 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 अब तक बहुत उपयोगी नहीं है। इस समस्या के समाधान के लिए मैं क्या कर सकता हूं?

जवाबों:



3

यदि आप vals = numpy.unique(data).tolist()इसके बजाय उपयोग करते हैं तो यह स्वचालित रूप से प्रत्येक मान को एक अजगर इंट प्रकार में बदल देगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.