1

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()

Taras
  • 32,823
  • 4
  • 66
  • 137
cam_gis
  • 93
  • 1
  • 11

1 Answers1

2

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

JULESG
  • 1,627
  • 3
  • 12