Index de l'article

Symbologie dynamique

Symbologie simple sur des points

Pour appliquer une symbologie simple sur nos points, les sommets enregistrés dans la variable my_layer :

  1. my_layer = QgsProject.instance().mapLayersByName("Sommets")[0]
  2.  
  3. symbol_peak = QgsMarkerSymbol.createSimple({'name': 'Triangle', 'color': 'green', 'outline_color': 'black', 'size': '4'})
  4. mylayer.renderer().setSymbol(symbol_peak)
  5. mylayer.triggerRepaint()

Symbologie simple sur des lignes

Cette fois on précise la couleur en HTML.

  1. myroads = QgsProject.instance().mapLayersByName("Routes")[0]
  2. myrivers = QgsProject.instance().mapLayersByName("Fleuves")[0]
  3.  
  4. # Symbologie simple de la couche route
  5. symbol = QgsLineSymbol.createSimple({'line_style': 'dash', 'line_width': '0.5', 'color': 'black'})
  6. myroads.renderer().setSymbol(symbol)
  7. myroads.triggerRepaint()
  8.  
  9. # Symbologie simple de la couche eau
  10. symbol = QgsLineSymbol.createSimple({'line_style': 'solid', 'line_width': '0.75', 'color': '#0088CC'})
  11. myrivers.renderer().setSymbol(symbol)
  12. 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,  :

  1. symbol = QgsFillSymbol.createSimple({'line_style': 'solid', 'line_width': '0.2', 'color': '50,165,77,75'})
  2. myground.renderer().setSymbol(symbol)
  3. myground.triggerRepaint()
  4. 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 ().

  1. symbol_peak = QgsMarkerSymbol.createSimple({'name': 'Triangle', 'color': '#0088CC', 'outline_color': 'black', 'size': '4'})
  2. symbol_peak_selected = QgsMarkerSymbol.createSimple({'name': 'Triangle', 'color': 'blue', 'outline_color': 'black', 'size': '7'})
  3.  
  4. color_peak = QgsRendererCategory(None,symbol_peak,"Sommet",True)
  5. color_peak_selected = QgsRendererCategory("Aiguille de la Gandolière",symbol_peak_selected,"Aiguille de la Gandolière",True)
  6.  
  7. renderer = QgsCategorizedSymbolRenderer("NAME", [color_peak,color_peak_selected])
  8.  
  9. mylayer.setRenderer(renderer)
  10. 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).

  1. ...
  2. for feat in mylayer.getFeatures():
  3. ...
  4. peak_name = feat['NAME']
  5. ...
  6. layoutName = str(peak_name)
  7. ...
  8. # Symbologie catégorisée dynamique
  9. symbol_peak = QgsMarkerSymbol.createSimple({'name': 'Triangle', 'color': '#0088CC', 'outline_color': 'black', 'size': '4'})
  10. symbol_peak_selected = QgsMarkerSymbol.createSimple({'name': 'Triangle', 'color': 'blue', 'outline_color': 'black', 'size': '7'})
  11.  
  12. color_peak = QgsRendererCategory(None,symbol_peak,"Autres sommets",True)
  13. color_peak_selected = QgsRendererCategory(layoutName,symbol_peak_selected,layoutName,True)
  14.  
  15. renderer = QgsCategorizedSymbolRenderer("NAME", [color_peak,color_peak_selected])
  16.  
  17. mylayer.setRenderer(renderer)
  18. mylayer.triggerRepaint()
  19.  
  20. # Charger une carte vide
  21. map = QgsLayoutItemMap(layout)
  22. map.setRect(20, 20, 20, 20)
  23. ...

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, puisque peak_name devient ensuite layoutName, 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)

 

  • Note personnelle : ici prévoir exposé sur les grandes logiques de programmation existantes.

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.

 

Liens ou pièces jointes
Accéder à cette adresse URL (https://hg-map.fr/extern/data/shapes/france/chemin_de_fer.zip)chemin_de_fer.zip[ ]0 Ko
Télécharger ce fichier (data_BDTOPO_V3_Dep05_adresse.zip)data_BDTOPO_V3_Dep05_adresse.zip[ ]3889 Ko
Télécharger ce fichier (data_IRIS_2019.zip)data_IRIS_2019.zip[ ]45905 Ko
Télécharger ce fichier (decathlon_france.zip)decathlon_france.zip[308 magasins Décathlon français depuis OSM le 27 décembre 2020]11 Ko
Accéder à cette adresse URL (https://hg-map.fr/extern/data/shapes/france/eau.zip)eau.zip[ ]0 Ko
Télécharger ce fichier (glaciers.zip)glaciers.zip[ ]231 Ko
Télécharger ce fichier (iso_iris.zip)iso_iris.zip[Des zones isochrones à 15 minutes autour de 308 POIs.]12125 Ko
Télécharger ce fichier (Koln GML.zip)Koln gml.zip[ ]2818 Ko
Télécharger ce fichier (peaks.zip)peaks.zip[ ]14 Ko
Télécharger ce fichier (peaks_selection.zip)peaks_selection.zip[ ]1 Ko
Télécharger ce fichier (simple_countries.zip)simple_countries.zip[ ]1880 Ko
Accéder à cette adresse URL (https://hg-map.fr/extern/data/shapes/france/sol.zip)sol.zip[ ]0 Ko
Accéder à cette adresse URL (https://hg-map.fr/extern/data/shapes/france/troncons_routes.zip)troncons_routes.zip[ ]0 Ko