[FOSSGIS-Talk] QGIS: regelbasierte Beschriftung für ein PlugIn

Neumann, Andreas a.neumann at carto.net
Mo Mai 23 13:53:59 CEST 2016


Hallo Steffen, 

Das Projektfile (.qgs) ist ja auch nicht ident mit den nötigen
API-Befehlen. Das ist bei praktisch keiner Software so. 

Falls deine Beschriftungsregeln immer gleich sind, ist es ev. einfacher
diese in eine .qml-Datei zu speichern und dann alle Einstellungen aufs
Mal aus der .qml-Datei per Python (oder manuell) zu laden anstatt jede
einzelne Einstellung per Script vorzunehmen. 

Die Beschriftungseinstellungen werden ja auch in der .qml-Datei
abgespeichert. 

Nur als Idee. Vielleicht hilft dir das. 

Schöne Grüsse, 

Andreas 

On 2016-05-23 10:28, Junghans, S. Hr. wrote:

> 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
> --
> ....................................................................
> FOSSGIS 2016, Die Konferenz für Open Source GIS mit OpenData und
> OpenStreetMap in Zusammenarbeit mit der AGIT 2016!
> 4.-6. Juli 2016 in Salzburg (3. Juli OpenStreetMap Workshoptag)
> http://www.fossgis.de/konferenz/2016/
> 
> AGIT 2016 vom 6.-8. Juli 2016
> http://agit.at/
> 
> FOSS4G 2016 Bonn - annual global event of the Open Source Geospatial
> Foundation (OSGeo) - 24.-26. August 2016 in Bonn (zusätzlich noch
> FOSS4G Hacking Event und Workshops)
> http://2016.foss4g.org
> 
> FOSSGIS e.V, der Verein zur Förderung von Freier Software aus dem
> GIS-Bereich und Freier Geodaten!
> http://www.fossgis.de/             https://twitter.com/fossgis_eV
> 
> ____________________________________________________________________
> FOSSGIS-Talk-Liste mailing list
> FOSSGIS-Talk-Liste at fossgis.de
> https://lists.fossgis.de/mailman/listinfo/fossgis-talk-liste