[Fonctions avancées de Qgis – 2ème partie] calculs sur la géométrie et formatage d’étiquettes

Nous avions vu il y a quelques temps comment utiliser les fonctions avancées de Qgis afin de croiser des couches entres elles dans l’éditeur de style de Qgis.

Aujourd’hui nous allons voir l’édition avancée des étiquettes.

Qgis permet depuis longtemps, grâce notamment à l’éditeur d’expression, un réglage très fin des étiquettes et les mises-à-jour successives améliorent encore ces réglages.

 

Afficher des résultats de calculs géométriques dans les étiquettes

Nous avons par exemple la couche commune des P.O. de la BDTopo sur laquelle nous voudrions faire apparaître la distance depuis la préfecture, à savoir Perpignan, dans l’étiquette de chaque commune.

 

couche_commune

Description de la table Commune avec sa donnée attributaire

 

Nous allons utiliser l’expression distance de l’éditeur d’expression de qgis qui permet de sortir la distance (en mètre si système de projection de type Lambert ou degrés si wgs84).

Cette fonction compare la géométrie d’une entité avec un autre de manière très simple :

Ici nous allons prendre la géométrie de l’entité courante,  c’est à dire de chaque commune, grace à l’expression $geometry,  que nous allons comparer à celle de Perpignan.

Comme vu dans la première partie,  il est possible de sortir la géométrie d’une autre couche  grâce aux expressionx geometry(entité) et getFeature(couche,champs,valeur du champ).

Ici notre couche se nomme « commune », notre champ de tri sera la code INSEE de la commune « code_insee » et ‘66136’ pour la valeur du code INSEE de la commune de Perpignan (voir illustration plus haut).

Nous allons sortir la valeur arrondie (pas besoin de 10 décimales)  avec l’expression round()  de la distance trouvée en Km.

On ajoute un peu de texte autour !

distance_à-perpignan

Dans l’éditeur d’expression on peut fusionner (concaténer) plusieurs fonctions ou textes avec la commande || note : on peut aussi utiliser le retour à la ligne avec la commande ‘\n’

et voilà !

distance_sans_centroide

Résultat de la fonction de calcul de distance dans les étiquettes avec l’enveloppe de la commune

 

 

Eh !!! mais pourquoi les communes qui touchent Perpignan sont marquées  à 0 Km de distance ? (ex : Pollestres, Canohès, Toulouges, etc.)

En fait l’expression distance() fonctionne sur l’enveloppe de la commune.

Utilisons donc le centroïde pour plus de précision avec l’expression centroid(géométrie)

 

distance&centroide

Fonction de calcul de distance à partir des centroïdes

Le résultat est mieux non ?

 

Résultat de la fonction de calcul de distance dans les étiquettes avec l’enveloppe de la commune

 

Formater une étiquette selon une condition

Ok tout cela est sympa mais il y a  un truc qui me gène dans le résultat précédent.

En effet pour Perpignan,  l’étiquette affiche bêtement « Commune de Perpignan / 0 Km de Perpignan’

Ça fait tâche vous ne croyez pas ?

Réglons le problème avec la mise en place de conditions.

Comme vu aussi dans la première partie, on peut utiliser l’expression CASE qui fonctionne de la sorte :

Pour la condition nous allons utiliser l’expression attribute(entité, champ de l’entité)  qui renvoie l’attribut d’un champ donné mais aussi $currentfeature qui renvoie l’entité en cours.

La fonction suivante compare donc l’entité de la commune de l’étiquette avec celle, fixe, de Perpignan :

en gros attribute(get_Feature(‘communes’,’code_insee’, 66136 ),’nom’) renvoie le nom de la commune de l’entité dont le code INSSE=66136, à savoir => ‘Perpignan’ et le compare au résultat du nom de la commune de l’entité courante ($currentfeature).

Si la condition est remplie, on affiche juste le nom de la commune de Perpignan, sinon on exécute la fonction de distance.

enlever_perpignan

Affichage de la distance si la commune est différente de la commune de Perpignan

 

Resultats_enlever perpignan

La commune de Perpignan n’affiche plus la distance à 0 Km

 

Formatage conditionnel dans Qgis 2.12

La nouvelle version, Qgis 2.12, nom de code  « Lyon », permet en outre d’appliquer des règles directement sur les étiquettes de manière native (sans passer comme vu plus haut par la fonction CASE).

etiquette_condition_qgis_lyon

Le formatage conditionnel dans Qgis 2.12

 

Ici notre filtre est le même que vu précédemment mais sous la forme :

  • soit vrai =>  attribute ($currentfeature,’nom’) = attribute(get_Feature(‘communes’,’code_insee’, 66136 ),’nom’)=1
  • soit faux => attribute ($currentfeature,’nom’) = attribute(get_Feature(‘communes’,’code_insee’, 66136 ),’nom’)=0

On peut ainsi complexifier largement nos opérations sur les étiquettes.

resulat_etiquettes_condition_qgislyon

Le formatage conditionnel des étiquettes permet de multiples combinaisons

 

Le résultat est la même que dans le point précédent.

 

Filtrage d’étiquettes sur une expression régulière

Ok comme le montre l’image ci dessous il nous reste un problème à régler : lorsque la commune commence par un voyelle, il est malhabile d’utiliser le « de » devant.

Par exemple la commune d’Opoul, s’affiche ‘commune de Opoul’, beurk !!

problemes_voyelles

Problème devant les communes qui commencent par une voyelle

 

Pour remédier à cela et afficher un d’ devant les communes qui commencent par une voyelle,  on va utiliser  la fonction regexp_match(chaîne de caractère, expression régulière).

On va tout d’abord sortir la première lettre du nom de commune avec l’expression substr(chaîne de caractère, position de début, nbr de caractères) et supprimer la casse en la mettant d’office en minuscule avec l’expression lower().

Ensuite on va utiliser regexp_match pour vérifier si cette première lettre est bien une voyelle.

Les expressions régulières permettent de trouver un motif particulier (ou patern)  dans une chaîne de caractères.

Je ne m’attarde pas dessus car cela mérite un cours à part entière, mais sachez que dans Qgis les expression régulière sont celles du langage de programmation python.

allez faire un tour ici ou

 

Bref voici la fonction  :

filtre_voyelles

Si la première lettre du nom de commune est une voyelle alors on affiche Commune d’ , sinon Commune de

 

Bon mais le problème est maintenant que je m’aperçoit que certaines communes sont à particules et commencent par « Le » ou « La » comme par exemple Le Barcarès.

dans ces cas, ma fonction échoue, zut !!

problème_nom_composé

Échec de la fonction dans la cas de communes à particules

On va complexifier un peu si vous le voulez bien !

On va ainsi d’abord tester la présence de particules dans un bloc CASE, puis, si ça correspond,  exécuter un autre contrôle avec la focntion if(condition, opération si oui, opération si non)

 

ouch !! ça pique un peu quand même !!

filtre_nom_composé_voyelles

Double condition CASE puis IF dans le ELSE  !!

 

mais le résultat est là !!

 

résultat

 

Pas beau qgis ?

 

 

 

 

 

4 thoughts on “[Fonctions avancées de Qgis – 2ème partie] calculs sur la géométrie et formatage d’étiquettes

  1. Anonyme dit :

    tres bien en effet !
    J’eprouve des difficultés cependant à utiliser les fonctions qui renvoie une géométrie comme bounds : où est la géométrie ? Comment la recuperer, la voir ? Si l’on pouvait m’éclairer. Merci

    • yvan220 dit :

      la fonction $geometry renvoie la géométrie de l’entité.

      la fonction bounds( $geometry) renvoie l’emprise de la géométrie de l’entité

      enfin la fonction geom_to_wkt( bounds( $geometry)) renvoie cette géométrie mais lisible au format texte

      vous pouvez tester ça dans la calculatrice de champs.

      donc on récapitule :

      – $geometry => renvoie la géometrie de l’entité dans un format non « lisible » mais qui permet des calculs divers
      – $bounds() => renvoie l’emprise d’un géometrie
      geom_to_wkt( ) => ren

  2. Nicolas dit :

    Bonjour
    Bravo et merci pour toutes ces explications.
    J’ai une question concernant le formatage des étiquettes.
    Je voudrais afficher que 3 lettres d’une commune afin que l’étiquette ne dépasse pas des limites de la commune.
    Pour complexifier la chose, j’aimerais paramétrer l’étiquette différemment suivant si le nom de la commune et simple ou composé.
    Exemple pour des communes de l’Ain :
    Oyonnax affiche : Oyo
    Bourg-en-Bresse affiche: BeB
    Hauteville-Lompnes affiche : HaL
    Saint Etienne du Bois affiche: SEB

    Cela est-il possible et comment ?

  3. Michael dit :

    This website is mostly a walkby for all the info you wished about this and didnt know who to ask. Glimpse right here, and also youll undoubtedly uncover it.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.