[Qgis] un séparateur de milliers avec l’éditeur de fonction de Qgis

Qgis est un logiciel très avancé mais pas exempt de lacunes. Une de celles-ci est l’impossibilité de représenter les données numériques avec un séparateur de milliers.

En attendant que Qgis le permette par défaut , il est possible de pallier à ce manque grâce aux fonctions pythons embarquées (depuis la 2.8).

Dans la carte suivante, qui représente la population en Asie, la donnée numérique est trop longue pour une lisibilité satisfaisante.

On ne sépare pas d’un coup d’œil les pays qui comptent des milliers de ceux qui compte des millions (voir milliards) d’habitants.

impossible de distinguer facilement l’ordre de grandeur d’une population lorsqu’on n’a pas de séparateur de milliers

Il est possible bien sûr en python, comme dans n’importe quel langage,  de séparer automatiquement les milliers.

La fonction ci dessous le permet :

 

Pour faire simple celle fonction sépare les chiffres en groupe tous les 3 caractères et les ré-assemble par groupe de trois avec un espace entre eux.

Notez que celle double boucle sur une ligne est une liste en intention, qui fait la beauté du Python.

Notez en outre que le paramètre (val) est passé en chaîne de caractère (string)  pour que la fonction marche. Elle se base en effet sur un calcul de longueur de chaîne len() pour établir les positions des espaces.

On pourrait utiliser d’autres façons de faire (utiliser le modulo par exemple).

Bref cette fonction peut être intégrée à Qgis moyennant quelques règles

1-  il faut ajouter les bibliothèques de python de qgis => pyqgis :


 

2- il faut ajouter une ligne @qgsfunction() qui déclare le nombre d’arguments que l’on va passer à la fonction (ici un seul) :


 

3-  Attention !! dans pyqgis les valeurs d’un champ d’une couche sont des listes, tableaux ou tuples même s’il s’agit d’une valeur unique :

d’où le val[0] lors de la transformation en chaîne de caractère

 

4- Résultat – La fonction donne alors :


 

Maintenant ou peut l’utiliser comme une fonction native dans l’éditeur de fonction de qgis et ensuite partout où l’on a accès à l’utilisation d’expressions.

l’éditeur de fonction de qgis permet de charger des fonction python dans qgis

 

Dans notre cas il s’agit des étiquettes :

utilisation de la fonction « custom » dans l’éditeur d’étiquettes

 

et voilà le travail !  on peut désormais discrétiser rapidement les état en fonction de leur population.

résultat concluant. notre fonction marche bien

Pas beau le « tuning  » Qgis ? 🙂

Tagged , ,

8 thoughts on “[Qgis] un séparateur de milliers avec l’éditeur de fonction de Qgis

  1. Ju' dit :

    Bonjour,
    Merci pour cette aide.
    Lorsque je suis toutes les étapes, j’ai des décimales qui apparaissent, alors que je ne les avais pas auparavant et du coup, le séparateur de milliers les prends en compte dans le calcul des trois chiffres à regrouper et je me retrouve à regrouper les dizaines…
    Une idée pour ne pas faire afficher ces décimales ?
    Merci d’avance

    • yvan dit :

      peut être une conversion vers les entier avant de passer la valeur à la fonction ?

      exemple => sepmill( to_int( « popul_2016 » ))

      où popul_2016 est ta valeur qui est un nombre décimal

  2. Florian D. dit :

    Bonjour,

    Je vous remercie pour cette astuce. Le séparateur de milliers est-il implémenté dans les nouvelles versions de QGIS?

    Bonne continuation pour votre blog SIG.

    Florian D.

  3. yuck dit :

    Hello,

    Plus easy et rapide, dans le format d’étiqette, il existe « format_number »

    format_number( « NOM DU CHAMP »,0 )

    « 0 » car je ne souhaite pas de chiffre après les unités

    🙂

  4. Anonyme dit :

    Bonjour,

    Cette fonction s’applique-t-elle au niveau des nombres affichés sur la légende pour une thématique graduée ?

    Merci à vous.

    Cordialement.

    • ymr dit :

      Les fonctions embarquées comme celles crées par l’utilisateur sont disponible partout où l’icone fonction (epsilon) est présent.

      oui tu peux utiliser des fonctions sur une thématique.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.