Symbologie
Bon allez, retour aux choses sérieuses🤓!Symbologie simple sur des points
Pour appliquer une symbologie simple sur nos points, les sommets enregistrés dans la variable my_layer
:
my_layer = QgsProject.instance().mapLayersByName("Sommets")[0] symbol_peak = QgsMarkerSymbol.createSimple({'name': 'Triangle', 'color': 'green', 'outline_color': 'black', 'size': '4'}) mylayer.renderer().setSymbol(symbol_peak) mylayer.triggerRepaint()
Symbologie simple sur des lignes
Cette fois on précise la couleur en HTML.
myroads = QgsProject.instance().mapLayersByName("Routes")[0] myrivers = QgsProject.instance().mapLayersByName("Fleuves")[0] # Symbologie simple de la couche route symbol = QgsLineSymbol.createSimple({'line_style': 'dash', 'line_width': '0.5', 'color': 'black'}) myroads.renderer().setSymbol(symbol) myroads.triggerRepaint() # Symbologie simple de la couche eau symbol = QgsLineSymbol.createSimple({'line_style': 'solid', 'line_width': '0.75', 'color': '#0088CC'}) myrivers.renderer().setSymbol(symbol) myrivers.triggerRepaint()
Symbologie simple sur des polygones
Cette fois on précise la couleur en RGB (50,165,77,75
), afin d'ajouter un peu de transparence (ici 75, l'indice allant de 0 à 255), et on rafraîchit le panneau des couches afin que notre légende y soit aussi prise en compte :
symbol = QgsFillSymbol.createSimple({'line_style': 'solid', 'line_width': '0.2', 'color': '50,165,77,75'}) myground.renderer().setSymbol(symbol) myground.triggerRepaint() iface.layerTreeView().refreshLayerSymbology(myground.id())
Il est aussi possible d'examiner les propriétés de symbologie d'un layer :
print(my_layer.renderer().symbol().symbolLayers()[0].properties())
Symbologie catégorisée
Pour une symbologie catégorisée, il va nous falloir définir plusieurs symbologies, puis les attribuer en fonction de valeurs attributaires.
Ici nous mettons tous nos sommets en triangle bleu (▲, puis nous allons chercher un sommet unique en se basant sur son nom (Aiguille de la Gandolière, dans le champ NAME). Celui-ci passera en triangle bleu foncé et de plus grande taille (▲).
symbol_peak = QgsMarkerSymbol.createSimple({'name': 'Triangle', 'color': '#0088CC', 'outline_color': 'black', 'size': '4'}) symbol_peak_selected = QgsMarkerSymbol.createSimple({'name': 'Triangle', 'color': 'blue', 'outline_color': 'black', 'size': '7'}) color_peak = QgsRendererCategory(None, symbol_peak, 'Sommets', True) color_peak_selected = QgsRendererCategory('Aiguille de la Gandolière', symbol_peak_selected, 'Aiguille de la Gandolière', True) renderer = QgsCategorizedSymbolRenderer('NAME', [color_peak,color_peak_selected]) mylayer.setRenderer(renderer) mylayer.triggerRepaint()
Les 2 premières lignes définissent les symbologies que nous utiliserons, puis dans les lignes 4 et 5, la méthode QgsRendererCategory
prend 4 arguments, dans l'ordre :
- La valeur recherchée dans le champ pour l'attribution de la symbologie
- La symbologie
- Le label à afficher dans la légende pour cette catégorie
- Un booléen, pour l'application ou non de cette symbologie
Puis c'est la ligne 7 qui vient exécuter les conditions, avec 2 arguments :
- Le nom de champ où rechercher les valeurs
- Un tableau contenant les conditions à appliquer
Symbologie dynamique
Nous n'avons plus qu'à utiliser une variable pour gérer la symbologie dans la boucle de génération de nos cartes.
La variable contenant le nom du sommet sélectionné existe déjà dans notre code, et a déjà été passé en texte (layoutName
). C'est que nous utiliserons, à la fois dans l'argument value (pour filtrer le champ NAME sur cette valeur) et dans l'argument label (pour l'afficher dans la légende).
... for feat in mylayer.getFeatures(): ... peak_name = feat['NAME'] ... layoutName = str(peak_name) ... # Symbologie catégorisée dynamique symbol_peak = QgsMarkerSymbol.createSimple({'name': 'Triangle', 'color': '#0088CC', 'outline_color': 'black', 'size': '4'}) symbol_peak_selected = QgsMarkerSymbol.createSimple({'name': 'Triangle', 'color': 'blue', 'outline_color': 'black', 'size': '7'}) color_peak = QgsRendererCategory(None,symbol_peak,"Autres sommets",True) color_peak_selected = QgsRendererCategory(layoutName,symbol_peak_selected,layoutName,True) renderer = QgsCategorizedSymbolRenderer("NAME", [color_peak,color_peak_selected]) mylayer.setRenderer(renderer) mylayer.triggerRepaint() # Charger une carte vide map = QgsLayoutItemMap(layout) map.setRect(20, 20, 20, 20) ...
Logique de programmation
Pour fonctionner, la symbologie dynamique doit donc se trouver :
- Après la création de la variable
peak_name
(sinon la symbologie dynamique ne saura pas quel sommet prendre, puisquepeak_name
devient ensuitelayoutName
, variable utilisée dans l'une des conditions de notre symbologie) - Après la création de la variable
layoutName
(sinon elle ne saura pas l'utiliser en tant que chaîne de texte) - Avant la mise à jour du canvas (ce point n'est pas réellement nécessaire, mais il correspond à une logique de programmation et de lecture/compréhension de notre code)
- Avant la mise à jour de la légende (puisque la symbologie apparaît dans la legénde. Là encore il n'est pas certain que cela soit nécessaire, mais ce n'est que pure logique itérative, procédurale)
Votre code doit pouvoir être aisément lu et compris par vous-même ou quelqu'un d'autre. Un jour vous souhaiterez peut-être le ré-utiliser et l'enrichir. Respecter une logique de prommation et bien commenter votre code n'est pas anodin.
- Note personnelle : gérer les sauts de ligne et la taille de la légende quand le nom du sommet selectionné est trop long (déborde de la carte).
OK, mais nous pouvons aller encore un peu plus loin dans les contenus de nos cartes.