TransWikia.com

Creating categorized renderer with SVG symbols using PyQGIS

Geographic Information Systems Asked on August 10, 2021

I’m trying to create a renderer with SVG symbols and I can’t seem to find any example on this. Inspired from categorized renderer for regular symbols, I wrote this, but I get an error saying that the arguments in QgsSvgMarkerSymbolLayer() have the wrong type. I tried to change the data type but it still won’t accept it.

The name of my categories are in the field "situation" and are "potentielle" and "existante", which need to match the icons in "statut_red" and "statut_blue".

Can anyone help?

#define the markers
statut_red = QgsSvgMarkerSymbolLayer(""+ path +"bloc1_typologieR.svg")
statut_blue = QgsSvgMarkerSymbolLayer(""+ path +"bloc1_typologieB.svg")

#define categories
c1_statut = QgsRendererCategory(statut_blue, "existante", True)
c2_statut = QgsRendererCategory(statut_red, "potentielle", True)

#create the renderer
statut_renderer = QgsCategorizedSymbolRenderer("situation", [c1_statut, c2_statut])
gares_asof0305.setRenderer(statut_renderer)

gares_asof0305.triggerRepaint()

One Answer

First of all you need to construct your QgsSvgMarkerSymbolLayer with parameters, a dictionnary with the path and other caracteristics such as size or color. For the QgsRenderCategory you need to specify the value, the QgsSymbol and then the string. Depending on the type of your layer I give you two snippets of code that should work.

My answer is based on the answer of the post Automatic pyqgis categorized renderer classification [duplicate] by fuzzysolutions

If your layer is a point layer :

values = {"existante", "potentielle"}
categories = []
for value in values:    
    svgStyle = {}
    svgStyle['fill'] = '#000000'
    if value == "existante" :
        svgStyle['name'] = path + "bloc1_typologieB.svg"
    elif value == "potentielle" :
        svgStyle['name'] = path + "bloc1_typologieR.svg"
    svgStyle['outline'] = '#000000'
    svgStyle['outline-width'] = '0.3'
    svgStyle['size'] = '7'
    statut = QgsSvgMarkerSymbolLayer.create(svgStyle)

    symbol = QgsSymbol.defaultSymbol(gares_asof0305.geometryType())
    symbol.appendSymbolLayer(statut)
    
    category = QgsRendererCategory(value, symbol, str(value))
    categories.append(category)

renderer = QgsCategorizedSymbolRenderer('situation', categories)

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

gares_asof0305.triggerRepaint()

point_layer

if your layer is a polygon layer :

values = {"existante", "potentielle"}
categories = []
for value in values:    
    svgStyle = {}
    svgStyle['fill'] = '#000000'
    if value == "existante" :
        svgStyle['name'] = path + "bloc1_typologieB.svg"
    elif value == "potentielle" :
        svgStyle['name'] = path + "bloc1_typologieR.svg"
    svgStyle['outline'] = '#000000'
    svgStyle['outline-width'] = '0.3'
    svgStyle['size'] = '7'
    statut = QgsSvgMarkerSymbolLayer.create(svgStyle)

    symbol = QgsSymbol.defaultSymbol(gares_asof0305.geometryType())
    centroid_symbol = QgsCentroidFillSymbolLayer.create()
    centroid_symbol.setColor(QColor("transparent"))
    colorP = QtGui.QColor(255, 255, 255, 255)
    marker_symbol = QgsMarkerSymbol()
    marker_symbol.changeSymbolLayer(0, statut)
    centroid_symbol.setSubSymbol(marker_symbol)
    symbol.appendSymbolLayer(centroid_symbol)
    
    category = QgsRendererCategory(value, symbol, str(value))
    categories.append(category)

renderer = QgsCategorizedSymbolRenderer('situation', categories)

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

gares_asof0305.triggerRepaint()

polygon_layer

Correct answer by JULESG on August 10, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP