PyQGIS में नाम से परत हो रही है?


15

मेरे पास एक प्लगइन है जो शहरों की सूची के लिए बफर पाता है, दूरी प्रदान करता है। राज्य और शहर के नाम विशेषता तालिका से लिए गए हैं और तदनुसार फ़िल्टर किए जाते हैं। मैं जो चाहता हूं, मेरा प्लगइन कैनवास में परत के नाम या क्रम को पहचानना चाहिए, चाहे वह कैनवास में मौजूद अन्य परतों के बावजूद हो और उस परत से संबंधित विशेषताओं तक पहुंच हो।

मैं यह भी जानने के लिए उत्सुक हूं कि क्या कोड में एक विशिष्ट परत के नाम को इंगित करने से पुनरावृत्ति में कोई त्रुटि होगी, हालांकि कुछ अन्य परतें मौजूद हैं?

नीचे मेरा कोड है कृपया मुझे बताएं कि मुझे कहां बदलाव करना चाहिए और क्या बदलाव होगा?

    if dist and centerCity:
        #QMessageBox.information(self.dlg, "info", "both True")
        st = '"name" = \'' + centerCity + '\''
        exp = QgsExpression(st)
    else:
        QMessageBox.warning(self.dlg, "Enter the distance","Enter the distance and try again.")        
        return          #terminate the function

    layer = self.iface.activeLayer() 
    it = layer.getFeatures(QgsFeatureRequest(exp))
    feature = it.next()
    mbuf = feature.geometry().buffer(dist, 2)       

    iterFeat = layer.getFeatures()

    for f in iterFeat:
        geom2 = f.geometry()
        valTest = QgsGeometry.within(geom2, mbuf)

जवाबों:


41

अद्यतन: 10.04.2018

का उपयोग करते हुए QGIS 3.x आप उपयोग कर सकते mapLayersByNameसे विधि QgsProjectइस तरह से वर्ग:

layers = QgsProject.instance().mapLayersByName('my layer name')

चूंकि आप परतों के पैनल में एक ही नाम के साथ QGIS में कई परतें रख सकते हैं, इसलिए ऊपर दी गई विधि आपको मेल खाने वाली परतों की एक सूची देती है।


के लिए QGIS 2.x :

आपको केवल यह सुनिश्चित करने की आवश्यकता होगी कि आपकी परत का एक नाम है जिसे आप दूसरों से अलग कर सकते हैं। इसके बजाय layer = self.iface.activeLayer(), करें:

layer=None
for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.name() == "YOUR_LAYER_NAME":
        layer = lyr
        break

यदि आप परत नाम पर भरोसा नहीं करते हैं (आखिरकार, इसे किसी भी समय उपयोगकर्ता द्वारा बदला जा सकता है), आप परत स्रोत की जांच करने का प्रयास कर सकते हैं। यदि आपकी लेयर शेपफाइल है, तो आप शेपफाइल का रास्ता देख सकते हैं, इस तरह से:

layer=None
for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.source() == "/path/to/shapefile.shp":
        layer = lyr
        break

संपादित करें: जैसा कि @ जाकोब ने टिप्पणियों में बताया है, आप पहला ब्लॉक एक पंक्ति में लिख सकते हैं:

layerList = QgsMapLayerRegistry.instance().mapLayersByName("YOUR_LAYER_NAME")

या:

layerList = [lyr for lyr in QgsMapLayerRegistry.instance().mapLayers().values() if lyr.name() == "YOUR_LAYER_NAME"]

वैसे भी, आपको यह जांचना होगा कि layerListइसका पहला तत्व पहुंचने से पहले खाली नहीं है:

if layerList: 
    layer = layerList[0]

2
[QgsMapLayerRegistry.instance () में LYR के लिए LYR mapLayers () मूल्यों () यदि lyr.name () == "भूमि"।।] प्रिंट [0] .name ()
जेकब

7
परत = QgsMapLayerRegistry.instance ()। mapLayersByName ("mylayername") [0]
जैकब

आप layer = noneअपने कोड की शुरुआत में क्यों सेट कर रहे हैं ? यह विशेष रूप से अनावश्यक लगता है यदि किसी फ़ंक्शन में इसके
उपयोगकर्ता

1
यह एक डिफ़ॉल्ट मान है, क्योंकि इसके लिए एक अंदर है। अगर कभी मुलाकात नहीं हुई है, तो परत सभी के लिए मौजूद नहीं होगी। तो, बस यह सुनिश्चित करने के लिए कि आप बाद में लेयर वैरिएबल पढ़ सकते हैं।
जर्मेन कैरिलो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.