Comment Joindre un fichier Excel à une Couche SIG dans QGIS en Python?

Vous cherchez une aide pour importer les données d’un fichier Excel dans QGIS puis les joindre à une couche SIG? Deux solutions s’offrent à vous :

QGIS Desktop est principalement construit à partir des langages C, C++ et Python et ce dernier langage a été choisi comme support de programmation pour faire appel aux fonctionnalités du logiciel : on parle de PyQGIS. Plusieurs utilisations de Python sont possibles dans QGIS : l’exécution de fichier Python, la programmation via la console, le développement de Plugins et d’applications. Une documentation introduisant les principales utilisation de PyQGIS et une description complète de l’API QGIS sont disponibles en anglais.

Ici, on utilise la console pour décrire les étapes de fusion des données Excel et de la table attributaire d’un vecteur.

1. Import des Données SIG et Excel depuis la console Python

Pour illustrer cet article, on dispose d’un vecteur en format shape représentant les localisations ponctuelles de chaînes de restaurants et d’un tableur Excel qui est ensuite enregistré en format csv dont les cellules sont délimitées par un point-virgule. La table attributaire du vecteur (à gauche de la figure 1) possède deux colonnes “id” et “chaine” et le tableur (à droite) les champs “Nom” et “Email”. L’objectif est donc d’associer la colonne “chaine” et la colonne “Nom” qui possèdent les mêmes attributs.

Figure 1 : Présentation de la table attributaire du Vecteur (à gauche) et du Tableur Excel (à droite).

Pour cela, lançons la console Python. Le module principal de QGIS, nommé qgis.core ainsi que des utilitaires de PyQGIS qgis.utils sont directement chargés pour pouvoir faire appel aux classes inhérentes. De nombreuses sources de données Vecteur et Raster sont prises en charge par QGIS et les différentes méthodes d’import sont présentées dans la documentation. On commence par le chargement du Vecteur, plusieurs solutions sont possibles :

  • La première est d’utiliser la classe QgisInterface de la libraire GUI (Graphical User Interface) qui permet de travailler avec les éléments visibles sur l’interface de QGIS. L’objet iface de cette classe est utilisé afin d’importer les sources des données SIG sur l’interface du logiciel, ce qui nous donne pour l’ajout d’un shape :
    vecteur = iface.addVectorLayer("C:/..chemin/restaurant_shape.shp", "restaurant", "ogr")
  • Une autre possibilité est de définir la source de donnée du vecteur par la classe QgsVectorLayer puis d’ajouter la donnée :
    vecteur = QgsVectorLayer("C:/..chemin/restaurant_shape.shp", "restaurant", "ogr")
    QgsMapLayerRegistry.instance().addMapLayer(vecteur)

“vecteur” est la nom de la variable et “restaurant” le nom donné au vecteur chargé. Ici, on choisit la deuxième méthode car pour utiliser la jointure (et d’autres traitements), les données doivent être chargées dans le registre des couches de la Carte  QgsMapLayerRegistry générant un identifiant pour chaque couche.

Dans le cas présenté, l’import du fichier csv est relativement simple puisqu’il n’y a pas de géométrie associée et on considère toutes les colonnes. On indique l’URI (Uniform Resource Identifier) du fichier en prenant soin de commencer le chemin par file:/// et on précise l’encodage des caractères et le délimiteur choisi si nécessaires :

fichiercsv = QgsVectorLayer("file:///C:/..chemin/restaurant.csv?encoding=System&delimiter=;", "restaurantcsv", "delimitedtext")
QgsMapLayerRegistry.instance().addMapLayer(fichiercsv)

Le vecteur “restaurant” et le fichier “restaurantcsv” sont désormais dans l’interface de QGIS comme le montre la figure 2 ci-après.

 

Figure 2 : Interface de QGIS après les imports du vecteur et du fichier csv depuis la console Python.

2. Jointure des Attributs dans QGIS

Pour joindre les deux tables chargées, on utilise la classe QgsVectorJoinInfo dont les attributs indispensables sont : l’identifiant de la table jointe joinLayerId (dans l’exemple : “fichiercsv”),  le champ joint joinFieldName (“Nom”), le champ cible de la couche SIG targetFieldName (“chaine”). Un préfixe aux champs joints peut être ajouté par l’attribut prefix ainsi que la programmation  memoryCache pour la mise en mémoire.

On définit l’objet de la jointure auquel on attache les attributs :

objetJointure = QgsVectorJoinInfo()
objetJointure.joinLayerId = fichiercsv.id()
objetJointure.joinFieldName = "Nom"
objetJointure.prefix = "csv_"
objetJointure.targetFieldName = "chaine"
objetJointure.memoryCache = True

Puis la jointure est ajoutée au vecteur :

vecteur.addJoin(objetJointure)

Les données de la colonne “csv_Email” sont bien ajoutées aux lignes correspondantes de la table attributaire du vecteur (figure 3) :

Figure 3 : Résultat final de la jointure.

Comme évoqué en introduction, il est possible d’exécuter les fichiers Python depuis l’éditeur de la console en appelant la classe QtGui. On peut donc enregistrer le code final ci-après dans un fichier d’extension .py, l’ouvrir dans l’éditeur et l’exécuter (figure 4).

from PyQt4 import QtGui

vecteur = QgsVectorLayer("C:/..chemin/restaurant_shape.shp", "restaurant", "ogr") 
QgsMapLayerRegistry.instance().addMapLayer(vecteur)

fichiercsv = QgsVectorLayer("file:///C:/..chemin/restaurant.csv?encoding=System&delimiter=;", "restaurantcsv", "delimitedtext")
QgsMapLayerRegistry.instance().addMapLayer(fichiercsv)

objetJointure = QgsVectorJoinInfo()
objetJointure.joinLayerId = fichiercsv.id()
objetJointure.joinFieldName = "Nom"
objetJointure.prefix = "csv_"
objetJointure.targetFieldName = "chaine"
objetJointure.memoryCache = True
vecteur.addJoin(objetJointure)

Figure 4 : Exécution du Script Final dans la console Python de QGIS.

En conclusion, ce billet a introduit certaines classes du langage PyQGIS afin de joindre les données d’un tableur avec les attributs d’un vecteur de format shape. Pour cet exemple, l’utilisation de la programmation n’a guère d’intérêt par rapport à l’utilisation des modules implémentés dans l’interface de QGIS. Toutefois, PyQGIS, comme tout autre langage, permet d’adapter des fonctionnalités non natives au logiciel, notamment pour la construction de routines et la manipulation de jeux de données importants. Nous verrons cela dans les prochains tutoriels!…

One Comment

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *