Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
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

Rencontres QGIS 2026

L'appel à participation est ouvert jusqu'au 17 novembre 2025!

#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)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

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 !

Alban Kraus a écrit:

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

SANTANNA a écrit:

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

 

Pied de page des forums

Copyright Association GeoRezo