Tengo algunas capas con símbolos muy complejos definidos por datos. Si uso una leyenda en el compositor de impresión, estos símbolos no se dibujan correctamente.
¿Hay alguna manera de cambiar los símbolos de leyenda con pyqgis, para que pueda usar imágenes PNG o SVG personalizadas en lugar del símbolo de leyenda predeterminado para estas capas?
Sé cómo agregar un botón al compositor de impresión y cómo conectarlo con una función. Quiero agregar un botón a la configuración de leyenda para permitirme reemplazar el icono de leyenda generado automáticamente con una imagen personalizada. Entonces, lo que aún 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 QImage en un QLabel o algo así.
Maqueta muy básica del botón utilizado para cambiar el símbolo:
Leyenda generada automáticamente:
Leyenda con símbolo de leyenda personalizado:
Ya descubrí cómo acceder a los elementos de la leyenda en el compositor de 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()
Editar 1:
También descubrí cómo acceder a los objetos QIcon del árbol de leyendas, pero todavía 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 donde 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 apropiado en la leyenda, me gustaría hacer una captura de pantalla de mi símbolo, recortarlo y usarlo como una imagen en mi leyenda.
Sé que podría superponer una imagen separada en la parte superior de mi leyenda que cubre el símbolo generado automáticamente, pero me gustaría tener una solución "más limpia" que me permita reemplazar los símbolos en la leyenda con imágenes personalizadas.
Edición 2:
Mientras tanto, he encontrado otra forma de obtener acceso 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 QgsLayerTreeLayer y puedo cambiar el estilo de la leyenda (Grupo, Subgrupo, Oculto). Pero todavía no tengo idea de cómo acceder al símbolo de la leyenda. ¿Algunas ideas?