HOWTO: Utiliser QGis et ftools pour faire des requêtes géographiques 🔗

Posted by Médéric Ribreux 🗓 In blog/Qgis/ #GIS #QGIS

Introduction

QGis est un logiciel de SIG bureautique. Avec le temps, il se bonifie et commence à faire beaucoup de choses. Toutefois, j'ai quelques difficultés à l'utiliser pour faire "parler" des données. En effet, je suis trop habitué à certaines opérations sous d'autres logiciels ce qui vient me brouiller l'esprit. En matière de traitement d'information, QGis s'appuie sur le plugin ftools (livré par défaut dans l'application) pour tout ce qui traite des couches en vecteur.

Ce petit article a comme objectif d'illustrer comment utiliser ftools à travers un exemple concret. Nous allons essayer de répondre à la question "quelles sont les communes qui ont plus de 20% de leur surface dans un territoire donné ?". À notre disposition, nous avons la couche du territoire en question, la couche des communes (Copyright IGN), QGis version 1.5.0 (j'utilise la version trunk car la sortie de cette version est proche) et ftools 0.5.10.

Comment faire ?

En temps normal, pour répondre à la question, je serais tenté de dire: "faisons une requête géographique". Mais, nous allons voir que QGis propose une autre réponse. Effectivement, la requête spatiale n'est facilement envisageable que si je dispose de couches sous PostgreSQL (avec PostGIS). Ce n'est pas le cas, les couches étant dans un format MapInfo. Rapidement, voici le cheminement retenu:

Présentation des données

La couche des communes (BD Carto de l'IGN mais vous pouvez utiliser une extraction d'OpenStreetMap):

La couche du territoire en question:

Couche MAET

Préalable: activer les bonnes extensions

Pour suivre les instructions qui vont suivre, vous aurez besoin des extensions suivantes:

Pour installer cette extension, vous devez activer le plugin "plugin installer" (si ce n'est déjà fait) dans Extensions->Gestionnaire d'extensions. Lorsque ce plugin sera activé, vous pourrez utiliser l'installeur d'extension Python pour QGis (Menu Extensions->Récupération des extensions Python…) et y sélectionner le plugin TableManager.

Sélectionner le territoire concerné avec une clause Where

Dans la couche du territoire, il n'y a qu'un seul territoire qui nous concerne. Il faut donc le sélectionner. On peut le faire à la main, mais on peut également le faire à l'aide d'une clause Where dans les propriétés de la couche:

Clause Where

Si on avait voulu sélectionner sur un seul territoire, on aurait utilisé CODE\_MAET = 'PL\_VALL'

Voici le résultat comprenant uniquement les territoires qui nous intéressent et la couche des communes.

Communes MAET

Sélectionner les communes qui s'intersectent avec le territoire concerné

Histoire de travailler sur le bon sous-ensemble de communes, nous allons créer une couche de travail qui contiendra uniquement les communes qui s'intersectent avec le territoire concerné. Le tout, au format ESRI Shape pour faciliter la suite des opérations (certaines opérations sont impossibles avec QGis dans un autre format: par exemple, la modification d'objets).

Communes sélectionnées

Communes MAET select

Nettoyer les champs de la table de travail des communes

Pour la suite des opérations, certains champs de la table des communes viennent "polluer" un peu la vision et l'efficacité des opérations. De plus, nous allons ajouter des champs et il est bon d'y voir clair. Pour réaliser ce travail, nous allons utiliser l'extension TableManager.

Ajouter les champs de calcul de surfaces dans la couche des communes

Il faut maintenant calculer la surface des communes. Pour cela, on utilise un outil très simple de ftools: l'ajout des attributs de géométrie qui sont la surface et le périmètre. Cet outil va générer une nouvelle couche (et donc de nouveaux fichiers) contenant deux colonnes de données supplémentaires: la surface de l'objet (AREA) et le périmètre (ici, on s'en fout).

Nous avons donc dans la colonne en question, la surface totale de chaque commune dans le nouveau champ 'AREA'. Muni de cette information, il nous reste à calculer la surface de la commune qui est dans le territoire.

Note: On aurait pu également utiliser le calculateur de champs qui permet de calculer la surface ($area) mais c'était pour illustrer une fonction de Ftools !

Communes MAET select

Découper le territoire avec les communes

Nous allons maintenant découper le territoire concerné avec les communes. Cette opération nous permettra de récupérer des polygones issus des communes et donc, comportant leurs attributs qui correspondront à la surface commune entre le territoire et la commune. Ces polygones seront stockés dans une nouvelle couche de travail.

Communes MAET select

Calculer le rapport de surface pour les communes

Nous allons maintenant utiliser le calculateur de champs pour calculer le rapport: surface de l'objet/surface totale de la commune.

Communes MAET select

Les résultats sont dans la colonne RAPPORT_MAET de la table DECOUPE_COM_MAET. Reste maintenant à exporter ça dans un tableur pour livrer le tableau de données.

Voilà, vous avez la réponse à votre question en faisant un tri sur le rapport de surface. À vous la gloire !!!

Conclusion

Répondre à la question du départ est donc possible avec QGis et ftools, sans avoir besoin d'un backend spatial comme PostGIS… Mais c'est long et pénible. Pour parvenir à nos fins, il nous a fallu créer 5 couches temporaires quand même (ou aurait pu en faire une de moins) !

Mais, il est toujours possible de faire un travail correct en utilisant ces quelques astuces.