#1 Tue 14 October 2025 09:10
- Sofia2025
- Participant occasionnel
- Date d'inscription: 15 May 2025
- Messages: 14
QGIS/Etiquettes: optimisation du code
Bonjour
Je continue a explorer le codage pour affiner les etiquettes sur QGIS.
J'ai redigé un code qui fonctionne tres bien mais il est repetitif (1000 lignes de code pour 67 champs des données, 67 champs ne sont pas optimisables, donnée format chiffre entier)
ça marche sans probleme mais a cause de la longueur du code je n'arrive plus a voir la case a cocher pour cacher/visualiser l'etiquette (j'ai plusieurs etiquettes differentes)
Donc j'ai 3 options :
1. Trouver une solution pour pouvoir cocher la case de visualisation
2. Trouver une solution pour ne pas visualiser le code dans la fenetre etiquette
3. Optimiser le code
Dans la piece jointe vous pouvez trouver la capture d'ecran visualisation des etiquettes
Et voici un module de mon code :
Code:
CASE WHEN "Champ1" IS NOT NULL THEN '$' || '<span style="color:#ffffff">Titre de Champ1 Long Complet </span>' ELSE '' END || CASE WHEN "Champ1" IN ('1','2','3') THEN format( '<span style="color: #00ff27">%1</span>', "Champ1") WHEN "Champ1" IN ('5', '4') THEN format( '<span style="color:#ffff00">%2</span>', "Champ1") WHEN "Champ1" IN ('6', '7') THEN format( '<span style="color: #ff6000">%3</span>', "Champ1") WHEN "Champ1" = '8' THEN format( '<span style="color: #ff0000">%4</span>', "Champ1") ELSE '' END ||
Repeter le meme pour 67 champs
Ce code me permet
- D'afficher le titre complet (+ de 10 characteres) associé a chaque champ avec la couleur associé a ce champ
- Afficher la couleur associé a la plage des valeurs
- Ne pose pas de soucis avec les champs vides
- Rupture de la ligne (paragraphe) est initiée avec '$' dans les reglages du calque
Je pense l'optimisation possble c'est d'introduire des variables pour la couleur mais je ne suis pas du tout douée a faire cela...
Si vous me proposez la solution pour cacher le code cela me convient parfaitement !!
Je vous remercie,
Bonne semaine
Dernière modification par Sofia2025 (Tue 14 October 2025 09:11)
Hors ligne
#2 Tue 14 October 2025 10:24
- Alban Kraus
- Participant actif
- Lieu: Tulle (19)
- Date d'inscription: 13 Jan 2022
- Messages: 81
Re: QGIS/Etiquettes: optimisation du code
Bonjour,
Comme réponse partielle, je vois une optimisation possible, lorsque "Champ1" a des valeurs entières contiguës, en utilisant un tableau de couleurs :
Code:
with_variable('couleurs', array( '#00ff27', '#00ff27', '#00ff27', -- 0, 1, 2 '#ffff00', '#ffff00', -- 3, 4 '#ff6000', '#ff6000', -- 5, 6 '#ff0000' -- 7 ), CASE WHEN "Champ1" IS NOT NULL THEN '$' || '<span style="color:#ffffff">Titre de Champ1 Long Complet </span>' || format('<span style="color: %1">%2</span>', COALESCE(array_get(@couleurs, to_int("Champ1")-1), '#000000'), -- couleur par défaut pour valeur non prévue "Champ1") ELSE '' END)
S'il y a beaucoup de valeurs possibles, vous pourriez créer une couche tabulaire associant les valeurs de "Champ1" et la couleur correspondante, rapatrier la couleur correspondante à "Champ1" sur la table de données avec une jointure attributaire, et utiliser ce champ joint dans l'expression d'étiquette.
Dernière modification par Alban Kraus (Tue 14 October 2025 10:25)
Hors ligne
#3 Tue 14 October 2025 11:15
- Sofia2025
- Participant occasionnel
- Date d'inscription: 15 May 2025
- Messages: 14
Re: QGIS/Etiquettes: optimisation du code
Bonjour
Merci beaucoup pour votre solution !
Je viens de tester plus au moins le concept de mettre les couleurs separement
Malheureusement car je dois a chaque champ preciser "Titre de Champ1 Long Complet" et j'ai 67 champs meme sans couleur ça genere le code qui cree le meme probleme de visualisation dans la fenetre proprietes de la couche -> etiquettes
Si personne voit la solution comment reduir la visibilité du code dans cette fenetre je pense je vais opter a creer des doublons de la couche pour visualiser les etiquettes differentes.
Merci beaucoup en tout cas !
Bonjour,
Comme réponse partielle, je vois une optimisation possible, lorsque "Champ1" a des valeurs entières contiguës, en utilisant un tableau de couleurs :Code:
with_variable('couleurs', array( '#00ff27', '#00ff27', '#00ff27', -- 0, 1, 2 '#ffff00', '#ffff00', -- 3, 4 '#ff6000', '#ff6000', -- 5, 6 '#ff0000' -- 7 ), CASE WHEN "Champ1" IS NOT NULL THEN '$' || '<span style="color:#ffffff">Titre de Champ1 Long Complet </span>' || format('<span style="color: %1">%2</span>', COALESCE(array_get(@couleurs, to_int("Champ1")-1), '#000000'), -- couleur par défaut pour valeur non prévue "Champ1") ELSE '' END)S'il y a beaucoup de valeurs possibles, vous pourriez créer une couche tabulaire associant les valeurs de "Champ1" et la couleur correspondante, rapatrier la couleur correspondante à "Champ1" sur la table de données avec une jointure attributaire, et utiliser ce champ joint dans l'expression d'étiquette.
Hors ligne
#4 Tue 14 October 2025 11:48
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 4133
Re: QGIS/Etiquettes: optimisation du code
Bonjour,
>Titre de Champ1 Long Complet
C'est vous qui le rédigez à chaque fois ou c'est issu d'un champ particulier?
Repeter le meme pour 67 champs
Avec les mêmes valeurs et couleurs, mais c'est le champ qui varie? C'est ça?
Parce que vous pouvez aussi créer une variable de liste stockant les noms de champs
Code:
with_variable( 'liste_champs', map_akeys(attributes()), @liste_champs)
Mais l'odre des champs n'est pas forcément celui que vous escomptez donc vous pouvez aussi créer votre liste de champs
Code:
with_variable( 'liste_champs', array('champ1', 'champ2', 'champ3', ...), -- mettre les noms des champs comme texte @liste_champs)
et ensuite itérer sur chaque champ, et ça donne quelque chose du genre
Code:
with_variable( 'liste_champs', map_akeys(attributes()), -- ou la version array(...) array_foreach( @liste_champs, case when attributes()[@element] is not null .... -- pour faire référence à la valeur du champ ... end ) )
ATTENTION: ce code ne tient pas compte de la première question relative à l'écriture manuelle du nom complet (qui peut aussi faire l'objet d'une variable map nom_champ: nom complet).
Sachant que with_variable permet l'imbrication, ceci pourrait être mixé avec la proposition ci-dessus.
Si personne voit la solution comment reduir la visibilité du code dans cette fenetre
Et pour info, votre expression peut être stockée comme variable de la couche (ou ailleurs), et être appelée juste dans votre expression de symbologie avec la fonction eval
Hors ligne
#5 Tue 14 October 2025 12:05
- Sofia2025
- Participant occasionnel
- Date d'inscription: 15 May 2025
- Messages: 14
Re: QGIS/Etiquettes: optimisation du code
Bonjour Santanna
Merci beaucoup pour votre reponse
Le titre de champ je le redige a chaque fois. Vu que le nom de champ est limité en nombre de characteres et abscence des accents j'ai trouvé la solution de juste mentionner 'champ nom complet' "champ"
C'est super le stockage, je vais definitivement explorer cette possibilité pour le futur!!
Pour le moment j'ai trouvé une solution tres basique qui ne rend pas mon code mieux mais qui fonctionne
J'ai remplacé les sauts de paragraphe ^13 avec un simple espace et maintenant ce style d'etiquette prend q'une seule ligne dans la fenetre. Je l'ai fait sur word avec "remplacer" donc meme si j'ai besoin d'editer mon code et refaire la manip c'est pas un probleme
Bonjour,
>Titre de Champ1 Long Complet
C'est vous qui le rédigez à chaque fois ou c'est issu d'un champ particulier?Repeter le meme pour 67 champs
Avec les mêmes valeurs et couleurs, mais c'est le champ qui varie? C'est ça?
Parce que vous pouvez aussi créer une variable de liste stockant les noms de champsCode:
with_variable( 'liste_champs', map_akeys(attributes()), @liste_champs)Mais l'odre des champs n'est pas forcément celui que vous escomptez donc vous pouvez aussi créer votre liste de champs
Code:
with_variable( 'liste_champs', array('champ1', 'champ2', 'champ3', ...), -- mettre les noms des champs comme texte @liste_champs)et ensuite itérer sur chaque champ, et ça donne quelque chose du genre
Code:
with_variable( 'liste_champs', map_akeys(attributes()), -- ou la version array(...) array_foreach( @liste_champs, case when attributes()[@element] is not null .... -- pour faire référence à la valeur du champ ... end ) )ATTENTION: ce code ne tient pas compte de la première question relative à l'écriture manuelle du nom complet (qui peut aussi faire l'objet d'une variable map nom_champ: nom complet).
Sachant que with_variable permet l'imbrication, ceci pourrait être mixé avec la proposition ci-dessus.Si personne voit la solution comment reduir la visibilité du code dans cette fenetre
Et pour info, votre expression peut être stockée comme variable de la couche (ou ailleurs), et être appelée juste dans votre expression de symbologie avec la fonction eval
Hors ligne