PyQGIS का उपयोग करके विशेषता मान कैसे पढ़ें?


18

विशेषता तालिका में मौजूद जानकारी को प्राप्त करने का तरीका क्या है, कॉलम 2, पंक्ति 2 में pyqgis का उपयोग करके कहें?


यह सहायक है, लेकिन यह केवल आपको विशेषताओं का मूल्य देता है। ऐसा लगता है कि विशेषताओं को एक नाम / मूल्य जोड़ी होना चाहिए। आपको प्रत्येक विशेषता के लिए नाम कैसे मिलेगा? क्या यही "खेतों" के बारे में है?
अंजप्रिय

यह वास्तव में सवाल का जवाब नहीं देता है। यदि आपका कोई अलग प्रश्न है, तो आप प्रश्न पूछकर क्लिक करके पूछ सकते हैं । पर्याप्त प्रतिष्ठा होने पर आप इस प्रश्न पर अधिक ध्यान आकर्षित करने के लिए एक इनाम भी जोड़ सकते हैं । - समीक्षा से
मार्टिन ह्यूगी

जवाबों:


43

एक परत में हर सुविधा पर लूप करने के लिए, getFeatures()जनरेटर का उपयोग करें । यह QgsFeatureपरत में सुविधाओं का पुनरावृत्ति करता है ( )।

for feature in layer.getFeatures():
    pass # do something with feature

यदि आप परत में सभी विशेषताओं के बजाय केवल किसी विशेष सुविधा में रुचि रखते हैं, तो आप इसका उपयोग करके इसका उपयोग कर सकते हैं QgsFeatureRequestऔर यह FID है:

fid = 1 # the second feature (zero based indexing!)
iterator = layer.getFeatures(QgsFeatureRequest().setFilterFid(fid))
feature = next(iterator)

एक बार जब आपके पास एक QgsFeatureवस्तु होती है, तो आप attributes()उस सुविधा (उर्फ पंक्ति) से जुड़ी विशेषताओं (उर्फ कॉलम या फ़ील्ड) को पुनः प्राप्त करने के लिए विधि का उपयोग कर सकते हैं , जैसे:

# get the feature's attributes
attrs = feature.attributes()
# print the second attribute (note zero based indexing of Python lists)
print(attrs[1])

यदि आप फ़ील्ड को एक नंबर के बजाय नाम से अनुक्रमित करना चाहते हैं, तो आपको फ़ील्ड मैपिंग का उपयोग करने की आवश्यकता है:

idx = layer.fieldNameIndex('name')
print(feature.attributes()[idx])

फ़ील्ड इंडेक्स लूप के दौरान नहीं बदलना चाहिए, इसलिए आपको केवल एक बार कॉल करना होगा।

PyQGIS रसोई की किताब में अधिक जानकारी और उदाहरण हैं: http://www.qgis.org/pyqgis-cookbook/vector.html#iterating-over-vector-layer

अपडेट करें

आप इस QgsFeatureतरह dict, जैसे, का उपयोग करके सुविधा विशेषताओं को अधिक आसानी से एक्सेस कर सकते हैं

for feature in layer.getFeatures():
    name = feature["name"]

मुझे यकीन नहीं है कि कौन सा संस्करण आया या यदि यह हमेशा रहा है।


11

सोचा था कि मैं वास्तव में कुछ कोड जोड़ूंगा, क्योंकि इस समस्या को हल करने के बाद यह प्रश्न वापस आ जाता है ... ज्यादातर लोग एक त्वरित स्पष्टीकरण या एक कोड स्निपेट को एक लिंक पर पसंद करते हैं, जो एक पृष्ठ पर ले जाता है जिसमें बहुत अधिक जानकारी होती है।

तालिका में जानकारी प्राप्त करने के लिए आपको सबसे पहले परत की विशेषताओं का उपयोग करना होगा । मेरे मामले में मैंने सुविधाओं को एक चर में रखा। फिर आप सुविधाओं के माध्यम से लूप करते हैं , और प्रत्येक विशेषता के लिए आप इसकी विशेषताओं को कॉल करते हैं , जो तब उनके कॉलम इंडेक्स का उपयोग करके मुद्रित किया जा सकता है । उदाहरण के लिए, यदि मैं दूसरे कॉलम में सभी मान प्राप्त करना चाहूंगा, तो मैं यह करूंगा:

lyr = iface.activeLayer()

features = lyr.getFeatures()

for feat in features:
    attrs = feat.attributes()
    print attrs[1]

1

ऊपर दिए गए उत्तर केवल यह दिखाते हैं कि सक्रिय परत के लिए यह कैसे करना है। मुझे लगता है, कई मामलों में आप एक परत के लिए उक्त विशेषता ढूंढना चाहते हैं जो कि सक्रिय परत या परत खिड़की में जाँच की गई परत नहीं है। नीचे दिए गए कोड में उन सभी परतों की एक सूची मिलेगी, जिन्हें आपने अपनी परत विंडो में जोड़ा है (भले ही वे जाँची या सक्रिय हों) और पंक्ति 2, कॉलम 2 में विशेषता ढूंढें।

from qgis.core import QgsProject

layer = QgsProject.instance().mapLayersByName("myLayerName")[0]
        value = layer.getFeature(2).attribute(2)

नोट MapLayersByName दिए गए नाम के साथ परतों की एक सूची देता है। मैं इस उदाहरण के लिए मौजूद हूं।

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