सामग्री की QGIS तालिका में परतें क्रमबद्ध करें?


12

जब मैं PostGIS से QGIS में परतों का एक गुच्छा लोड करता हूं, तो वे उल्टे वर्णमाला क्रम में लोड होते प्रतीत होते हैं।

क्या कोई उपकरण या प्लगइन्स है जो आपको एक अलग क्रम में QGIS TOC को जल्दी से सॉर्ट करने की अनुमति देता है? उदाहरण के लिए मैं उन विकल्पों में से एक के बारे में सोच सकता हूं जिन्हें कोई भी चाहता है:

  1. ज्यामिति द्वारा परतों को क्रमबद्ध करें, जहां बिंदु शीर्ष पर हैं, फिर रेखाएं, ध्रुव, और रेखापुंज।
  2. नाम के आधार पर छंटनी करें (वर्णमाला, रिवर्स वर्णमाला)।
  3. पहले ज्यामिति द्वारा क्रमबद्ध करें, फिर नाम से। यह # 1 & # 2 का संयोजन होगा। अंक परतों को शीर्ष (# 1 के समान) के अनुसार क्रमबद्ध किया जाता है, लेकिन फिर अंक परतों को वर्णानुक्रम (बिंदु-ए, बिंदु-बी, बिंदु-सी, आदि) के आधार पर क्रमबद्ध किया जाता है।

बड़ी संख्या में परतों को लोड करते समय, यह तेजी से मानचित्र निर्माण के लिए सही क्रम बनाने में मदद करेगा।


बहुत अच्छा विचार है! मुझे नहीं लगता कि ऐसा कार्य करने के लिए कोई प्लगइन्स हैं (यदि अजगर पर्याप्त है तो मैं इस पर काम कर सकता हूं, लेकिन मेरा मानना ​​है कि यह जटिल है)। हो सकता है कि आप QGIS देव टीम के लिए एक सुविधा-अनुरोध कर सकें।
Curlew

1
मैंने इस कार्यक्षमता के लिए एक सुविधा अनुरोध पोस्ट किया है ।
रयानKalton

जवाबों:


7

जब मैं PostGIS से QGIS में परतों का एक गुच्छा लोड करता हूं, तो वे उल्टे वर्णमाला क्रम में लोड होते प्रतीत होते हैं।

यह लेयर एक्शन का उपयोग करते समय एक बग (मास्टर शाखा में भी) प्रतीत होता है Add PostGIS परतें ... और QGIS बग ट्रैकर पर रिपोर्ट की जानी चाहिए । हालाँकि, यदि आप PostGIS परतों को लोड करने के लिए नए ब्राउज़र का उपयोग करते हैं , तो वे उलट नहीं होंगे। नया DB प्रबंधक तालिकाओं के एकाधिक चयन की अनुमति नहीं देता है, इसलिए वहाँ कोई समस्या नहीं है (एकाधिक चयन की कमी के अलावा)।

क्या कोई उपकरण या प्लगइन्स है जो आपको एक अलग क्रम में QGIS TOC को जल्दी से सॉर्ट करने की अनुमति देता है? उदाहरण के लिए मैं उन विकल्पों में से एक के बारे में सोच सकता हूं जिन्हें कोई भी चाहता है:

2) नाम से क्रमबद्ध परतें (वर्णमाला, रिवर्स वर्णमाला)।

यह वर्तमान में देशी स्तंभ या आइटम QgsLegend (के आधार वर्ग की छंटाई का उपयोग करके किया जा सकता है QTreeWidget )। यह सभी ITEMS, दोनों परतों और समूहों को एक साथ क्रमबद्ध करेगा, न कि ऊपर-स्तर की परतों के ऊपर या नीचे वाले समूहों को। यह समूहों के भीतर भी छाँटेगा। इस तरह की छंटनी का कोई UNDO नहीं है।

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.utils import iface

mw = iface.mainWindow()
lgd = mw.findChild(QTreeWidget, "theMapLegend")  # get ref to object by type/objectName
lgd.sortItems(0, Qt.AscendingOrder)  # sort first column (Qt.DescendingOrder to reverse)

कैविएट : यदि मुख्य कथा भी लेयर रेंडर ऑर्डर (डिफ़ॉल्ट) को नियंत्रित करती है, तो यह ठीक काम करना चाहिए। यदि लेयर ऑर्डर डॉक विजेट को रेंडर ऑर्डर को नियंत्रित करने के लिए अलग से उपयोग किया जाता है, तो किंवदंती में सॉर्ट ऑर्डर को सम्मानित नहीं किया जाता है और निम्न प्रकार के ऑपरेशन से अवांछित परिणाम हो सकते हैं (ऊपर से जारी):

lo = mw.findChild(QListWidget, "theMapLayerOrder")
lo.sortItems(Qt.AscendingOrder)

इस कोड से आप देख सकते हैं कि लेयर ऑर्डर लिस्टिंग एक QListWidget है , न कि एक क्यूट्रीविडगेट , जिसका अर्थ है कि छांटना किसी भी समूह को ध्यान में नहीं रखेगा। सभी परतों को एक फ्लैट सूची में प्रस्तुत किया जाता है, जैसे कि वे सभी शीर्ष-स्तर थे। इसलिए, समूहों में वर्तमान में घिरी हुई कोई भी परतें शीर्ष-स्तरीय परतों के नीचे सॉर्ट हो सकती हैं, यदि आप उपरोक्त सॉर्टिंग कोड को QListWidget पर लागू करते हैं।

1) ज्यामिति द्वारा परतों को क्रमबद्ध करें, जहाँ बिंदु शीर्ष पर हैं, फिर रेखाएँ, ध्रुव, और रेखापुंज।

3) पहले ज्यामिति द्वारा क्रमबद्ध करें, फिर नाम से। यह # 1 & # 2 का संयोजन होगा। अंक परतों को शीर्ष (# 1 के समान) के अनुसार क्रमबद्ध किया जाता है, लेकिन फिर अंक परतों को वर्णानुक्रम (बिंदु-ए, बिंदु-बी, बिंदु-सी, आदि) के आधार पर क्रमबद्ध किया जाता है।

वर्तमान में, पायथन का उपयोग करते हुए, QgsLegend में हेरफेर करने के लिए सीमित कार्यक्षमता है। वहाँ QgsLegendInterface है, लेकिन इसमें QgsLegend , QgsLegendLayer , विरासत में मिली QgsLegendItem , या QgsLegend के साथ अन्य वर्गों में से कोई भी मौजूद नहीं है।

हालाँकि, यदि आप एक स्वच्छ परियोजना के साथ शुरू कर रहे हैं, और समूहों का उपयोग करने में कोई आपत्ति नहीं है, तो वर्तमान में निम्नलिखित संभव है (प्रारंभिक कोड ब्लॉक से जारी):

li = iface.legendInterface()
li.addGroup('A_Points')
li.addGroup('B_Lines')
li.addGroup('C_Polygons')
li.addGroup('D_Rasters')

for l in li.layers():
  if l.type() == QgsMapLayer.VectorLayer:
    if l.geometryType() == QGis.Point:
      li.moveLayer(l, 0)
    elif l.geometryType() == QGis.Line:
      li.moveLayer(l, 1)
    elif l.geometryType() == QGis.Polygon:
      li.moveLayer(l, 2)
  elif l.type() == QgsMapLayer.RasterLayer:
    li.moveLayer(l, 3)

lgd.sortItems(0, Qt.AscendingOrder)

( मान लिया गया है कि कोई अन्य समूह मौजूद नहीं है। ) यह लेयर्स जुड़ने के बाद कंसोल (या ScriptRunner स्क्रिप्ट, या प्लगइन, या मास्टर में नए कंसोल में लोड ) से चलाया जाएगा । यह सॉर्ट करने योग्य नामों के साथ समूह बनाएगा, परतों को सही समूहों में जोड़ेगा, फिर पूरी चीज़ को सॉर्ट करेगा। समान चेतावनी लागू होती है, ऊपर के रूप में।

पहले से भरी हुई परतों और समूहों के साथ एक मौजूदा परियोजना में नई परतें जोड़ते समय सही समूह सूचकांकों के लिए अधिक जांचों को अधिक मजबूत समाधान की आवश्यकता होगी।


अल्फाबेटिक ऑर्डर में परतों को प्रदर्शित करने के लिए एक परिवर्तन को केवल मास्टर शाखा में मिला दिया गया है: github.com/qgis/QGIS/pull/4965
MatzFan
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.