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

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é ?". A 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:

  • Sélectionner le territoire concerné avec une clause Where.
  • Sélectionner les communes qui s'intersectent avec le territoire concerné.
  • Nettoyer les champs non utiles dans la couche des communes avec l'extension TableManager.
  • Ajouter les champs de calcul de surfaces dans la couche des communes => Donne la surface totale de la commune.
  • Découper avec ftools le territoire avec les communes => donne la géométrie des surfaces communes entre le territoire et les communes.
  • Ajouter les champs de calcul de surface dans la couche des communes découpées.
  • Utiliser le calculateur de champs pour calculer le rapport: surface dans le territoire/surface totale de la commune.

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:

  • ftools (mais c'est installé par défaut)
  • TableManager qui permet de modifier le contenu de certaines tables.

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:

  • Ajouter la couche vecteur du territoire
  • Clic-droit sur la couche -> Requête...
  • Sélectionner le champ sur lequel on veut faire la restriction
  • Dans notre cas, on souhaite que le champ CODE_MAET soit filtré sur trois valeurs distinctes: 'PL_VALL', 'PL_LAYO' et 'PL_LOAM'.
  • La clause Where devient donc: CODE_MAET IN ('PL_VALL','PL_LAYO','PL_LOAM').
  • Cliquer sur valider
  • Ne s'affichent que les territoires concernés.

Clause Where

Si on avait voulu sélectionner sur un seul territoire, on aurait utilisé CODE_MAET = 'PL_VALL'

Voici le résultat comprenant uniquemement 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).

  • Menu "Vecteur"
  • Outils de recherche
  • Sélection par localisation
  • Sélection d'entités dans la couche des communes
  • Qui s'intersectent avec la couche des territoires
  • Créer une nouvelle sélection

Communes sélectionnées - Menu "Couche" - Enregistrer la sélection en tant que fichier vectoriel - Choisir le nom et l'emplacement de la nouvelle couche (COM_MAET.shp dans notre exemple) - Ne pas oublier de rajouter la couche de travail sur notre projet "Ajouter une couche vecteur"

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.

  • Sélectionner la couche COM_MAET et veiller à ce qu'elle ne soit pas en mode édition.
  • Lancer TableManager (par l'icône ou par Extension->Table->TableManager).
  • Cliquez sur les champs qui vous embêtent
  • Cliquer sur l'icône "Delete"
  • N'oubliez pas de sauvegarder vos modifications

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

  • Menu "Vecteur" -> Outils Géométriques -> Exporter/Ajouter des colonnes de géométrie
  • Choisir la couche COM_MAET
  • Choisir le nom et l'emplacement du fichier (dans notre cas, COM_MAET_SURF)
  • Ajouter automatiquement la nouvelle couche au projet en cours.

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

  • Menu "Vecteur" -> Outils de Géotraitement -> Découper
  • La "Couche Vectorielle de saisie" correspond à la couche qui servira de "ciseaux".
  • La "Couche de découpage" correspond au "papier": c'est elle qui sera découpée.
  • Choisir le nom et l'emplacement de cette couche de travail (DECOUPE_COM_MAET dans notre cas)

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.

  • Clic-droit sur la couche DECOUPE_COM_MAET
  • Aller dans l'onglet "Attributs"
  • Basculer en mode édition
  • Cliquer sur l'icône calculatrice de champ:

  • Indiquer le nom du nouveau Champ ainsi que son type (réel car on a besoin d'un pourcentage)

  • Remplir la partie expression avec ce qui suit: ($area/AREA)*100
  • Dans cette expression, on divise la surface de l'objet ($area) par la surface totale de la commune (champ AREA) et on multiplie le tout par 100.
  • Lancer le calcul en cliquant sur OK
  • En consultant la table des attributs, vous pouvez constater que le calcul est déjà réalisé.
  • Sauvergarder le résultat en fermant le mode édition.

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.

  • Ouvrir la table d'attributs.
  • Tout désélectionner (première icône en bas à gauche).
  • Inverser la sélection (troisième icône en bas à gauche).
  • Copier les lignes dans le presse-papiers (quatrième icône en bas à gauche).
  • Ouvrir un tableur (Ooo Calc fonctionne bien pour ça).
  • Coller les données: l'import se déroule comme l'ouverture d'un fichier CSV.
  • Attention, même les données géographiques sont exportées: il faudra penser à virer la première colonne !

Voilà, vous avez la réponse à votre question en faisant un tri sur le rapport de surface. A 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.