Renderizado de capas vectoriales basado en reglas utilizando PyQGIS

Con base en una pregunta realizada en http://gis.stackexchange.com/, a continuación expondré un ejemplo de código que puede ser ejecutado en la Python Console de QGIS que permite, en este caso, transformar el estilo ‘Single Symbol’ de un vectorial de línea con tres features, en un renderizado con base en reglas diferentes para cada uno de los features. El código es una adaptación de otro que aparece publicado en el Blog de snorfalorpagus dot net sobre la simbología de capas vectoriales en plugins para QGIS.

En el vectorial utilizado se creó un campo denominado “type” (“String”) para el cual, secuencialmente por id, se colocaron los alias siguientes: ‘first’, ‘second’ y ‘third’. Estos alias están referidos a los ‘label’ (‘Feature one’, ‘Feature two’ y ‘Feature three’) que aparecerán en la Map Legend de QGIS, para cada feature, cuando se ejecute el código. En la imagen siguiente se observa el vectorial considerado; con su correspondiente tabla de atributos.

rules1

El código propuesto es el siguiente:

from PyQt4.QtGui import *

# define some rules: label, expression, color name, width
my_rules = (
    ('Feature one', '"type" LIKE \'first\'', 'green', 2),
    ('Feature two', '"type" LIKE \'second\'', 'red', 2),
    ('Feature three', '"type" LIKE \'third\'', 'blue', 2),
)

layer = iface.activeLayer()

# create a new rule-based renderer
symbol = QgsSymbolV2.defaultSymbol(layer.geometryType())
renderer = QgsRuleBasedRendererV2(symbol)

# get the "root" rule
root_rule = renderer.rootRule()

for label, expression, color_name, width in my_rules:
    # create a clone (i.e. a copy) of the default rule
    rule = root_rule.children()[0].clone()
    # set the label, expression, color and width
    rule.setLabel(label)
    rule.setFilterExpression(expression)
    rule.symbol().setColor(QColor(color_name))
    rule.symbol().setWidth(width)
    # append the rule to the list of rules
    root_rule.appendChild(rule)

# delete the default rule
root_rule.removeChildAt(0)

# apply the renderer to the layer
layer.setRendererV2(renderer)

iface.mapCanvas().refresh()

La diferencia más importante de este código, con relación al del Blog de snorfalorpagus, es que en las reglas se sustituyó la escala por el ancho de línea de los features. El ancho es el único parámetro numérico y debe ser pasado como tal al método ‘setWidth’ del objeto QgsLineSymbolV2.

Cuando se ejecuta el código anterior en la Python Console de QGIS (line2 como capa activa) se obtiene lo siguiente:

rules2

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

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