VIII. Lier des données de deux sources différentes : les jointures

VIII.1 Lier des données en fonction de leurs attributs : jointures attributaires


Comment fonctionne une jointure attributaire ?

Dans un logiciel SIG, une jointure attributaire consiste à lier à une couche des données provenant d'une table ou d'une autre couche. On se base pour cela sur les données attributaires.

Un champ de la couche de départ et un champ de la table contenant les données à joindre servent de champs clé. Ces champs doivent être de même type (texte, nombre) et contenir les mêmes données. Le logiciel se base sur le contenu de ces champs pour déterminer quel élément de la table est lié à quel élément de la couche.

principe d'une jointure attributaire

Dans l'illustration ci-dessus, les données de départ sont :

  • une couche de polygone avec les régions du Bhoutan. La table attributaire comporte le nom et le code de chaque région, mais pas leur population.
  • un tableau avec le code de chaque région et sa population en 1995

Les données de la table sont jointes aux données du shapefile, en se basant sur le code région : champ CODEREGION pour le shapefile et champ REG_CODE pour le tableau.

Au final, on obtient une couche shapefile des régions du Bhoutan, avec en données attributaires les données de la couche de départ et les données du tableau, donc la population.

Il arrive qu'un élément de la couche de départ corresponde à plusieurs éléments de la table. Différentes stratégies sont alors possibles selon les logiciels et le type de champ : ne prendre en compte que les données du premier élément lié, calculer la moyenne des données...

Application : population au Bhoutan

Ouvrez un nouveau projet QGIS et ajoutez-y la couche des régions du Bhoutan regions_bhutan.shp.

Ajoutez également au projet la table pop_bhutan.csv : pour cela, procédez comme pour ajouter une couche de texte délimité en choisissant l'option Pas de géométrie :

ajout d'un csv : choisir tous les fichiers comme format

Vous pouvez également ajouter ce fichier via le panneau Explorateur ou en procédant comme pour une couche vecteur.

Cependant la méthode présentée ici permet de détecter automatiquement les types des champs (texte, entier...). En passant par une autre méthode, tous les champs seront considérés comme du texte.

Le format CSV est un format texte contenant des colonnes séparées par un caractère délimiteur, habituellement la virgule, le point-virgule ou la tabulation.

Vous devez donc avoir dans QGIS ces deux données (notez l'icône de tableau pour le CSV) :

la table et la couche dans la table des matières

Ouvrez les deux tables attributaires.

Le champ clé pour regions_bhutan est CODEREGION et le champ clé pour pop_bhutan est REG_CODE.

Allez dans les propriétés de la couche regions_bhutan, rubrique Jointure :

rubrique jointure des propriétés de la couche

Cliquez sur le symbole symbole + d'ajout de jointure pour ajouter une jointure :

création d'une jointure : choix de la couche à joindre et des champs clés
  • Joindre la couche : choisissez la couche qui sera jointe, ici le CSV pop_bhutan
  • Champs de jointure : choisissez le champs clé dans le CSV, à savoir REG_CODE
  • Champs dans la couche cible : choisissez le champs clé dans la couche région, à savoir CODEREGION
  • Mettre la couche jointe en cache dans la mémoire virtuelle : si cette case est cochée, l'affichage de la table sera plus rapide, mais les données ne seront pas mises à jour si des modifications sont effectuées dans la couche jointe
  • champs joints : ici, nous voulons joindre tous les champs donc vous pouvez laisser cette case décochée
  • Préfixe de nom de champ personnalisé : les champs joints peuvent avoir le préfixe de votre choix, pour bien les différencier des champs originaux ou issus d'autres jointures. Choisissez un préfixe court, par exemple tab_

Cliquez sur OK pour créer la jointure : la ligne correspondante apparaît dans la fenêtre des propriétés. Vous pouvez fermer la fenêtre des propriétés.

Ouvrez la table attributaire de la couche regions_bhutan.shp : les données de la table ont été ajoutées (champ tab_POPEST95).

table attributaire de la couche regions_bhutan une fois les données de populations jointes

Cependant, la couche n'a pas été modifiée, la jointure n'est que temporaire. Pour sauvegarder définitivement la jointure, il faut sauvegarder la couche sous un autre nom (clic droit sur le nom de la couche → Exporter → Sauvegarder les entités sous).

Quelques exemples supplémentaires

Jointure d'une couche et d'une table : recensement de la population au Kenya

Ouvrez un nouveau projet QGIS. Ajoutez-y la couche gadm36_KEN_1 de la base GeoPackage gadm36_KEN.gpkg et le fichier CSV County_Population_2009.

La couche gadm36_KEN_1 correspond à des sous-régions administratives du Kenya, et le tableau County_Population_2009 contient les populations correspondantes.

Notez que gadm36_KEN.gpkg contient plusieurs couches correspondant aux différents niveaux administratifs. En passant par l'explorateur de données, vous pouvez « ouvrir » la base pour ajouter directement la couche de votre choix. En utilisant le gestionnaire des sources, vous choisissez les couches à ajouter après avoir cliqué sur le bouton Ajouter.

Il est possible de faire la jointure en utilisant le nom du County : champ NAME_1 pour KEN_adm1 et champ County pour County_Population_2009.csv.

Cependant, les noms sont en minuscules dans la couche et en majuscule dans le CSV. Il faut donc créer et calculer un nouveau champ dans la couche GeoPackage, rempli à l'aide de la formule upper("NAME_1").

Par ailleurs, le champ étant un nom et non un code, il est possible que des lignes ne soient pas jointes si les noms sont orthographiés de manière légèrement différente.

Faites la jointure.

Deux counties n'ont pas de données jointes : ELGEYO-MARAKWET et THARAKA-NITHI, orthographiés sans tirets dans le fichier CSV.

Pour que tous les enregistrements soient joints, vous pouvez modifier à la main les noms des counties qui posent problème, soit dans la couche GeoPackage soit dans le fichier CSV (ces opérations peuvent être effectuées dans QGIS).

Jointure de deux couches : licences sportives et catégories socio-professionnelles en France

Ouvrez un nouveau projet QGIS. Ajoutez-y les couches depts_licences_sportives_2016-2017 et depts_CSP_2016.

La couche depts_licences_sportives_2016-2017 correspond aux nombres de licences pour différents sports par département, et la couche depts_CSP_2016 aux % des différentes catégories socio-professionnelles par département.

Il est possible de faire la jointure sur les champs INSEE_DEP, ou NOM_DEP, ou bien NOM_DEPT. C'est généralement un bon réflexe de faire si possible la jointure sur des identifiants (INSEE_DEP) plutôt que des noms (NOM_DEP) au cas où ceux-ci seraient orthographiés différemment dans les 2 fichiers.

Joignez les données attributaires d'une couche à l'autre couche.

On peut ensuite explorer la relation entre catégories socio-professionnelles et sports pratiqués, par exemple en utilisant l'extension Plotly pour visualiser le nombre de licences de golf en fonction de la part de cadres et professions intellectuelles supérieures :

graphique du nombre de licences de golf en fonction du % de cadres, réalisé avec Plotly

Si une entité correspond à plusieurs entités de la couche à joindre

Pour bien comprendre le problème

Ouvrez un nouveau projet QGIS. Ajoutez-y la couche GeoPackage communes_oise et le fichier CSV L_MONUMENT_HISTO_S_060 qui correspond à l'ensemble des monuments historiques classés et inscrits dans le département de l'Oise.

Il est possible de joindre les couches en se basant sur le code INSEE : champ INSEE_COM pour la couche de communes et INSEE pour le tableau des monuments historiques.

Faites la jointure.

La couche de communes contient 679 entités, le CSV 700 lignes.

A chaque commune ont été joints les attributs du 1er monument ayant le même code INSEE rencontré dans le CSV. Si une commune possède plusieurs monuments, les données d'un seul ont été jointes.

Certaines communes ont plusieurs monuments historiques, d'autres n'en ont aucun. Comment faire la jointure dans ce cas ?

Il existe plusieurs possibilités, il faut ici bien se poser la question de ce que l'on veut.

Ici, si l'on travaille à l'échelle de la commune, les informations sur les monuments devront être agrégées à la commune. On peut par exemple avoir pour chaque commune le nombre de monuments présents.

On peut également concaténer du texte, c'est-à-dire avoir dans un champ par exemple tous les intitulés des monuments présents séparés par des virgules. Cependant, cette manière d'organiser les informations n'est pas forcément la plus pratique pour exploiter les données par la suite.

Il importe de bien réfléchir aux questions qu'on veut pouvoir poser à ses données et à les structurer en conséquence, ce qui sort de l'objectif de ce tutoriel. Pour cela, vous pouvez discuter avec quelqu'un ayant l'habitude de travailler avec des bases de données, de préférence spatiales !

Nous allons ici ajouter à la couche de communes un champ contenant le nombre de monuments.

Agréger les données en 2 étapes

Une première possibilité consiste à procéder en 2 étapes :

  • A partir du CSV, créer un tableau avec le nombre de monuments par communes
  • Joindre ce tableau à la couche de communes

Dans la boîte à outils, rubrique Analyse vectorielle, double-cliquez sur l'outil Statistiques par catégories.

Emplacement dans la boîte à outils de Statistiques par catégories

Cet outil permet de calculer des statistiques (nombre, moyenne etc.) sur des champs d'une table attributaire.

Par exemple, on peut savoir pour chaque type de monument (église, château...) les dates d'inscription min et max, et le nombre de dates d'inscription différentes. Ainsi, on compte 240 églises correspondant à 162 dates d'inscription différentes, entre le 01/01/1840 et le 27/10/2016.

Nous allons ici utiliser cet outil de manière très simple, pour compter le nombre de monuments par commune :

Outil Statistiques par catégories
  • Couche vectorielle en entrée : choisir la couche de monuments L_MONUMENT_HISTO_S_060
  • Champ pour calculer les statistiques : laisser vide puisqu'on veut simplement compter les monuments
  • Champs avec catégories : cliquez sur ... et cocher le champ INSEE pour compter le nombre de monuments par code INSEE. On pourrait ici choisir commune mais ce sera moins sûr pour faire la jointure par la suite
  • Cliquez sur Exécuter, l'outil va créer une couche temporaire. Vous pouvez ensuite fermer la fenêtre.

Ouvrez la table attributaire de cette couche temporaire :

tableau résultat de Statistiques par catégories

Chaque ligne correspond à une commune (un code INSEE) et le champ count indique combien cette commune contient de monuments.

Il ne reste plus qu'à joindre ce tableau à la couche de communes ! Ceci vous permet par exemple de créer une carte en cercles proportionnels du nombre de monuments par communes :

carte en cercles proportionnels du nombre de monuments par commune

Pour aller plus loin : une deuxième méthode avec une requête SQL

Cette autre méthode fait ici appel à une requête SQL. Une partie spécifique étant dédiée à ces requêtes, voici sans plus de détails une requête répondant à notre question. Pour mieux comprendre cette méthode, si vous n'êtes pas familier du SQL, merci donc de vous reporter ici avant d'aller plus loin !

Vous pouvez bien sûr sauter cette étape et passer directement au chapitre suivant sur les jointures spatiales.

icône gestionnaire de bases de donnéesOuvrez la fenêtre du gestionnaire de bases de données : menu Base de données → DB Manager..., ou bien cliquez sur l'icône correspondante dans la barre d'outils Base de données.

Dans l'arborescence située dans la partie gauche de la fenêtre, allez dans Couches virtuelleCouches du projet : vous devriez voir vos couches chargées dans QGIS.

icône de la fenêtre SQLCliquez ensuite sur l'icône Fenêtre SQL, ou bien menu Base de donnéesFenêtre SQL.

 dans le gestionnaire de bases de données, requête SQL pour compter le nombre de nombre de monuments par commune

Tapez la requête suivante :

SELECT c.INSEE_COM, c.NOM_COM, count(m.INSEE) as nb_monuments, c.geometry
FROM communes_oise as c, L_MONUMENT_HISTO_S_060 as m
WHERE c.INSEE_COM = m.INSEE
GROUP BY c.INSEE_COM, c.NOM_COM, c.geometry

Vérifiez le résultat : chaque ligne correspond à une commune, avec pour chacune le nombre de monuments.

Cochez la case Charger en tant que nouvelle couche.

Choisissez la colonne avec des valeurs uniques : INSEE_COM, et la colonne de géométrie : geometry.

Donnez un nom à la couche qui sera créée, communes_monuments par exemple, et cliquez sur le bouton Charger.

Le résultat est équivalent à celui obtenu avec la première méthode, mis à part le fait que les communes sans monuments n'existent pas dans la nouvelle couche.

Une autre requête utilisant left join permet de les conserver :

SELECT c.INSEE_COM, c.NOM_COM, count(m.INSEE) as nb_monuments, c.geometry
FROM communes_oise as c
LEFT JOIN L_MONUMENT_HISTO_S_060 as m
ON c.INSEE_COM = m.INSEE
GROUP BY c.INSEE_COM, c.NOM_COM, c.geometry


chapitre précédent chapitre suivant
haut de page