#1 Mon 15 March 2021 14:19
- nico-29
- Participant assidu
- Lieu: Brest
- Date d'inscription: 2 Jun 2006
- Messages: 185
QGIS 3: affichage symbologie SVG
Bonjour,
Pour le développement d'un plugin, je dois ouvrir une couche vecteur et afficher une symbologie par catégories à base de symboles svg.
J'ai 'stocké' mes fichiers svg dans un fichier resources.qrc que j'ai compilé, j'ai donc un fichier .py que je déclare dans mes import.
Voici ma fonction pour ouvrir et afficher mon layer:
Code:
from qgis.core import ( QgsProject, QgsVectorLayer, QgsSymbol, QgsSimpleFillSymbolLayer, QgsRendererCategory, QgsCategorizedSymbolRenderer, QgsSvgMarkerSymbolLayer, QgsLineSymbol ) from PyQt5.QtWidgets import QFileDialog from .resources_rc2 import * # mon fichier compilé qui contient les symboles svg ... def open(self): filter = "geojson (*.geojson)" fileName, _ = QFileDialog.getOpenFileName(None, "geojson", "", filter) if fileName: print(fileName) vlayer = QgsVectorLayer(fileName, "myLayer", "ogr") print(vlayer.geometryType()) if not vlayer.isValid(): print("Layer failed to load!") else: QgsProject.instance().addMapLayer(vlayer) fni = vlayer.fields().indexFromName('code') unique_values = vlayer.uniqueValues(fni) categories = [] for unique_value in unique_values: # initialize the default symbol for this geometry type symbol = QgsSymbol.defaultSymbol(vlayer.geometryType()) # configure a symbol layer if unique_value == 'Cable': svgStyle = {} svgStyle['name'] = ':/resources/symbols/line/CBLSUB06.svg' svgStyle['size'] = '12' symbol_layer = QgsSvgMarkerSymbolLayer.create(svgStyle) else: layer_style = {} layer_style['color'] = '%d, %d, %d' % (randrange(0, 256), randrange(0, 256), randrange(0, 256)) 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('code', categories) # assign the created renderer to the layer if renderer is not None: vlayer.setRenderer(renderer) vlayer.triggerRepaint()
Je n'ai pas d'erreur au chargement, mais mon style avec le symbole svg n'est pas pris en compte (pourtant il passe bien dans la boucle if), et les objet de type 'Cable' sont affichés avec une ligne de couleur aléatoire.
Comment appliquer le style svg?
Merci, Nico
Hors ligne
#2 Mon 15 March 2021 15:23
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3946
Re: QGIS 3: affichage symbologie SVG
Bonjour,
svgStyle['name'] = ':/resources/symbols/line/CBLSUB06.svg'
Quid avec path plutôt que name? Et le format du chemin est correct, là ()?
Hors ligne
#3 Mon 15 March 2021 18:24
- nico-29
- Participant assidu
- Lieu: Brest
- Date d'inscription: 2 Jun 2006
- Messages: 185
Re: QGIS 3: affichage symbologie SVG
Dans tous les exemples que j'ai vu, c'est 'name' et non 'path'.
J'ai essayé de mettre le chemin absolu vers le fichier svg, ça ne marche pas non plus, donc il doit y avoir autre chose...
Hors ligne
#4 Mon 15 March 2021 19:15
- dominique.lys
- Participant assidu
- Date d'inscription: 5 Oct 2006
- Messages: 473
- Site web
Re: QGIS 3: affichage symbologie SVG
Salut,
J'ai cet exemple en stock :
Code:
svgSymbol = QgsSvgMarkerSymbolLayer.create() path = QgsProperty() path.setActive(True) path.setExpressionString("@project_folder + '/pictos/ico_" + iconName + ".svg'") svgSymbol.setDataDefinedProperty(QgsSvgMarkerSymbolLayer.PropertyName, path )
Hors ligne
#5 Tue 16 March 2021 05:58
- nico-29
- Participant assidu
- Lieu: Brest
- Date d'inscription: 2 Jun 2006
- Messages: 185
Re: QGIS 3: affichage symbologie SVG
C'est pas mieux.
Il n'y a pas d'erreur à l'exécution, mais les symboles svg ne s'affichent pas.
comment faire pour afficher dans la console la valeur de @project_folder?
Dernière modification par nico-29 (Tue 16 March 2021 06:38)
Hors ligne
#6 Tue 16 March 2021 08:43
- nico-29
- Participant assidu
- Lieu: Brest
- Date d'inscription: 2 Jun 2006
- Messages: 185
Re: QGIS 3: affichage symbologie SVG
Avec un layer de type point, la syntaxe fonctionne pour le chemin du symbole :
Code:
"name": ":/resources/symbols/point/transport_bus_station.svg",
Nico
Hors ligne
#7 Tue 16 March 2021 11:31
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3946
Re: QGIS 3: affichage symbologie SVG
Bonjour,
Certainement parce qu'une entité ponctuelle peut être représentée par un symbole de type marqueur (svg ici). Vous ne pouvez pas représenter une entité linéaire de la sorte; le symbole svg ne peut être qu'un sous-élément du symbole linéaire.
Je pense qu'il faut un peu investiguer dans cette logique d'une QgsLineSymbolLayer mais je n'y connais pas grand chose. Peut-être trouverez-vous une piste dans la doc (ps: Je la trouve très orientée sur le symbole marqueur donc si vous vous en sortez avec les lignes, compléter la doc avec un exemple serait un plus. Je veux bien aider, au cas où ça vous dit).
Hors ligne
#8 Mon 22 March 2021 18:35
- nico-29
- Participant assidu
- Lieu: Brest
- Date d'inscription: 2 Jun 2006
- Messages: 185
Re: QGIS 3: affichage symbologie SVG
J'ai trouvé à partir de ce post :
https://gis.stackexchange.com/questions … ing-python
du coup, ça donne :
Code:
line = QgsLineSymbol() marker_line = QgsMarkerLineSymbolLayer() marker_line.setInterval(5) svgStyle = {} svgStyle['name'] = ':/path/to/svg/symbol.svg' svgStyle['size'] = '2' simple_marker = QgsSvgMarkerSymbolLayer.create(svgStyle) simple_marker.setAngle(90) marker = QgsMarkerSymbol() marker.changeSymbolLayer(0, simple_marker) marker_line.setSubSymbol(marker) line.changeSymbolLayer(0, marker_line) renderer = QgsSingleSymbolRenderer(line) self.layer.setRenderer(renderer) self.layer.triggerRepaint()
Nico
Hors ligne