Tengo algunas capas con símbolos muy complejos definidos por los datos. Si utilizo una leyenda en el compositor de la impresión estos símbolos no se dibujan correctamente.
¿Hay alguna manera de cambiar los símbolos de la leyenda con pyqgis, para poder usar imágenes PNG o SVG personalizadas en lugar del símbolo de la leyenda por defecto para estas capas?
Sé cómo añadir un Pulsador al compositor de la impresión y cómo conectarlo con una función. Quiero añadir un botón a la Leyenda-Configuración que me permita reemplazar el icono de la leyenda generado automáticamente con una imagen personalizada. Así que lo que todavía necesito es la información de cómo puedo acceder a los símbolos de leyenda con pyqgis/pyqt, y cómo reemplazarlos con una imagen QImage en un QLabel o algo así?
Una maqueta muy básica del botón utilizado para cambiar el símbolo:
Leyenda generada automáticamente:
Leyenda con el símbolo de la leyenda personalizada:
Ya he averiguado cómo acceder a los elementos de la leyenda en el compositor de la impresión, pero aún no cómo acceder al símbolo en sí:
import qgis
from PyQt4.QtCore import *
from PyQt4.QtGui import *
activeComposer = iface.activeComposers()
for item in activeComposer:
if item.composerWindow().windowTitle()=='test':
for i in item.items():
if isinstance(i,QgsComposerLegend):
#print i
#print i.model()
legend = i
for i in xrange(legend.modelV2().rowCount()):
posteleg=legend.modelV2().index(i, 0)
print posteleg.data()
Edición 1:
También he descubierto cómo acceder a los objetos QIcon del árbol de la leyenda, pero aún no puedo intercambiarlos:
def run(self):
activeComposer = self.iface.activeComposers()
#print(self.resolve('icon.png'))
for item in activeComposer:
if item.composerWindow().windowTitle()=='test':
for i in item.items():
if isinstance(i,QgsComposerLegend):
legend = i
layerIcon = QIcon(os.path.join(os.path.dirname(__file__), "icon.png"))
for i in xrange(legend.modelV2().rowCount()):
posteleg=legend.modelV2().index(i, 0)
posteleg.model().iconGroup().swap(layerIcon)
print posteleg.data()
Aquí hay un ejemplo de la vida real en el que se puede ver una simbología combinada de muchas capas de símbolos: Esto terminará en la leyenda de esta manera:
Como necesito el símbolo adecuado en la leyenda me gustaría hacer una captura de pantalla de mi símbolo, recortarlo y usarlo como imagen en mi leyenda.
Sé que podría superponer una imagen separada sobre mi leyenda que cubra el símbolo generado automáticamente, pero me gustaría tener una solución "más limpia" que me permita reemplazar los símbolos de la leyenda con imágenes personalizadas.
Edición 2:
Mientras tanto, he encontrado otra forma de acceder a las entradas de la leyenda:
from qgis.core import QgsLegendRenderer, QgsComposerLegendStyle
compDict = {}
for comp in iface.activeComposers():
# workaround to get name: read it from window title
compDict[comp.composerWindow().windowTitle()] = comp.composition()
if "mycomposername" in compDict:
itemLlegend = compDict["mycomposername"].getComposerItemById("mylegend_id")
if itemLlegend:
print itemLlegend
tree_layer_layer = itemLlegend.modelV2().rootGroup().children()
for item in tree_layer_layer:
if item.layerName()=="MyLayername":
print "match"
QgsLegendRenderer.setNodeLegendStyle(item, QgsComposerLegendStyle.Group)
Esto me permite acceder a los objetos de QgsLayerTreeLayer y puedo cambiar la leyenda Estilo (Grupo,Subgrupo,Oculto). Pero todavía no tengo idea de cómo acceder al símbolo de la leyenda. ¿Alguna idea?
2 votos
Cuando me encuentro con esto con QGIS, suelo crear capas adicionales que tienen la simbología que quiero mostrar en la leyenda (normalmente simples duplicados de capas existentes - no nuevas fuentes de datos). Luego, en el compositor configuro la ventana del mapa y bloqueo las capas. Una vez bloqueadas las capas, activo las capas "falsas" y puedo añadirlas a la leyenda. Es puramente una solución, y no en PyQGIS, pero tal vez hay alguna manera de emular las capas "falsas" para lo que usted necesita?