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()
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()
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()
Correct answer by JULESG on August 10, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP