9 votos

Aplicar un símbolo categorizado a cada característica utilizando PyQGIS

Quiero aplicar un símbolo único a cada característica. He utilizado el siguiente código para hacerlo

from qgis.core import *
from PyQt4.QtGui import *
# supply path to where is your qgis installed
QgsApplication.setPrefixPath("/path/to/qgis/installation", True)
# load providers
QgsApplication.initQgis()

# Get the active layer (must be a vector layer)
layer = qgis.utils.iface.activeLayer();
iter = layer.getFeatures();
for feature in iter:
    geom = feature.geometry()
    print "Feature ID %d: " % feature.id()
    qgis.utils.iface.mapCanvas().setSelectionColor( QColor("yellow") );
    layer.setSelectedFeatures([feature.id()])
    qgis.utils.iface.mapCanvas().zoomToSelected( layer )
    qgis.utils.iface.mapCanvas().refresh()
    selected_features = layer.selectedFeatures()
    for i in selected_features:
       attr =i.attributes()
    chaltano= str(attr[layer.fieldNameIndex('test')])
    renderer = QgsCategorizedSymbolRendererV2("test")
    layer.setRendererV2(renderer)
    symbol = QgsSymbolV2.defaultSymbol(layer.geometryType())
    symbol.setColor(QColor("red"))
    cat = QgsRendererCategoryV2(feature.id(), symbol,str(feature.id()))
    renderer.addCategory(cat)

El símbolo se aplica sólo a la última característica. Aquí, "test" es el atributo.

12voto

Para aquellos que quieran probar el código anterior para la versión PyQGIS3, aquí está mi adaptación (funciona para la "capa activa" si se ejecuta desde la consola ...).

# provide file name index and field's unique values
from random import randrange

layer = iface.activeLayer()
fni = layer.fields().indexFromName('nom')
unique_values = layer.uniqueValues(fni)

# fill categories
categories = []
for unique_value in unique_values:
    # initialize the default symbol for this geometry type
    symbol = QgsSymbol.defaultSymbol(layer.geometryType())

    # configure a symbol layer
    layer_style = {}
    layer_style['color'] = '%d, %d, %d' % (randrange(0, 256), randrange(0, 256), randrange(0, 256))
    layer_style['outline'] = '#000000'
    symbol_layer = QgsSimpleFillSymbolLayer.create(layer_style)

    # replace default symbol layer with the configured one
    if symbol_layer is not None:
        symbol.changeSymbolLayer(0, symbol_layer)

    # create renderer object
    category = QgsRendererCategory(unique_value, symbol, str(unique_value))
    # entry for the list of category items
    categories.append(category)

# create renderer object
renderer = QgsCategorizedSymbolRenderer('nom', categories)

# assign the created renderer to the layer
if renderer is not None:
    layer.setRenderer(renderer)

layer.triggerRepaint()

11voto

hyty Puntos 91

Para dibujar una capa con un renderizador categorizado, primero debe crear las categorías adecuadas. Una categoría necesita valor, símbolo y etiqueta. Si conoce los valores en el momento del diseño puede definir estos 3 parámetros para cada categoría. Para un ejemplo vea QGIS Python Programming Cookbook.

Después de definir las categorías se crea un QgsCategorizedSymbolRendererV2() con estas categorías, y se asigna este renderizador a la capa.

Mi código siguiente crea una categoría para cada valor único en un campo determinado, con un color aleatorio. Anulo el símbolo por defecto para permitir cierta flexibilidad en el estilo.

from random import randrange

# Get the active layer (must be a vector layer)
layer = qgis.utils.iface.activeLayer()

# get unique values 
fni = layer.fieldNameIndex('test')
unique_values = layer.dataProvider().uniqueValues(fni)

# define categories
categories = []
for unique_value in unique_values:
    # initialize the default symbol for this geometry type
    symbol = QgsSymbolV2.defaultSymbol(layer.geometryType())

    # configure a symbol layer
    layer_style = {}
    layer_style['color'] = '%d, %d, %d' % (randrange(0,256), randrange(0,256), randrange(0,256))
    layer_style['outline'] = '#000000'
    symbol_layer = QgsSimpleFillSymbolLayerV2.create(layer_style)

    # replace default symbol layer with the configured one
    if symbol_layer is not None:
        symbol.changeSymbolLayer(0, symbol_layer)

    # create renderer object
    category = QgsRendererCategoryV2(unique_value, symbol, str(unique_value))
    # entry for the list of category items
    categories.append(category)

# create renderer object
renderer = QgsCategorizedSymbolRendererV2('test', categories)

# assign the created renderer to the layer
if renderer is not None:
    layer.setRendererV2(renderer)

layer.triggerRepaint()

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X