[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