QGIS पायथन में मैप लेयर्स पर इरेटिंग?


30

मुझे यह पता लगाने में कठिनाई हो रही है कि नक्शे की परतों पर पुनरावृति कैसे करें। मैं सामग्री की तालिका में वर्तमान में हाइलाइट की गई परत तक पहुंच सकता हूं, iface.activeLayer()लेकिन मैं चाहता हूं कि मेरा कोड सभी परतों पर काम करे।

मुझे एपीआई में कुछ भी नहीं दिख रहा है जो इस कार्यक्षमता तक आसान पहुंच प्रदान करता है और एक अच्छा ऑनलाइन उदाहरण नहीं मिल सकता है लेकिन शायद मुझे कुछ याद आया?


मैं नहीं देखता कि आप लोग QgsMapLayerRegistry या QgsProject का उपयोग कैसे कर रहे हैं। QGIS 3.0.2 में यह काम नहीं करता है। हालाँकि, iface.mapCanvas ()। लेयर्स () करता है। एक प्रकार का। यह केवल आपको सक्रिय लेयर्स (जिन्हें आपने लेयर्स पेन में चेक किया है) देता है। क्या किसी को पता है कि सभी परतों की एक सूची कैसे प्राप्त की जाए, यहां तक ​​कि उन लोगों की भी जो परतें फलक में अनियंत्रित हैं? इसके अलावा, अगर प्लगइन बिल्डर का उपयोग कर रहा है, तो यह आपके लिए आपके प्लगइन का खोल बनाता है। रन फ़ंक्शन में एक "स्वयं" पैरामीटर है, जिसे iface का उपयोग करने की आवश्यकता है। अर्थात स्व.इफेस.मैप.कैनवास ()। लेयर्स (), जस्ट फी।
अंजपारी

जवाबों:


24

प्रयत्न...

# substitute 'self' with 'qgis.utils.iface' when run from Python console
# 'self.iface = iface' would usually precede this command in your class 
layers = self.iface.legendInterface().layers()

for layer in layers:
    layerType = layer.type()
    if layerType == QgsMapLayer.VectorLayer:
        # do some stuff here

से चुनी गई consolidatethread.py से QConsolidate प्लगइन

QgsLegendInterface ऑब्जेक्ट का विवरण किंवदंतीइंटरफेस () से लौटा है।

संपादित करें : ऊपर 'स्व' पर जानकारी जोड़ी गई।


धन्यवाद! यही चाल चली। मुझे लगता है कि मैं भी ईएसआरआई दुनिया के लिए उपयोग किया जाता हूं, जहां किंवदंती नक्शे के लेआउट में वस्तु है और सामग्री की तालिका परतों की सूची को संदर्भित करती है।
स्पेंसरक्रीप्स

2
ध्यान दें कि इस और मेपैनवास () तकनीक नाथन उल्लेखों के बीच क्या अंतर है, में अंतर है। लीजेंडइंटरफेस () ऑब्जेक्ट सभी परतों को वापस कर देगा, भले ही वे नक्शे के कैनवास में नहीं दिखाए गए हों, जबकि मैप कैनवस () केवल उन कैनवास पर दिखाए गए हैं। MapCanvas () का उपयोग दृश्य परतों के संदर्भ के लिए एक अच्छा, त्वरित तरीका है।
डाकार्टो २c

1
एक अन्य नोट पर, QGIS (> = 1.8) के नवीनतम संस्करण उपयोगकर्ता को किंवदंती में सूचीबद्ध क्रम से अलग परतों के प्रतिपादन क्रम को परिभाषित करने की अनुमति देते हैं (बहुत अच्छा!)। लेजेंडइंटरफेस () और मेकपैनवास () विधियां क्रमशः प्रत्येक के लिए लेयर ऑर्डर लौटाती हैं।
डाकार्टो २12

19

दो अन्य तरीके भी हैं:

layers = self.iface.mapCanvas().layers()

आपको परतों की एक सूची देगा

या

layers = QgsMapLayerRegistry.instance().mapLayers()

for name, layer in layers.iteritems():
     print name, layer.type()

इस उत्तर में 2.16और ऊपर
राफेल

10

QGIS 2.6 के लिए यहां प्रत्येक परत की पहचान करने और उन्हें समूहित करने का कोड है:

#make the desired groups for layers
toc = self.iface.legendInterface()
root = QgsProject.instance().layerTreeRoot()
group1 = root.insertGroup(0, "Group Point")
group2 = root.insertGroup(1, "Group Line")
group3 = root.insertGroup(2, "Group Polygon")
#get the list of layers  from registry
layers = QgsMapLayerRegistry.instance().mapLayers()
#segregate layers into groups 
for name, layer in layers.iteritems():
    # check the layer geometry type 
    if layer.geometryType() == QGis.Point:
        toc.moveLayer(layer, 0)

    if layer.geometryType() == QGis.Line:
        toc.moveLayer(layer, 1)

    if layer.geometryType() == QGis.Polygon:
        toc.moveLayer(layer, 2)

नोट: समूहीकरण के बाद मुझे डुप्लिकेट परत को हटाना होगा ताकि मैंने उपयोग किया root.removeLayer(lyr)


9

QGIS 3 के लिए, QgsMapLayerRegistryकी कार्यक्षमता को स्थानांतरित कर दिया गया है QgsProject

इसलिए, मानचित्र परतों पर पुनरावृत्ति के लिए, आपको उस संरचना का उपयोग करना चाहिए:

layers = QgsProject.instance().mapLayers()

.mapLayers()के रूप में संरचित एक शब्दकोश देता है {layer_x_id: layer_x, layer_y_id: layer_y, ....}। फिर आप परतों की तरह पुनरावृति कर सकते हैं:

for layer_id, layer in layers.items():
    print(layer.name())

क्योंकि .mapLayers()एक शब्दकोश ( dict) लौटाता है , तो आप .values()शब्दकोश की विधि का उपयोग भी कर सकते हैं, listजो उस मामले में परतें शामिल करता है। फिर आप परतों की तरह पुनरावृति कर सकते हैं:

layers = QgsProject.instance().mapLayers().values()

for layer in layers:
    print(layer.name())

यदि आप चाहें, तो आप इस तरह से पुनरावृत्ति कर सकते हैं:

layers = QgsProject.instance().mapLayers() # dictionary

for layer in layers.values():
    print(layer.name())

नमस्ते! इसे शेयर करने के लिए धन्यवाद। परतों के नाम मुद्रित करने के लिए ठीक काम करता है ... लेकिन मैं शब्दकोश की कुंजी नहीं छाप सकता। क्या उसके लिए आपके द्वारा मेरी मदद की जाएगी?
कैयो विलाका

1
for layer in layers: print(layer)आप कुंजी को मुद्रित करने के लिए स्क्रिप्ट का उपयोग कर सकते हैं। या सिर्फ लूप के print(layers.keys())बिना उपयोग करें for
कादिर Kadबज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.