Aller au contenu
Retour au blog
AI Agent
QGIS
Tutoriel

Comment géoréférencer une carte ou une image dans QGIS

Published

Une carte topographique USGS de 1947 de San Francisco divisée en deux : à gauche le scan brut, à droite la même carte géoréférencée et superposée à OpenStreetMap, le Bay Bridge se prolongeant au-delà du bord de la carte, sous le titre Géoréférencement dans QGIS.
La feuille San Francisco North de 1947, avant et après. Carte : USGS, domaine public. Fond de carte : contributeurs d'OpenStreetMap.

Pour géoréférencer une carte ou une image dans QGIS, ouvrez Layer > Georeferencer, chargez le scan avec Open Raster, cliquez sur au moins quatre points que vous pouvez identifier et saisissez leurs vraies coordonnées, choisissez Polynomial 1 et un CRS cible projeté dans Transformation Settings, puis appuyez sur Start Georeferencing. QGIS écrit un GeoTIFF et l'ajoute à votre projet.

Placer les points est la partie facile. La partie que la plupart des tutoriels passent sous silence est l'évaluation du résultat, car le nombre qu'affiche QGIS peut être zéro sur une carte décalée de plusieurs centaines de mètres. J'ai géoréférencé une carte USGS de 1947 de San Francisco et mesuré chaque résultat par rapport à des points que l'ajustement n'avait jamais vus. Les chiffres ci-dessous viennent de ce test.

La réponse en bref

Votre entréeMéthodeTemps ou coût
Un scan avec des coordonnées imprimées (graticule, graduations du quadrillage, valeurs d'angle)Méthode 1, saisissez les valeurs impriméesGratuit. 8 points, puis un redressement de 34 s sur un scan de 6,888 x 8,933 px
Un scan sans coordonnées, ou une photo d'une carteMéthode 1, From Map Canvas sur un fond de carteGratuit. Prévoyez 10 points ou plus
Un GeoPDF de l'USGS ou d'une autre agenceOuvrez-le directement, il est déjà en placeGratuit, zéro point
Points déjà relevés, et vous voulez que l'ajustement soit vérifié pour vousMéthode 2, un agent AI1 message, 99 s dans mon test
Un simple calque visuel rapide, sans précision requiseMéthode 3, le plugin Freehand raster georeferencerPlugin gratuit

Avant de commencer

Il vous faut QGIS 3.26 ou une version ultérieure, où le Georeferencer se trouve dans le menu Layer. J'ai utilisé QGIS 3.44.7. Les tutoriels plus anciens vous envoient vers Raster > Georeferencer, son emplacement d'avant, sous la forme du plugin GDAL Georeferencer.

Lisez les mentions de la carte avant de cliquer quoi que ce soit. Elles vous indiquent trois choses que vous saisirez plus tard : le système de coordonnées des valeurs imprimées, le datum et l'échelle. Mon exemple est le quadrangle USGS de San Francisco North, Californie, de 1947, au 1:24,000, que n'importe qui peut télécharger depuis topoView. Ses mentions indiquent « Polyconic projection. 1927 North American datum », et ses angles portent des latitudes et longitudes toutes les 7'30". Les cartes historiques de l'USGS sont dans le domaine public.

Pour que le test soit honnête, j'ai pris le GeoTIFF de l'USGS pour cette feuille et supprimé son géoréférencement, de sorte que ce que j'ai chargé dans QGIS était un simple JPEG de 9.2 MB de 6,888 x 8,933 pixels. Cela fait environ 300 dpi, soit 2.03 m de sol par pixel. Le géoréférencement de l'USGS est resté de côté, comme corrigé.

Ce que le web raconte de travers

« Plus le RMSE est bas, meilleur est le résultat. » Pas avec une thin plate spline. Cette transformation déforme l'image jusqu'à ce qu'elle passe exactement par chaque point, si bien que ses résidus sont toujours nuls. J'ai saisi volontairement une mauvaise latitude, 37°47' au lieu de 37°47'30", et j'ai lancé les deux transformations sur les huit mêmes points. Polynomial 1 a affiché un RMSE de 297 m et en a attribué 762 m au mauvais point. La thin plate spline affichait 0.00 m, et la carte était décalée jusqu'à 594 m sur des points qu'on ne lui avait pas donnés.

« Saisissez les coordonnées en WGS 84. » Les valeurs imprimées sur les anciennes cartes américaines sont souvent en NAD27, et les mentions de la carte le précisent. À San Francisco, la même latitude et longitude en NAD27 et en WGS 84 sont éloignées de 93 m, dont 92 m d'est en ouest. Saisissez-les en EPSG:4326 et toute la feuille atterrit un pâté de maisons plus loin, avec des résidus qui paraissent parfaits, car tous les points se sont déplacés ensemble. Dans la boîte de dialogue Enter Map Coordinates, réglez le CRS des points sur celui que les mentions indiquent : EPSG:4267 pour NAD27.

« Laissez le CRS cible en degrés. » Vous pouvez, mais un ajustement affine plat en latitude et longitude ne correspond pas à la façon dont une carte projetée a été dessinée. Avec les huit mêmes points, Polynomial 1 a donné un RMSE de 2.98 m avec EPSG:4267 comme cible, et de 0.72 m avec NAD27 / UTM zone 10N (EPSG:26710). Choisissez un CRS projeté sur le datum de la carte, et l'ajustement se lit aussi en mètres.

Méthode 1 : le Georeferencer de QGIS

C'est l'outil intégré, et celui à apprendre en premier. Il fonctionne pour les scans avec coordonnées imprimées comme pour les scans sans coordonnées.

Ouvrir le scan

Layer > Georeferencer, puis File > Open Raster et choisissez l'image. Les formats JPEG, PNG et TIFF fonctionnent tous.

Ajouter un point de contrôle

Cliquez sur Add GCP Point, zoomez et cliquez sur un endroit que vous pouvez identifier précisément : un angle du cadre de la carte, une croix de graticule, une graduation du quadrillage. La boîte de dialogue Enter Map Coordinates s'ouvre. Saisissez la coordonnée imprimée. Elle accepte les degrés, minutes et secondes avec des espaces (-122 25 0), les degrés décimaux, ou les mètres projetés. Réglez le CRS sous les champs sur celui que les mentions de la carte indiquent.

Ou prenez la coordonnée depuis le canevas de carte

Quand le scan n'a pas de coordonnées, chargez d'abord un fond de carte dans la fenêtre principale de QGIS (le guide des fonds de carte montre les clics), puis appuyez sur From Map Canvas et cliquez sur le même endroit dessus. QGIS remplit les coordonnées et le CRS pour vous.

Répartissez les points

Placez-en un près de chaque angle et quelques-uns au milieu. Des points regroupés dans une zone ajustent cette zone et laissent le reste de la feuille dériver. J'ai utilisé les quatre angles du cadre de la carte et les quatre croix de graticule à l'intérieur.

En haut : le Georeferencer zoomé sur la graduation de 25 minutes du cadre de la carte, un point vert sur la graduation. En bas : la boîte de dialogue Enter Map Coordinates avec -122 25 0 et 37 52 30 saisis et EPSG:4267 NAD27 sélectionné.
Un clic sur la graduation 25' du bord supérieur, puis sa valeur imprimée saisie en degrés, minutes et secondes, en NAD27.

Chaque point que vous ajoutez va dans un fichier .points à côté de l'image. Conservez-le : le Georeferencer le charge tout seul la prochaine fois que vous ouvrez le même scan, et vous pouvez corriger un point au lieu de tout recommencer.

Choisir la transformation

Settings > Transformation Settings renferme le choix le plus important. Le manuel QGIS 3.44 répertorie sept transformations, avec ces nombres de points minimum :

TransformationPoints minimumÀ utiliser pour
Linear2Un scan propre qui n'a besoin que d'un déplacement et d'une échelle. Écrit un world file, sans redressement
Helmert2La même chose plus une rotation
Polynomial 13La plupart des scans plats de cartes imprimées. Les lignes droites restent droites
Projective4Une photo d'une carte prise en biais
Polynomial 26Une feuille enroulée ou courbée. Déforme les bords au-delà de vos points
Polynomial 310Idem, plus fort. Rarement utile
Thin plate spline10 selon le manuelCartes abîmées ou dessinées à la main avec beaucoup de points. Masque les erreurs, voir plus haut

Ma règle : commencez par Polynomial 1. Ne passez à quelque chose de plus souple que lorsque ses résidus montrent un schéma, comme tous les points d'un même côté qui tirent dans le même sens, et jamais parce que le chiffre d'une transformation supérieure semblait pire.

La boîte de dialogue Transformation Settings avec Polynomial 1, le CRS cible EPSG:26710 NAD27 / UTM zone 10N, un fichier de sortie se terminant par _modified.tif et Cubic resampling.
Les réglages que j'ai utilisés : Polynomial 1, le datum propre de la carte dans un CRS projeté, Cubic resampling pour un scan plus lisse.

Deux réglages de cette boîte de dialogue vous éviteront des ennuis plus tard. Resampling method change l'aspect des pixels redressés : nearest neighbour conserve les couleurs d'origine, cubic rend mieux sur un scan. Et la sortie n'est pas compressée par défaut : mon JPEG de 9.2 MB est devenu un GeoTIFF de 187 MB. Ouvrez Raster creation options et choisissez un profil de compression si le fichier doit voyager.

Lire les résidus

Dès que vous avez plus de points que la transformation n'en demande, QGIS affiche le résidu de chaque point dans la table des GCP et une erreur moyenne dans la barre d'état, tous deux en pixels pour un scan sans coordonnées.

La fenêtre du Georeferencer avec le scan San Francisco North 1947 et huit points de contrôle rouges, la table des GCP répertoriant les coordonnées source et destination et les résidus entre 0.15 et 0.46 pixels, et la barre d'état affichant Transform: Polynomial 1 Mean error: 0.447243.
Huit points, Polynomial 1 : résidus de 0.15 à 0.46 pixels et une erreur moyenne de 0.447 pixels, soit environ 0.9 m au sol.

Pour juger une valeur en pixels, convertissez-la en mètres et comparez-la avec ce que la carte elle-même peut offrir.

  1. Mètres par pixel. Multipliez le dénominateur de l'échelle par la taille d'un pixel scanné. À 300 dpi, un pixel mesure 0.0847 mm, donc sur une carte au 1:24,000 il couvre 2.03 m. Mes 0.447 pixels font 0.9 m.
  2. Ce que la carte peut promettre. Les US National Map Accuracy Standards exigent que 90 % des points bien définis d'une feuille au 1:24,000 soient à moins de 1/50 de pouce, ce que l'USGS chiffre à 12.2 m. Une règle empirique plus stricte est la largeur d'un trait dessiné, 0.2 mm sur la feuille, soit 4.8 m au 1:24,000.
  3. Des points que l'ajustement n'a jamais vus. Un résidu dit seulement que les points s'accordent entre eux. J'ai laissé hors de l'ajustement les huit graduations de graticule le long des bords et mesuré où le résultat les plaçait : 1.0 m d'écart en moyenne, 1.6 m au pire.

Le géoréférencement a donc ajouté environ un mètre d'erreur à une carte qui ne promet que 12 m. Sur une feuille ancienne, la carte est presque toujours la limite, pas vos clics.

Start Georeferencing a ensuite écrit le GeoTIFF en 34 secondes et l'a ajouté au projet. Sur OpenStreetMap, les rues de 1947 tombent sur celles d'aujourd'hui :

OpenStreetMap du quartier de la Marina et de Fort Mason à San Francisco, puis la même vue avec la carte USGS de 1947 géoréférencée à 55 % d'opacité, Lombard Street et le rivage qui s'alignent (after)
OpenStreetMap du quartier de la Marina et de Fort Mason à San Francisco, puis la même vue avec la carte USGS de 1947 géoréférencée à 55 % d'opacité, Lombard Street et le rivage qui s'alignent (before)
OpenStreetMapCarte de 1947
Glisser pour comparer
Le quartier de la Marina et Fort Mason, à San Francisco. Faites glisser pour superposer la feuille de 1947 sur la carte actuelle.

À utiliser quand : vous voulez un résultat que vous pouvez défendre, avec des résidus, un fichier .points et un GeoTIFF que n'importe quel SIG lit.

À éviter quand : vous n'avez besoin que d'un arrière-plan approximatif pour quelques minutes. La méthode 3 est plus rapide pour cela.

Méthode 2 : des points de contrôle vérifiés par un agent AI

Nous développons AI Agent, un plugin QGIS gratuit avec un panneau de chat qui exécute les étapes dans votre projet ouvert. Cette section parle de notre propre outil. Il dispose d'un outil de géoréférencement qui prend des points de contrôle comme paires pixel et coordonnées, ajuste l'une des transformations du Georeferencer via GDAL, et renvoie le résidu de chaque point en mètres, évalué par rapport à l'échelle de la carte.

Il peut aussi placer un scan sans aucun point, en lisant ses noms de lieux et en le faisant correspondre à des cartes de référence : une ancienne carte d'Édimbourg dans le guide AI Agent a atterri avec une erreur médiane de 5.9 m. Cela exige des noms lisibles, et les feuilles très anciennes échouent souvent. Pour une carte avec un graticule imprimé, les points sont la voie la plus sûre, et les relever est rapide : une image sans coordonnées se trouve dans QGIS avec la colonne de pixels en x et la ligne négative en y, si bien que la barre d'état affiche le pixel sous votre curseur. J'ai chargé le scan, conservé la coquille du test ci-dessus au point 8, et envoyé un message :

Géoréférence le layer sf-north-1947-scan. C'est le quadrangle USGS de San Francisco North de 1947, échelle 1:24,000, coordonnées en NAD27. J'ai relevé ces points de contrôle sur le scan (colonne, ligne de pixels → latitude, longitude) : 1. 1022, 792 → 37°52'30"N, 122°30'O (coin nord-ouest) [...] 8. 4632, 5344 → 37°47'N, 122°25'O. Le résultat est-il assez précis pour une carte au 1:24,000 ?

L'exécution a pris 99 secondes, affichées dans le panneau comme 14 actions. L'agent a lu le layer, ajusté les huit points en Python pour les vérifier, constaté que le point 8 se trouvait à 925 m de là où sa ligne le plaçait, l'a laissé de côté, et a écrit le GeoTIFF à partir des sept autres en NAD27 / UTM zone 10N.

Il a demandé une fois, avant d'exécuter sa propre vérification Python. Sa réponse a donné un RMSE de 0.73 m avec un maximum de 0.95 m face à une tolérance de 4.8 m, et a ajouté que cela mesure l'accord entre les points, pas la précision absolue de la carte.

QGIS avec la carte de San Francisco de 1947 géoréférencée à 72 % d'opacité sur OpenStreetMap, et le panneau AI Agent à droite expliquant que le point 8 a été exclu car il était décalé d'environ 925 m, l'erreur RMS de 0.73 m et la tolérance de 4.8 m.
Un message, 99 secondes : la coquille du point 8 détectée et écartée, 0.73 m de RMSE sur les sept autres, le résultat sur le fond de carte.

J'ai vérifié son GeoTIFF de la même manière que le mien, sur les huit graduations de bord qu'il n'avait jamais vues : 1.0 m d'écart en moyenne, 1.6 m au pire, comme avec le Georeferencer. La différence, c'est la coquille. Avec le Georeferencer, j'aurais dû la repérer moi-même dans la colonne des résidus, et avec une thin plate spline je ne l'aurais pas repérée du tout.

Il a aussi laissé les points derrière lui sous forme de fichier .points à côté de la sortie, si bien que le même ajustement s'ouvre dans le Georeferencer si vous voulez déplacer un point à la main. Chaque message laisse un checkpoint dans le panneau, et un clic annule toute l'exécution. Le plan gratuit propose 10 messages par mois, sans clé API et sans carte.

À utiliser quand : vous avez les points et voulez l'ajustement, la vérification des valeurs aberrantes et le verdict en une seule étape, ou que vous géoréférencez des feuilles en série.

À éviter quand : la carte n'a ni noms de lieux lisibles ni points que vous puissiez relever, comme un croquis dessiné à la main. Placer les points à la main dans la méthode 1 est alors la seule voie.

Essayez AI Agent gratuitement dans QGIS

Méthode 3 : un calque d'ajustement manuel avec un plugin

Le plugin Freehand raster georeferencer, version 0.8.3 quand j'ai lu sa documentation, vous permet de déposer une image sur la carte et de la déplacer, la faire pivoter et la mettre à l'échelle à la main jusqu'à ce qu'elle s'aligne, comme vous le feriez dans Google Earth. Le résultat s'affiche immédiatement par-dessus vos autres layers, et le plugin exporte l'image avec un world file lorsque vous avez terminé.

Son README est clair sur les limites : transformations affines uniquement, pas de rubber sheeting, pas de résidus, et uniquement les fichiers BMP, JPEG, PNG et TIFF. Vous n'obtenez aucun chiffre qui indique votre écart.

À utiliser quand : vous avez besoin d'un plan scanné grossièrement en place pour numériser quelques éléments ou pour montrer à un client où se trouvaient les choses.

À éviter quand : quelqu'un doit mesurer sur le résultat. Utilisez la méthode 1.

À retenir

  • Dans QGIS 3.26 et versions ultérieures, l'outil se trouve dans Layer > Georeferencer. Commencez avec quatre points bien répartis, Polynomial 1 et un CRS cible projeté sur le datum propre de la carte.
  • Un RMSE de zéro ne prouve rien : une thin plate spline y parvient toujours, et dans mon test elle l'a fait sur une carte décalée de 594 m.
  • Convertissez les résidus en mètres (pixels x taille au sol d'un pixel) et comparez-les avec ce que la carte promet, 12.2 m pour une feuille USGS au 1:24,000.
  • Vérifiez le résultat sur des points que vous avez laissés hors de l'ajustement. Les miens étaient à 1.0 m d'écart en moyenne sur la feuille de San Francisco de 1947.
  • Saisissez les points dans le datum que les mentions de la carte indiquent. NAD27 se trouve à 93 m de WGS 84 à San Francisco, donc une feuille USGS de 1947 prend EPSG:4267.

Questions fréquentes

Où se trouve le Georeferencer dans QGIS ?

Dans QGIS 3.26 et versions ultérieures, il se trouve sous Layer > Georeferencer. Dans les versions plus anciennes, il était dans Raster > Georeferencer, fourni par le plugin GDAL Georeferencer, qu'il fallait activer dans le gestionnaire de plugins. Si aucun des deux menus ne l'affiche, un plugin ou un profil de personnalisation a peut-être modifié vos menus.

De combien de points de contrôle ai-je besoin ?

Le minimum est de 2 pour Linear et Helmert, 3 pour Polynomial 1, 4 pour Projective, 6 pour Polynomial 2 et 10 pour Polynomial 3, et le manuel QGIS demande 10 points ou plus pour une thin plate spline. En pratique, utilisez environ le double du minimum, répartis vers les angles, et gardez quelques points de plus de côté comme points de vérification. J'ai utilisé 8 points pour Polynomial 1 et 8 de plus pour vérifier.

Polynomial, Helmert ou thin plate spline : lequel choisir ?

Helmert pour un scan propre et plat qui n'a besoin que d'une rotation et d'une mise à l'échelle. Polynomial 1 pour presque toutes les cartes imprimées, car il absorbe aussi un petit cisaillement du scanner. Thin plate spline uniquement pour une carte abîmée ou dessinée à la main avec beaucoup de bons points, et vérifiez-la ensuite sur des points que vous n'avez pas utilisés, car ses résidus sont toujours nuls.

Quel est un bon RMSE ?

Un RMSE faible par rapport à ce que la carte peut offrir. Convertissez-le en mètres et comparez-le à 0.2 mm multiplié par le dénominateur de l'échelle (4.8 m au 1:24,000) ou à la norme officielle de la carte (12.2 m pour les feuilles USGS au 1:24,000). Moins d'un pixel sur un scan propre est normal. Un seul point avec un résidu bien supérieur aux autres est généralement une coquille ou un mauvais clic, pas une mauvaise carte.

Comment géoréférencer un PDF ?

Vérifiez d'abord s'il ne l'est pas déjà. Les cartes topographiques de l'USGS et de nombreux plans d'organismes sont des GeoPDF, et QGIS les ouvre en place : le PDF de San Francisco de 1947 s'est chargé avec ses coordonnées et sans point de contrôle, rendu par GDAL à 150 dpi sauf si vous réglez GDAL_PDF_DPI plus haut. Un PDF ordinaire n'a pas de coordonnées : exportez la page en PNG ou TIFF à 300 dpi, puis utilisez la méthode 1.

Comment géoréférencer une carte sans coordonnées dessus ?

Utilisez des éléments qui n'ont pas bougé depuis que la carte a été dessinée, comme les intersections de routes, les ponts, les églises et les angles du littoral, et relevez leurs coordonnées avec From Map Canvas sur un fond de carte ou sur votre orthophoto nationale. Répartissez-en 10 ou plus sur la feuille. Attendez-vous à des résidus plus importants qu'avec un quadrillage imprimé, car l'ancienne carte et le monde actuel ne s'accordent plus partout.

Le hub AI QGIS recense ce que l'AI peut et ne peut pas faire dans QGIS, et le guide AI Agent couvre le reste du plugin. Une fois l'ancienne carte en place, vous pouvez télécharger les données OpenStreetMap pour les comparer aux rues actuelles, récupérer une image Sentinel-2 de la même zone, ou convertir le scan en vecteurs.

Essayez AI Agent gratuitement dans QGIS