#1 Fri 18 March 2016 11:38
- world citizen
- Participant occasionnel
- Date d'inscription: 29 Nov 2013
- Messages: 21
QGIS : Etiquetage avec code (pseudo sql, python)
Bonjour,
Je suis sous QGIS 2.14 et je veux étiqueter une couche (réseau linéaire) assez dense et complexe. Je veux créer une variable « étiquette » dont les propriétés (texte à afficher, taille, couleur…) en fonction des valeurs de certains champs. Et cela nécessite de faire des conditions (If ou Case) imbriquée. Bref je veux faire un code comme ce code vbscript sous arcgis.
Code:
Function FindLabel ( [champ1], [champ2] , [champ3] ) sLabel = [champ1] variable = [champ2]&" Câble(s)" if (not isnull(sLabel)) then if (not isnull ([champ2])) then if [champ2] > 0 then sLabel = sLabel&" : "& variable end if end if else if (not isnull ([champ2])) then if [champ2] > 0 then sLabel = variable end if end if end if if [champ3]="valeur1" or [champ3]="valeur2" then if (not isnull(sLabel)) then sLabel ="<CLR red='255' green='0' blue='0'>" & sLabel & "</CLR>" end if end if FindLabel = sLabel End Function
J’ai fais une première approche avec le code pseudo sql
Code:
CASE WHEN "champ1" is not null then case when "champ2" is not null then case when "champ2">0 then concat( "champ1" ,':', "champ2" ,' élément(s)') end end else case when "champ2" is not null then case when "champ2">0 then concat( "champ2",' élément(s)' ) end end end
Mais je ne trouve aucun moyen d’avoir plusieurs couleurs d’étiquette dans la même couche et aussi je ne peux pas créer de variable à utiliser tout au long du code. Est-il réellement possible de le faire sous QGIS ? Je vais être essayer avec l’éditeur de fonction (python) que je ne connais pas du tout. J'ai besoin d'exemple de code réalisé dans l'éditeur de fonction et aussi d'astuces .
Merci d'avance
Hors ligne
#2 Fri 18 March 2016 12:57
- Lucien
- Participant actif
- Date d'inscription: 8 Mar 2016
- Messages: 104
Re: QGIS : Etiquetage avec code (pseudo sql, python)
Code:
CASE WHEN ("champ1" is not null and "champ2" is not null and "champ2">0) THEN concat ( "champ1" ,':', "champ2" ,' élément(s)') ELSE... END
Pourquoi ne pas essayer de simplifier tous vos CASE WHEN imbriqué par des "and" ?
Hors ligne
#3 Fri 18 March 2016 14:48
- world citizen
- Participant occasionnel
- Date d'inscription: 29 Nov 2013
- Messages: 21
Re: QGIS : Etiquetage avec code (pseudo sql, python)
J'y avais aussi pensé, mais comme j'ai dit, c'est un réseau dense avec beaucoup de variantes. C'est faisable avec seulement des Case et And mais ça ferait énormément de combinaisons. le code dans l'exemple est simplifié c'est juste pour faire le message mais après ça devient assez alambiqué.
Hors ligne
#4 Fri 18 March 2016 15:25
- Lucien
- Participant actif
- Date d'inscription: 8 Mar 2016
- Messages: 104
Re: QGIS : Etiquetage avec code (pseudo sql, python)
Peut-être que cela peut t'aider
http://www.forumsig.org/showthread.php/ … x-couleurs
Hors ligne
#5 Fri 18 March 2016 15:47
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3944
Re: QGIS : Etiquetage avec code (pseudo sql, python)
Bonjour,
En encore plus simple (vu que la requête est a priori longue, plus elle est factorisée, mieux c'est, me semble-t-il - pour autant que ça reste lisible et compréhensible rapidement), je pense que ceci (non testé) devrait faire l'affaire (je ne sais pas si c'est lisible et compréhensible par contre )
Code:
Case when "champ2" > 0 Then concat(("champ1" || ':'), "champ2" ,' élément(s)') END
A priori, si champ2 > 0 alors champ 2 est non null. Ensuite, il faut savoir que:
- || renvoie null dès lors qu'une des variables (dans ce cas, ce serait champ1) est null
- alors que concat n'a pas ce souci, elle renvoie la concaténation des valeurs non null.
Par contre, je ne comprends pas du tout la question sur les taille et couleur. Chaque étiquette a une taille donnée (auquel cas il faudra appliquer une expression dans l'option taille par ex) ou est-ce à l'intérieur d'une étiquette que ça varie (pas encore dispo en natif dans QGIS)?
Hors ligne
#6 Mon 21 March 2016 10:26
- world citizen
- Participant occasionnel
- Date d'inscription: 29 Nov 2013
- Messages: 21
Re: QGIS : Etiquetage avec code (pseudo sql, python)
Ah oui! J'avais pas pensé au ||, il simplifie considérablement mon code. Merci Santana . Je voulais effectivement faire varier la couleur de l'etiquette dans une même couche en fonction de la valeur d'un champ. J'y suis parvenu en faisant cette expression pour la couleur dans l'onglet style de texte
Code:
CASE WHEN "champ" =0 THEN '0,0,255' END
Hors ligne