Aller au contenu
AI Agent
QGIS
Tutorial

Jointure spatiale QGIS : par localisation, proximité ou IA

Publié le

Plan du 8e arrondissement de Lyon avec des points rouges pour les écoles, chacun relié par un trait noir à l'arrêt de tram bleu le plus proche, et la mention 710 m, distance médiane entre une école lyonnaise et un arrêt de tram.

Une jointure spatiale copie les champs d'une couche vers une autre en fonction de la position des entités, et non d'un identifiant commun. Dans QGIS, ouvrez Vector > Data Management Tools > Join Attributes by Location… (Joindre les attributs par localisation), choisissez la couche qui doit recevoir les nouveaux champs, celle dont ils viennent et une règle comme « intersect », puis lancez l'outil. Pour les questions du type « quel est le plus proche », utilisez plutôt Join Attributes by Nearest (Joindre les attributs par le plus proche), ou tapez toute la tâche en une phrase à AI Agent.

Ce que vous voulezOutilDurée sur notre test
Donner à chaque point le nom de la zone où il se trouveJoin Attributes by Location0,21 s, 382 écoles
Le même résultat, demandé en une phraseAI Agent22 s, comptage et plus proche voisin ensemble
Compter ou additionner des points par zoneJoin Attributes by Location (Summary)0,02 s, 9 zones
Trouver l'entité la plus proche et sa distanceJoin Attributes by Nearest0,06 s, 382 écoles

Les données de test

Tous les chiffres de ce guide viennent d'une seule série de tests sur des données ouvertes réelles de Lyon, en France, le 15 octobre 2026 :

  • 9 arrondissements (les districts de la ville) et 382 écoles issus d'OpenStreetMap.
  • 106 arrêts de tram issus d'OpenStreetMap.
  • 103 910 bâtiments de la BD TOPO de l'IGN, la base de données topographique nationale française.

Toutes les couches sont en Lambert-93 (EPSG:2154), un système projeté en mètres. Les durées viennent de QGIS 3.44 sur un MacBook Air M4.

Méthode 1 : Join attributes by location

C'est la jointure spatiale classique. Ici, chaque école reçoit le nom de son arrondissement.

Ouvrir l'outil

Vector > Data Management Tools > Join Attributes by Location…. Vous pouvez aussi chercher « join attributes » dans la boîte à outils de traitements (Ctrl+Alt+T).

Choisir les deux couches

Join to features in est la couche qui reçoit les nouveaux champs, ici schools. By comparing to est la couche dont ils viennent, ici arrondissements.

Cocher un prédicat

intersect est le choix sûr par défaut pour des points dans des polygones. La section plus bas explique chaque case.

Choisir les champs et le type de jointure

Dans Fields to add, gardez seulement ce dont vous avez besoin, ici name. Réglez Join type sur un-à-un, et ajoutez un préfixe comme arr_ pour repérer facilement le nouveau champ.

Lancer

Laissez Joined layer en couche temporaire pour vérifier le résultat d'abord, puis enregistrez-la en GeoPackage.

La boîte de dialogue Join attributes by location de QGIS. Join to features in : schools. Predicate : intersect est coché. By comparing to : arrondissements. Fields to add : name. Join type : Take attributes of the first matching feature only (one-to-one). Joined field prefix : arr_.
La jointure que nous avons lancée : les écoles reçoivent le nom de l'arrondissement où elles se trouvent. Les 382 ont été appariées en 0,21 seconde.

Cochez Discard records which could not be joined seulement si vous voulez écarter les entités sans correspondance. Laissez la case décochée au début : les lignes vides vous montrent ce qui n'a pas marché.

À utiliser quand : vous voulez un ou quelques champs de l'entité dans laquelle chaque objet se trouve ou qu'il touche.

À éviter quand : les entités ne se touchent jamais, comme une école et un arrêt de tram. C'est la méthode 4.

Méthode 2 : demander à AI Agent en une phrase

AI Agent est notre plugin QGIS qui exécute des tâches à partir d'une demande écrite. Il lit les noms de vos couches et de vos champs, choisit les outils et les lance dans votre projet.

Nous lui avons donné cette demande, avec les mêmes couches de Lyon chargées :

Compte les écoles de chaque arrondissement, puis donne à chaque école le nom de l'arrêt de tram le plus proche et la distance qui l'en sépare en mètres.

Il a lancé deux outils de traitement QGIS, puis une courte étape Python qui a écrit les deux nouveaux champs dans la couche des écoles. Le panneau affichait « Worked for 22 s ». Il a demandé une seule fois l'autorisation, car il allait modifier le GeoPackage sur le disque. Ses comptages correspondaient exactement à notre essai manuel : 382 écoles, de 27 dans les 2e et 4e arrondissements à 56 dans le 5e.

QGIS avec les arrondissements de Lyon en orange et les points des écoles, et le panneau AI Agent à droite. La demande affichée : Count the schools in each arrondissement, then give every school the name of its nearest tram stop and the distance to it in metres. La réponse liste les comptages par arrondissement, 382 écoles au total, et indique que les 382 écoles ont reçu nearest_tram et tram_distance_m, avec des distances de 49,6 à 4 949,2 m.
Les deux mêmes jointures à partir d'une seule phrase. La réponse renvoie vers la nouvelle couche et liste ce qui a changé.

À utiliser quand : vous connaissez la question mais pas lequel des quatre outils de jointure y répond, ou quand vous enchaînez plusieurs étapes.

À éviter quand : vous refaites la même jointure chaque semaine. Enregistrez-la une fois comme modèle ou comme script Python.

Prix : offre gratuite, sans carte bancaire. Pro coûte 49 € par mois, hors TVA.

Méthode 3 : compter et résumer avec une jointure spatiale

La méthode 1 donne à chaque école son arrondissement. La question inverse, combien d'écoles contient chaque arrondissement, demande la version résumée.

Cherchez Join attributes by location (summary) dans la boîte à outils de traitements. Placez les polygones dans Join to features in, les points dans By comparing to, et choisissez des statistiques dans Summaries to calculate : nombre, somme, moyenne, médiane, minimum, maximum et d'autres. QGIS ajoute un champ par statistique, nommé par exemple osm_id_count.

Carte des neuf arrondissements de Lyon, colorés du jaune clair à l'orange foncé selon le nombre d'écoles, chacun étiqueté : 9e 38, 4e 27, 1er 33, 6e 41, 5e 56, 2e 27, 3e 54, 7e 53, 8e 53. Des points rouges marquent les écoles.
Les écoles par arrondissement à partir d'une seule jointure de synthèse : 0,02 seconde.

Elle additionne aussi des nombres. Sur les bâtiments de l'IGN, un essai a donné à chaque arrondissement son nombre de bâtiments et les logements qui y sont recensés : 9 474 bâtiments et 51 743 logements dans le 3e, le plus élevé pour les deux.

Pour un simple comptage, Vector > Analysis Tools > Count Points in Polygon… (Compter les points dans les polygones) fait la même chose avec moins de réglages.

À utiliser quand : la réponse est un nombre par zone : compte, total, moyenne.

À éviter quand : vous avez besoin de la liste des correspondances elle-même. Utilisez la méthode 1 en un-à-plusieurs.

Méthode 4 : Join attributes by nearest

Quand les entités ne se touchent jamais, joignez-les par la distance. Cherchez Join attributes by nearest dans la boîte à outils de traitements.

Réglez Input layer sur schools, Input layer 2 sur tram_stops et Maximum nearest neighbors sur 1. QGIS ajoute les champs de l'arrêt, un champ distance et les coordonnées des deux extrémités.

Plan du 8e arrondissement de Lyon. Les points rouges des écoles sont chacun reliés par un trait noir à l'arrêt de tram bleu le plus proche. Plusieurs écoles partagent le même arrêt.
Chaque école reliée à son arrêt de tram le plus proche. Sur l'ensemble de Lyon, la médiane est de 710 m, et 86 écoles sur 382 sont à moins de 300 m.

Deux réglages changent le résultat :

  • Maximum distance. Avec 300 m, seules 86 écoles ont reçu un arrêt. Les 296 autres sont restées dans la sortie avec des champs vides, sauf si vous cochez Discard records which could not be joined.
  • Maximum nearest neighbors. Avec 3, les 382 écoles sont devenues 1 146 lignes, une par école et par arrêt. Une égalité exacte ajoute aussi une ligne : sur les 103 910 bâtiments de l'IGN, nous avons obtenu 103 911 lignes.

La distance est calculée à vol d'oiseau, pas en distance de trajet le long des rues.

À utiliser quand : vous demandez « lequel est le plus proche » et « à quelle distance ».

À éviter quand : vous avez besoin d'une distance de trajet. Utilisez les outils d'analyse de réseau de la boîte à outils de traitements.

Quel prédicat cocher

Le prédicat est la règle spatiale qui décide d'une correspondance. QGIS la lit comme « couche A [prédicat] couche B », où A est la couche qui reçoit les champs.

Schéma de huit relations spatiales entre une forme rouge A et une forme bleue B : intersect, elles partagent une partie quelconque ; contain, A contient tout B ; are within, A est à l'intérieur de B ; equal, même géométrie ; touch, elles ne partagent qu'un bord ; overlap, même type avec une partie commune ; cross, une ligne traverse ; et no match, disjoint, rien n'est joint.
Le rouge est la couche qui reçoit les champs, le bleu est la couche à laquelle on compare.

Trois règles couvrent la plupart des cas :

  • intersect pour des points dans des polygones, et pour tout ce qui doit seulement se toucher. Il capte aussi les entités situées sur la limite.
  • are within quand l'entité doit se trouver entièrement à l'intérieur. Sur nos bâtiments, 112 de ceux qui intersectent Lyon n'étaient pas entièrement dans un seul arrondissement : 108 franchissent la limite de la ville et 4 une limite interne.
  • contain pour le sens inverse, les polygones qui contiennent des points.

Vous pouvez cocher plusieurs cases. Une entité correspond alors si l'une des conditions est vraie.

Un-à-un, un-à-plusieurs ou plus grand chevauchement

Un bâtiment situé sur une limite touche deux arrondissements. Le Join type décide de son sort. Sur les 46 250 bâtiments de l'IGN qui intersectent Lyon :

Type de jointureLignes en sortieDurée
Un-à-plusieurs (une entité par correspondance)46 2541,13 s
Première entité correspondante seulement (un-à-un)46 2500,99 s
Plus grand chevauchement seulement (un-à-un)46 2509,62 s

Le un-à-plusieurs a dupliqué les 4 bâtiments à cheval sur une limite interne. C'est correct pour une liste de correspondances et faux pour toute somme : ces bâtiments seraient comptés deux fois.

« Première correspondance » garde celle que QGIS rencontre en premier, donc un bâtiment en limite peut atterrir dans l'un ou l'autre arrondissement. « Plus grand chevauchement » choisit l'arrondissement qui contient la plus grande partie du bâtiment, ce qui est la réponse la plus juste, mais il a fallu dix fois plus de temps ici.

Les pièges de CRS

Un mauvais système de coordonnées de référence arrête rarement une jointure. Il change le résultat sans bruit.

  • Des CRS différents fonctionnent pour les jointures par localisation. Nous avons laissé les écoles en WGS 84 (EPSG:4326) et les arrondissements en Lambert-93. QGIS a reprojeté à la volée et les 382 écoles ont été appariées.
  • Les distances suivent les unités de la couche en entrée. Lancez Join by nearest sur les fichiers en WGS 84 et la « distance » médiane sort à 0,0071. Ce sont des degrés, pas des mètres. Reprojetez d'abord les deux couches dans un CRS projeté en mètres, avec Vector > Data Management Tools > Reproject Layer… (Reprojeter une couche).
  • Maximum distance utilise les mêmes unités. Une valeur de 300 en degrés couvre la planète entière.

Notre guide sur ce qu'est un CRS explique la différence entre degrés et mètres et comment corriger une couche mal placée.

Vitesse sur les grosses couches

QGIS traite des jointures à l'échelle d'une ville en quelques secondes. Sur les 103 910 bâtiments de l'IGN :

  • Jointure un-à-un avec les 9 arrondissements : 0,97 s depuis un GeoPackage.
  • La même couche en Shapefile : 1,69 s. Après Vector > Data Management Tools > Create Spatial Index… (Créer un index spatial), 1,04 s.
  • Arrêt de tram le plus proche pour chaque bâtiment : 3,5 s.
  • Plus grand chevauchement : 9,62 s, l'option la plus lente.

Quatre habitudes gardent les grosses jointures rapides :

  • Travaillez depuis un GeoPackage. Il embarque un index spatial. Un Shapefile a besoin de son fichier .qix, que Create Spatial Index écrit.
  • Demandez moins de champs. Remplissez Fields to add au lieu de tout copier.
  • Évitez le plus grand chevauchement sauf si les entités en limite comptent vraiment.
  • Réparez les géométries d'abord. Un polygone invalide arrête le traitement avec le message « has invalid geometry ». L'outil Fix geometries (Réparer les géométries) de la boîte à outils de traitements le corrige. Vous pouvez aussi modifier Invalid feature filtering sous l'icône de clé à molette à côté de la couche en entrée.

Vérifiez aussi où se trouvent vos points. Seuls 211 des 382 points d'écoles tombaient dans un bâtiment de l'IGN. Les autres marquent des cours et des terrains de jeux, donc « école dans un bâtiment » aurait manqué 171 écoles.

À retenir

Utilisez Join Attributes by Location avec intersect pour donner aux points le nom de leur zone.

Utilisez la version Summary pour compter ou additionner par zone, et Join Attributes by Nearest pour l'entité la plus proche et sa distance.

Choisissez un-à-un pour les totaux, et un-à-plusieurs quand vous avez besoin de chaque correspondance.

Reprojetez dans un CRS en mètres avant tout calcul de distance.

Si vous ne savez pas quel outil convient, décrivez le résultat voulu à AI Agent et vérifiez ce qu'il a construit.

Questions fréquentes

Qu'est-ce qu'une jointure spatiale dans QGIS ?

Une jointure spatiale ajoute les champs d'une couche à une autre en fonction de la position : à l'intérieur, au contact ou le plus proche. Dans QGIS, les principaux outils sont Join Attributes by Location, sa version Summary pour les comptages et les statistiques, et Join Attributes by Nearest pour les distances.

Comment joindre des attributs par localisation dans QGIS ?

Ouvrez Vector > Data Management Tools > Join Attributes by Location…. Indiquez la couche qui reçoit les champs dans Join to features in et la couche source dans By comparing to, cochez intersect, choisissez les champs et un type de jointure un-à-un, puis lancez l'outil.

Quelle différence entre la jointure par localisation et la jointure par le plus proche ?

La jointure par localisation exige que les entités se touchent ou se chevauchent, selon le prédicat coché. La jointure par le plus proche n'exige aucun contact : elle trouve l'entité la plus proche et ajoute un champ de distance, dans les unités du CRS de la couche en entrée.

Pourquoi ma jointure spatiale renvoie-t-elle des champs vides ?

En général, les entités ne respectent pas le prédicat : des points juste à l'extérieur des polygones, un prédicat trop strict comme « are within », ou des géométries invalides. Vérifiez les deux couches sur la carte, essayez « intersect » et lancez Fix Geometries. Un CRS manquant sur une couche la place aussi au mauvais endroit.

Une IA peut-elle faire une jointure spatiale dans QGIS ?

Oui. AI Agent lance les outils QGIS à partir d'une demande écrite. Sur notre test lyonnais, il a fait un comptage par arrondissement et une jointure par le plus proche à partir d'une seule phrase en 22 secondes, avec les mêmes résultats que l'essai manuel.

Essayer AI Agent gratuitement dans QGIS, sans carte bancaire

Écrit parTerraLab
·15 min read
Contacter