banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

GEODATA DAYS 2024

#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: 3880

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à (hmm)?

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: 3880

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

 

Pied de page des forums

Powered by FluxBB