#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 FunctionJ’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
endMais 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...
ENDPourquoi 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: 4138
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)')
ENDA 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
. 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





