La clase abstracta de C++, QgsFeatureRendererV2, en PyQGIS

En el párrafo final del post anterior se plasmó mi deseo de ahondar sobre las clases de qgis.gui que permiten la categorización o clasificación por atributos. Al filtrar por ‘Cat’, mediante ‘Get Pattern’, obtuve un sólo resultado:

    QgsCategorizedSymbolRendererV2Widget

Para instanciar esta clase hay que pasarle como parámetros objetos de las clases QgsVectorLayer, QgsStyleV2 y QgsFeatureRendererV2. Con relación a los dos primeros no existe problema en la instanciación pero, el último, representa a una clase abstracta de C++ y no puede ser instanciado de la manera usual en Python. Por tanto, me tocó buscar un poco por Internet y encontré un capítulo del “PyQGIS Developer Cookbook” que refiere la creación de renderizados personalizados. En ellos se utilizan objectos del tipo QgsFeatureRendererV2; pero se le pasan como parámetro a una clase Python.

Con el código de la clase ‘RandomRenderer’ (“PyQGIS Developer Cookbook”) hice un copy/paste en mi módulo personal utils.py, que se encuentra en /home/my_name_user/pyqgis_scripts, y le hice unas pequeñas modificaciones para corroborar algunos aspectos de ejecución. El resultado final se encuentra a continuación:

import random

class RandomRenderer(QgsFeatureRendererV2):
  def __init__(self, syms=None):
    QgsFeatureRendererV2.__init__(self, "RandomRenderer")
    self.syms = syms if syms else [QgsSymbolV2.defaultSymbol(QGis.Point), 
                                   QgsSymbolV2.defaultSymbol(QGis.Point),
                                   QgsSymbolV2.defaultSymbol(QGis.Point)]
    
  def symbolForFeature(self, feature):
    return random.choice(self.syms)

  def startRender(self, context, vlayer):
    for s in self.syms:
      s.startRender(context)

  def stopRender(self, context):
    for s in self.syms:
      s.stopRender(context)

  def usedAttributes(self):
    return []

  def clone(self):
    return RandomRenderer(self.syms)

El código anterior, para vectoriales tipo punto, modifica de manera aleatoria la simbología de los features ubicados en tres grupos; cuyo número dentro de cada grupo también varía aleatoriamente. Para probar el código utilicé el siguiente archivo principal (random_renderer.py):

from qgis.core import *
from qgis.gui import *
from PyQt4.QtGui import *
from PyQt4.QtCore import *

import utils
reload(utils)

from utils import RandomRenderer

renderer = RandomRenderer()

layer = iface.activeLayer()

layer.setRendererV2(renderer)

layer.triggerRepaint()

La imagen siguiente representa una secuencia de tres visualizaciones del Map Canvas después de tres ejecuciones en la Python Console de QGIS del código anterior.

random

Observe que alguno de los tres grupos puede quedar exento de renderizado.

Esta entrada fue publicada en PyQGIS, QGIS, SIG, Software Libre. Guarda el enlace permanente.

Una respuesta a La clase abstracta de C++, QgsFeatureRendererV2, en PyQGIS

  1. Pingback: La clase abstracta de C++ en qgis.gui: QgsRendererV2Widget | El Blog de José Guerrero

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s