Personalizando simbología en vectoriales tipo polígono mediante PyQGIS

Para personalizar la simbología en vectoriales tipo polígono mediante PyQGIS también se puede recurrir al método ‘createSimple’; pero en este caso de la clase QgsFillSymbolV2. Este método, al igual que en QgsMarkerSymbolV2 y QgsLineSymbolV2, usa keywords en un diccionario para definir la apariencia del nuevo símbolo (symbol). Las keywords para cada symbol son las siguientes:

    1. border_width_unit: MM or MapUnit
    2. color: Specified using any of the QColor constructor methods
    3. color_border: Specified using any of the QColor constructor methods
    4. offset: Specified as an x,y integer offset
    5. offset_unit: MM or MapUnit
    6. style: ‘solid’, ‘horizontal’, ‘vertical’, ‘cross’, ‘b_diagonal’, ‘f_diagonal’, ‘diagonal_x’, ‘dense1’, ‘dense2’, 7. ‘dense3’, ‘dense4’, ‘dense5’, ‘dense6’, ‘dense7’
    8. style_border: ‘no’, ‘solid’, ‘dash’, ‘dot’, ‘dash dot’, ‘dash dot dot’
    9. width_border: Integer value

Para probar este procedimiento utilicé el shapefile de Alaka que bajé de este link:

data (shapefiles)

El despliegue del shapefile en QGIS es el siguiente:

alaska

Este shapefile tiene 653 features (el de cat 600 es el que ocupa la mayor extensión) y ya presenta un patrón de renderizado propio, es decir, no es generado aleatoriamente por QGIS. Para averiguar sobre su simbología hacemos lo siguiente (después de asegurarnos que es la capa activa):

>>>alk = iface.activeLayer()
>>>renderer = alk.rendererV2()
>>>symbol = renderer.symbol()
>>>symbol
<qgis.core.QgsFillSymbolV2 object at 0x2140A978>
>>>dir(QgsFillSymbolV2)
['DataDefinedRotation', 'DataDefinedSizeScale', 'Fill', 'Line', 
'MM', 'MapUnit', 'Marker', 'Mixed', 'OutputUnit', 'RenderHint', 
'ScaleArea', 'ScaleDiameter', 'ScaleMethod', 'SymbolType', 
'__class__', '__delattr__', '__dict__', '__doc__', '__format__', 
'__getattribute__', '__hash__', '__init__', '__module__', 
'__new__', '__reduce__', '__reduce_ex__', '__repr__', 
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', 
'__weakref__', 'alpha', 'appendSymbolLayer', 'bigSymbolPreviewImage', 
'changeSymbolLayer', 'clone', 'cloneLayers', 'color', 
'createSimple', 'defaultSymbol', 'deleteSymbolLayer', 
'drawPreviewIcon', 'dump', 'insertSymbolLayer', 'isSymbolLayerCompatible', 
'layer', 'outputUnit', 'renderHints', 'renderPolygon', 'setAlpha', 
'setAngle', 'setColor', 'setLayer', 'setOutputUnit', 'setRenderHints', 
'startRender', 'stopRender', 'symbolLayer', 'symbolLayerCount', 
'takeSymbolLayer', 'toSld', 'type', 'usedAttributes']
>>>symbol.dump()
u'FILL SYMBOL (2 layers) color 241,244,199,255'
>>>symbol.symbolLayerCount()
2
>>>symbol.symbolLayer(0).properties()
{u'style': u'solid', u'offset_unit': u'MM', u'color': u'241,244,\
199,255', u'color_border': u'0,128,255,255', u'offset': u'0,0', \
u'style_border': u'solid', u'border_width_unit': u'MM', \
u'width_border': u'0.26'}
>>>symbol.symbolLayer(1).properties()
{u'displacement_y_unit': u'MM', u'displacement_x': u'0', \
u'displacement_y': u'1', u'displacement_x_unit': u'MM', \
u'distance_x_unit': u'MM', u'distance_y_unit': u'MM', \
u'distance_x': u'1.5', u'distance_y': u'2'}
>>>symbol.color()
<PyQt4.QtGui.QColor object at 0x21409998>
>>>symbol.color().name()
u'#f1f4c7'
>>>QgsFillSymbolV2.Fill
2
>>>symbol.type() == QgsFillSymbolV2.Fill
True

Lo más relevante es que es un symbol con dos capas. Vamos a crear un símbolo de una sola capa con un patrón tipo ‘cross’ de color naranja. Las opciones serían entonces:

>>>symbol2 = QgsFillSymbolV2.createSimple({'style':'cross', 'color':'orange'})
>>>renderer.setSymbol(symbol2)
>>>iface.mapCanvas().refresh()
>>>iface.legendInterface().refreshLayerSymbology(alk)

A continuación la imagen de los resultados:

alaska2

y una caracterización de symbol2 en la Python Console:

>>>symbol2.dump()
u'FILL SYMBOL (1 layers) color 255,165,0,255'
>>>symbol2.symbolLayerCount()
1
>>>symbol2.symbolLayer(0).properties()
{u'style': u'cross', u'offset_unit': u'MM', u'color': u'255,165,\
0,255', u'color_border': u'0,0,0,255', u'offset': u'0,0', \
u'style_border': u'solid', u'border_width_unit': u'MM', \
u'width_border': u'0.26'}

Lo anterior nos ayuda a comprobar cuales son las opciones por defecto en el constructor de la clase QgsFillSymbolV2.

Esta entrada fue publicada en Código Python, PyQGIS, 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