PyQGIS का उपयोग करके नियम-आधारित लेबलिंग को नियंत्रित करना?


15

इस सवाल के बाद: क्यूजीआईएस में सभी परतों के सभी लेबल को कैसे चालू / बंद किया जाए, ओपी ने अपनी टिप्पणी में उल्लेख किया कि वह नियम-आधारित लेबल का उपयोग करता है। मैंने ऑनलाइन खोज करने की कोशिश की कि इस प्रकार के लेबलों को कैसे पढ़ा और संशोधित किया जा सकता है, लेकिन केवल लुटेराकोनसूल से इस पोस्ट को खोजने में कामयाब रहे :

नियम-आधारित लेबलिंग को जोड़ने की सुविधा के लिए, QGIS लेबलिंग इंजन इंटरफ़ेस में कुछ आंतरिक परिवर्तन किए गए थे। लेबलिंग अब नए वर्ग द्वारा संचालित होता है QgsLabelingEngineV2जिसमें कई लेबल प्रदाता जुड़े हो सकते हैं।

बहुत अच्छा लगता है। हालांकि, जब QgsLabelingEngineV2 वर्ग के माध्यम से पढ़ते हैं , तो यह उल्लेख करता है:

यह वर्ग अभी तक सार्वजनिक API का हिस्सा नहीं है।

क्या वर्तमान में अजगर का उपयोग करके नियम-आधारित लेबलिंग को नियंत्रित करना संभव है?


1
मुझे यहाँ जीथब में क्यूजीस डॉक्यूमेंटेशन प्रोजेक्ट पर एक खुला मुद्दा मिला जिसमें इस बात का भी उल्लेख है । मुझे मास्टर या 2.18 शाखाओं में उस वर्ग के लिए एक एसआईपी बंधन नहीं मिला, इसलिए मुझे संदेह है कि यह अभी भी केवल C ++ कोड के लिए उपलब्ध है।
स्टीवन काय

@StevenKay - बहुत बढ़िया, धन्यवाद! काफी उपयोगी होगा अगर उन्होंने इसके लिए एक एपीआई बनाया ... संपादन के लिए भी धन्यवाद, मुझे लगा कि मैंने कक्षा के लिए सही लिंक पेस्ट किया है :)
जोसेफ

@StevenKay - मुझे लगता है कि उन्होंने इसके लिए एक एपीआई बनाया, विशेष रूप से QgsRuleBasedLabeling क्लास :)
जोसेफ

जवाबों:


6

नए QGIS 3 एपीआई के साथ स्क्रैच से नियम आधारित लेबलिंग को सेटअप करने में कुछ मदद के नीचे

#Configure label settings
settings = QgsPalLayerSettings()
settings.fieldName = 'myFieldName'
textFormat = QgsTextFormat()
textFormat.setSize(10)
settings.setFormat(textFormat)
#create and append a new rule
root = QgsRuleBasedLabeling.Rule(QgsPalLayerSettings())
rule = QgsRuleBasedLabeling.Rule(settings)
rule.setDescription(fieldName)
rule.setFilterExpression('myExpression')
root.appendChild(rule)
#Apply label configuration
rules = QgsRuleBasedLabeling(root)
myLayer.setLabeling(rules)
myLayer.triggerRepaint()

दुर्भाग्य से मैं यह नहीं जान सकता कि मौजूदा नियमों पर कैसे चलना है , वेक्टर लेयर्स के लिए उपलब्ध लेबलिंग () विधि QgsAbstractVectorLayerLabeling वर्ग की एक वस्तु लौटाती है, लेकिन ऐसा लगता है कि इस वर्ग से रूट नियम ( QgsRulezasedLabeling ) प्राप्त करने का कोई तरीका नहीं है , एकमात्र संभावना मैंने पाया कि प्रदाताओं आईडी का उपयोग करके सीधे पाल सेटिंग्स प्राप्त करना है, लेकिन मैं नियमों के पेड़ तक नहीं पहुंच सकता। किसी के पास कोई सुराग है?

संपादित करें

यह अब ठीक हो गया है, लेबलिंग () फ़ंक्शन एक QgsRuleBasedLabeling (): https://github.com/qgis/QGIS/commit/4b365a8f47d96b35f7609859e580388927ae0606 लौटें


आपके उत्तर के लिए धन्यवाद, अच्छी तरह से काम किया! आशा है कि आप बुरा नहीं मानेंगे लेकिन मैंने आपके पोस्ट myLayer.triggerRepaint()को परत को ताज़ा करने और नियमों को स्थापित करने के तुरंत बाद लेबल दिखाने की अनुमति देने के लिए थोड़ा संपादित किया :)
जोसेफ

3

से QGIS 3 , वहाँ एक नया है QgsRuleBasedLabeling कक्षा जो आप नए एपीआई का उपयोग कर नियम आधारित लेबलिंग को नियंत्रित करने की अनुमति होगी।

नियम QgsRuleBasedLabeling का उपयोग करके जोड़ा जा सकता है :: नियम


( दुर्भाग्य से, मैं फिलहाल २.९९ संस्करण का परीक्षण नहीं कर सकता हूं। लेकिन मैं इसका उत्तर खुशी से स्वीकार करूंगा यदि यह एक कार्यशील उदाहरण प्रदान करता है। )


1

यह वही है जो मैं QGIS 2.18 के तहत नियम-आधारित सिम्बॉलॉजी में एक फिल्टर एक्सप्रेशन को बदलने के लिए उपयोग करता हूं, निश्चित नहीं कि अगर वह आपसे क्या मांगे। Http://qgis.org/api/2.18/classQgsRuleBasedRendererV2.html पर एपीआई संदर्भ

import re
lddLrs = qgis.utils.iface.legendInterface().layers()    #get all loaded layers
for lyr in lddLrs:
    if (lyr.type()==QgsMapLayer.VectorLayer and lyr.name()=='layer_with_rules'): rLyr = lyr

newType = 1
for child in rLyr.rendererV2().rootRule().children():
    oldFilter = child.filterExpression()  #you can print this to see what the old expression is
    print oldFilter

    newFilter = re.sub(r"type = (\d*)", r"type = {0}".format(newType), oldFilter)  #this is an example to substitute a rule-based filter to a new number
    print newFilter

    child.setFilterExpression(newFilter)

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