Tag Archives: fonctions avancées qgis

[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 , ,

[Fonctions avancées de Qgis – 1ère partie] Croiser des couches par comparaison spatiale

Dans tout SIG qui se respecte, et Qgis ne déroge pas à la règle bien sûr,  on peut croiser les couches entre elles.

Par exemple on peut trier la couche Bâti Industriel de la BD TOPO® de l’IGN avec une commune donnée.

Seulement le résultat de ce croisement va produire une troisième couche.

Or il est possible avec les fonctions de Qgis de réaliser ce tri directement depuis la couche voulue.

En l’occurrence si l’on veut afficher uniquement le bâti industriel sur la commune de Perpignan comme illustré ci-après :

Description de la couche Commune de la BD TOPO® de l’IGN

Pour cela on va d’abord récupérer la géométrie de la couche Commune et qui a un CODE_INSEE=66136 avec la commande suivante :

Ensuite on compare cette géométrie avec la géométrie de la couche courante du Bâti industriel => $geometry

Ici on va utiliser la commande within (géométrie a, géométrie b) qui prend les entitées de la géométrie a contenue dans la géométrie b

Si elle le résultat de la commande est égale  à 1 c’est qu’elle est à l’intérieur de la commune de Perpignan :

Nous allons donc mettre cette formule dans la gestion des Styles d’affichage de Qgis (‘Onglet Style’ -> ‘Ensemble de règle’) sur la couche à trier, à savoir la couche bâti industriel.

On obtient uniquement le bâti industriel qui est à l’intérieur de la commune de Perpignan !  La classe non ?

Dans la règle de filtrage de Qgis, le résultat de la fonction avancée permet de faire un tri sur une comparaison spatiale

Attention l’utilisation de cette fonction demande du temps de calcul à chaque déplacements/zoom !!

 


 

Mais on peut aller plus loin et afficher en vert le bâti industriel qui n’est pas sur Perpignan, et en rouge celui qui est sur Perpignan.

il suffit de rajouter une règle où la commande précédente est égale à 0

et voilà la travail !!

 

 


Allons encore plus loin ! oui oui  😉

Je veux afficher en vert l’étiquette du type de bâti hors Perpignan et en rouge celle dans Perpignan comme c’est déjà le cas du polygone du bâti.

Dans l’option couleur de l’étiquette (voir ci-dessous) j’utilise une fonction bien sympa  : la fonction color_rgb

Avec une condition (fonction CASE) on met en rouge (utilisation de l’encodage RGB classique) -> [ color_rgb(255,12,0) ]  lorsque on est sur Perpignan :

 

Et pour la gloire je vais ajouter sur les étiquettes des bâtiments industriels de Perpignan la phrase « sur la commune de Perpignan »

En effet une commande Qgis permet de récupérer le champ d’une couche => c’est la commande attribute (objet, nom du champ à afficher)

Dans mon cas je vais récupérer le champ du nom de la commune (‘NOM’) :

dans l’affichage de la valeur de l’étiquette je vais concaténer le nom de la commune avec la nature du bâtiment :

 

 

Le résultat  :

 

Vous pouvez vous amuser avec ces fonctions qui sont décrite ici

 

Bonne expérimentation !

Tagged , , ,