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 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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 smile .

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)

Hors ligne

 

#5 Fri 18 March 2016 15:47

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 3940

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

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 smile. 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

 

Pied de page des forums

Powered by FluxBB