¿Controlando el etiquetado basado en reglas usando PyQGIS?

15

Después de esta pregunta: Cómo activar / desactivar todas las etiquetas de todas las capas en QGIS , OP se menciona en su comment que usa etiquetas basadas en reglas. Intenté buscar en línea cómo se podían leer y modificar estos tipos de etiquetas, pero solo conseguí encontrar esto publicación de lutraconsulting :

  

Para facilitar la adición del etiquetado basado en reglas, se realizaron algunos cambios internos en la interfaz del motor de etiquetado QGIS. El etiquetado ahora está dirigido por la nueva clase QgsLabelingEngineV2 que puede tener asociados varios proveedores de etiquetas.

Suena genial. Sin embargo, al leer la clase QgsLabelingEngineV2 , menciona:

  

esta clase no es parte de la API pública todavía.

¿Actualmente es posible controlar el etiquetado basado en reglas usando python?

    
pregunta Joseph 31.01.2017 - 12:35

3 respuestas

5

A continuación, encontrará ayuda para configurar el etiquetado basado en reglas desde cero con la nueva API de 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()

Desafortunadamente no puedo encontrar la manera de iterar sobre las reglas existentes, labeling () disponible para capas vectoriales devuelve un objeto de QgsAbstractVectorLayerLabeling class pero parece que no hay forma de obtener la regla de raíz ( QgsRuleBasedLabeling ) de esta clase, La única posibilidad que encontré es obtener configuraciones de pal directamente usando los ID de los proveedores, pero no puedo acceder al árbol de reglas. ¿Alguien tiene una pista?

EDIT

Ahora está arreglado, la función labeling () devuelve una QgsRuleBasedLabeling (): link

    
respondido por el domlysz 03.02.2018 - 09:54
3

De QGIS 3 , hay una nueva QgsRuleBasedLabeling Class que le permitiría controlar etiquetado basado en reglas utilizando la nueva API.

Las reglas se pueden agregar utilizando QgsRuleBasedLabeling :: Rule .

( Lamentablemente, no puedo probar la versión 2.99 en este momento. Pero con mucho gusto aceptaría una respuesta si proporciona un ejemplo funcional. )

    
respondido por el Joseph 01.08.2017 - 13:13
2

Esto es lo que uso para cambiar una expresión de filtro en la simbología basada en reglas en QGIS 2.18, no estoy seguro de si eso es lo que estás pidiendo. Referencia de API en enlace

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)
    
respondido por el weiji14 14.03.2017 - 03:01

Lea otras preguntas en las etiquetas