[FOSSGIS-Talk] QGIS: regelbasierte Beschriftung für ein PlugIn
Junghans, S. Hr.
Steffen.Junghans at Zwickau.de
Mo Mai 23 10:28:09 CEST 2016
Hallo Wissende :-)
ich versuche mich an einem QGIS-PlugIn und will dort eine regelbasierte (maßstabsabhängige) Darstellung einbauen.
Dies habe ich für Punkte/Symbole, Linien und Flächen bereits umgesetzt.
Nun ist dies ab 2.12 auch für Texte (beschriftete Punktlayer möglich). Leider fehlt mir aber ein Ansatz, dies programmseitig umzusetzen.
Schaue ich mir die Projektdatei an, scheint die Umsetzung einer regelbasierten Beschriftung auch nach einem ganz anderen Prinzip zu erfolgen :-(.
Für einen normalen Punkt/Symbollayer habe ich es z.B. so umgesetzt:
-------------------------------------------- Code Anfang ------------------------------------------------------
# =============================================================================
# 1. Layer laden
qLayer= iface.addVectorLayer("c:/..../punkte.shp", "MeinPunktLayer", "ogr")
# =============================================================================
# 2. Rendern
symbol = QgsSymbolV2.defaultSymbol(qLayer.geometryType())
renderer = QgsRuleBasedRendererV2(symbol)
root_rule = renderer.rootRule()
# "Oberrolle" normalerweise mit Filter
new_rule = root_rule.children()[0].clone()
new_rule.setLabel("Oberrolle")
new_rule.setSymbol(None) # Kein Symbol bei "Oberrolle)
root_rule.appendChild(new_rule)
# 1. zugehörige Unterrolle
rule = root_rule.children()[0].clone()
rule.setLabel("Rolle1")
rule.setScaleMinDenom(1)
rule.setScaleMaxDenom(1000)
symbol = QgsSymbolV2.defaultSymbol(qLayer.geometryType())
symbol.deleteSymbolLayer(0)
rule.setSymbol(symbol)
new_rule.appendChild(rule)
qmap={}
qmap['name']="c:/..../symbolrolle1.svg"
symbol.appendSymbolLayer(QgsSymbolLayerV2Registry.instance().symbolLayerMetadata("SvgMarker").createSymbolLayer(qmap))
# 2. zugehörige Unterrolle
rule = root_rule.children()[0].clone()
rule.setLabel("Rolle2")
rule.setScaleMinDenom(1000)
rule.setScaleMaxDenom(10000)
symbol = QgsSymbolV2.defaultSymbol(qLayer.geometryType())
symbol.deleteSymbolLayer(0)
rule.setSymbol(symbol)
new_rule.appendChild(rule)
qmap={}
qmap['name']="c:/..../symbolrolle2.svg"
symbol.appendSymbolLayer(QgsSymbolLayerV2Registry.instance().symbolLayerMetadata("SvgMarker").createSymbolLayer(qmap))
root_rule.removeChildAt(0)
qLayer.setRendererV2(renderer)
-------------------------------------------- Code Ende ------------------------------------------------------
Fast identisch ist das Ganze für Linien und Flächen.
Kann mir einer sagen, wie ich das Ganze jetzt für Beschriftungen (eines Punktlayers) umsetzen muss?
Vielen Dank schon mal
Steffen