जब pyqgis के साथ एक वेक्टर परत पर पुनरावृत्ति होती है, तो मैं कैसे जांचता हूं कि क्या एक सुविधा का चयन किया गया है?


10

निम्नलिखित कोड का उपयोग करते हुए एक वेक्टर परत पर पुनरावृत्ति करते हुए ( pyqgis रसोई की किताब में उदाहरण से ग्रीष्मकालीन ), क्या यह जांचने का एक तरीका है कि क्या एक सुविधा का चयन किया गया है?

provider = vlayer.dataProvider()
feat = QgsFeature()
allAttrs = provider.attributeIndexes()
provider.select(allAttrs)
while provider.nextFeature(feat):
    geom = feat.geometry()
    attrs = feat.attributeMap()
    for (k,attr) in attrs.iteritems():
        print "%d: %s" % (k, attr.toString())

वैकल्पिक रूप से, मैं उपयोग करके चयनित सुविधाओं की एक सूची बना सकता हूं vlayer.selectedFeatures(), लेकिन मुझे उम्मीद है कि प्रत्येक सुविधा को सीधे जांचने का एक तरीका है।

जवाबों:


8

किसी फीचर ऑब्जेक्ट की पैरेंट लेयर को सीधे खोजने का कोई तरीका प्रतीत नहीं होता है या यह QgsFeature क्लास में किसी विधि से चुना गया है।

इसी तरह का दृष्टिकोण vlayer.selectedFeatures()परीक्षण करना है कि क्या feat.id()अंदर है vlayer.selectedFeaturesIds()। QgsFeatureIds अन्य सदिश परतों की तुलना में अद्वितीय मूल्य नहीं हैं, केवल उनकी अपनी परत के भीतर।

वैकल्पिक रूप से, आप vlayer.selectedFeatures()प्रदाता की सभी विशेषताओं के बजाय, उन विशेषताओं के साथ शुरुआत और पुनरावृति कर सकते हैं ।

फिर भी एक और तरीका यह है कि किसी सदिश परत के लिए चयनित और गैर-चयनित फ़ीचर आईडी के सेट (या सूची) को शुरू में इकट्ठा किया जाए:

# previous relevant code

set_selids = set(vlayer.selectedFeaturesIds())
feat = QgsFeature()
vlayer.select([], QgsRectangle(), False)
set_allids = set()
while vlayer.nextFeature(feat):
    set_allids.add(feat.id())

set_notselids = set_allids - set_selids

print set_allids
print set_selids
print set_notselids

मैं वेक्टर लेयर के लिए सभी सुविधाओं (या ids) के संदर्भ को पुनः प्राप्त करने के लिए एक एकल कॉल नहीं ढूँढ सकता (अर्थात अभी भी उपयोग करना है QgsVectorLayer.select()और इसके साथ पुनरावृति करना है QgsVectorLayer.nextFeature())।

संपादित करें : QgsVectorLaer को प्रतिबिंबित करने के लिए अपडेट किया गया कोड चुनिंदा कॉल को संभाल सकता है (सीधे प्रदाता प्राप्त करने की आवश्यकता नहीं है), और मैप कैनवस में वास्तविक चयनित सुविधाओं को गड़बड़ नहीं करता है, जिसे setSelectedFeatures()अपडेट करने की आवश्यकता होगी ।

एडिट 2 : फीचर आईडी सेट करने के बाद, आप उन पर पुनरावृति कर सकते हैं और QgsVectorLayer.featureAtId(featid)सुविधा का उपयोग कर सकते हैं।


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