5  Systèmes de Coordonnées de Référence

Author

Dr. Elisabetta Pietrostefani

Published

March 22, 2026

5.1 Pourquoi les SCR sont-ils importants ?

Imaginez deux couches de données : des communes françaises en Lambert-93 et des points GPS en WGS84. Si vous les superposez sans harmoniser les SCR, vos communes peuvent se retrouver au milieu de l’océan Atlantique. Les Systèmes de Coordonnées de Référence (SCR) définissent ce que signifient vos coordonnées — sans eux, un point (2.35, 48.85) ne veut rien dire.

Règle d’or

Toujours vérifier et harmoniser les SCR avant de combiner deux couches spatiales.

Code
library(sf)
library(spData)
library(ggplot2)
library(dplyr)
library(patchwork)

5.2 Les concepts fondamentaux

5.2.1 Coordonnées et espace cartésien

Une coordonnée est un nombre mesuré le long d’une règle imaginaire, avec une origine (0), une unité (mètre, degré…) et une direction. Dans l’espace cartésien 2D, la distance entre deux points \((x_1, y_1)\) et \((x_2, y_2)\) est :

\[d = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2}\]

Ce calcul n’est valide qu’en coordonnées projetées (mètres). En longitude/latitude, un degré ne vaut pas la même distance selon l’endroit sur le globe.

5.2.2 Systèmes de coordonnées géographiques

Les systèmes géographiques identifient tout emplacement sur Terre via longitude et latitude — des mesures angulaires par rapport au méridien de Greenwich et à l’équateur. Les distances ne sont pas en mètres dans ce type de SCR.

La surface terrestre est modélisée par un ellipsoïde. L’ellipsoïde combiné à un point d’ancrage forme un datum :

  • WGS84 — géocentrique, utilisé par le GPS et la plupart des données mondiales
  • RGF93 — datum officiel de la France métropolitaine
  • NAD83 — Amérique du Nord

5.2.3 Systèmes de coordonnées projetées

Pour travailler sur une surface plane (papier, écran), les coordonnées sphériques sont projetées en coordonnées cartésiennes (x, y) en mètres. Cette projection introduit inévitablement des déformations — aucune projection ne peut préserver à la fois la surface, la forme, la distance et la direction.

Propriété préservée Projection adaptée
Aire (équivalente) Mollweide, Albers
Forme (conforme) Mercator, Lambert conique
Distance Azimutale équidistante
Compromis général Robinson, Winkel Tripel

5.2.4 Codes EPSG courants

Code EPSG Nom Usage
4326 WGS84 GPS, stockage de données mondiales
2154 RGF93 / Lambert-93 France métropolitaine ✓
27700 British National Grid Royaume-Uni
3857 Web Mercator Fonds de carte web (Google, OSM)
4559 UTM 20N Guadeloupe & Martinique
2975 UTM 20S La Réunion
2972 UTM 22N Guyane
4471 UTM 38S Mayotte

Recherchez n’importe quel code sur epsg.io.


5.3 SCR dans R avec sf

5.3.1 Inspecter un SCR

Code
# Interroger un SCR directement par son code EPSG
st_crs("EPSG:4326")
Coordinate Reference System:
  User input: EPSG:4326 
  wkt:
GEOGCRS["WGS 84",
    ENSEMBLE["World Geodetic System 1984 ensemble",
        MEMBER["World Geodetic System 1984 (Transit)"],
        MEMBER["World Geodetic System 1984 (G730)"],
        MEMBER["World Geodetic System 1984 (G873)"],
        MEMBER["World Geodetic System 1984 (G1150)"],
        MEMBER["World Geodetic System 1984 (G1674)"],
        MEMBER["World Geodetic System 1984 (G1762)"],
        MEMBER["World Geodetic System 1984 (G2139)"],
        MEMBER["World Geodetic System 1984 (G2296)"],
        ELLIPSOID["WGS 84",6378137,298.257223563,
            LENGTHUNIT["metre",1]],
        ENSEMBLEACCURACY[2.0]],
    PRIMEM["Greenwich",0,
        ANGLEUNIT["degree",0.0174532925199433]],
    CS[ellipsoidal,2],
        AXIS["geodetic latitude (Lat)",north,
            ORDER[1],
            ANGLEUNIT["degree",0.0174532925199433]],
        AXIS["geodetic longitude (Lon)",east,
            ORDER[2],
            ANGLEUNIT["degree",0.0174532925199433]],
    USAGE[
        SCOPE["Horizontal component of 3D system."],
        AREA["World."],
        BBOX[-90,-180,90,180]],
    ID["EPSG",4326]]
Code
# Charger un fichier vectoriel et inspecter son SCR
vector_filepath <- system.file("shapes/world.gpkg", package = "spData")
new_vector      <- read_sf(vector_filepath)

st_crs(new_vector)$IsGeographic   # géographique ou projeté ?
[1] TRUE
Code
st_crs(new_vector)$units_gdal     # unités (degrees, metre…)
[1] "degree"
Code
st_crs(new_vector)$srid           # code SRID (ex. EPSG:4326)
[1] "EPSG:4326"
Code
st_crs(new_vector)$proj4string    # chaîne proj4
[1] "+proj=longlat +datum=WGS84 +no_defs"

5.3.2 Définir un SCR manquant

Code
# Si le SCR est absent du fichier, le déclarer manuellement
new_vector <- st_set_crs(new_vector, "EPSG:4326")
st_set_crs()st_transform()
  • st_set_crs() déclare le SCR sans toucher aux coordonnées — à utiliser quand le SCR est absent ou mal renseigné
  • st_transform() reprojecte les coordonnées vers un nouveau SCR — à utiliser pour changer de projection

Confondre les deux est l’une des erreurs les plus fréquentes en SIG.


5.4 L’effet de la projection sur la forme

Une même couche de données peut avoir une apparence très différente selon la projection utilisée. C’est un choix éditorial autant que technique.

Code
# WGS84 — projection par défaut (longitude/latitude)
p1 <- ggplot(world) +
  geom_sf(aes(fill = continent), show.legend = FALSE,
          linewidth = 0.1, color = "white") +
  scale_fill_brewer(palette = "Set3") +
  labs(title    = "WGS84 (EPSG:4326)",
       subtitle = "Longitude / latitude — déformation aux pôles") +
  theme_void(base_size = 10) +
  theme(plot.title    = element_text(face = "bold", hjust = 0.5),
        plot.subtitle = element_text(color = "grey40", hjust = 0.5, size = 8))

# Mollweide — aire préservée
world_moll <- st_transform(world, crs = "+proj=moll")
p2 <- ggplot(world_moll) +
  geom_sf(aes(fill = continent), show.legend = FALSE,
          linewidth = 0.1, color = "white") +
  scale_fill_brewer(palette = "Set3") +
  labs(title    = "Mollweide",
       subtitle = "Aire préservée — idéale pour les cartes thématiques mondiales") +
  theme_void(base_size = 10) +
  theme(plot.title    = element_text(face = "bold", hjust = 0.5),
        plot.subtitle = element_text(color = "grey40", hjust = 0.5, size = 8))

# Lambert azimutale centrée sur Paris
world_laea <- st_transform(
  world, crs = "+proj=laea +x_0=0 +y_0=0 +lon_0=2.3 +lat_0=48.9"
)
p3 <- ggplot(world_laea) +
  geom_sf(aes(fill = continent), show.legend = FALSE,
          linewidth = 0.1, color = "white") +
  scale_fill_brewer(palette = "Set3") +
  labs(title    = "Lambert azimutale (centrée sur Paris)",
       subtitle = "Distance préservée depuis le centre — vue satellite") +
  theme_void(base_size = 10) +
  theme(plot.title    = element_text(face = "bold", hjust = 0.5),
        plot.subtitle = element_text(color = "grey40", hjust = 0.5, size = 8))

p1 / p2 / p3
Figure 5.1: La même couche mondiale sous trois projections différentes
Quelle projection choisir ?
  • France métropolitaine → Lambert-93 (EPSG:2154) — projection officielle de l’IGN
  • Données mondiales → WGS84 pour stocker, Mollweide pour visualiser l’aire
  • Cartes web → Web Mercator (EPSG:3857)
  • Toute analyse de distance ou de superficie → toujours une projection en mètres

5.5 Application : La France en Lambert-93

Lambert-93 est la projection officielle pour la France métropolitaine. Comparer WGS84 et Lambert-93 montre pourquoi la projection choisie change la forme perçue du territoire.

Code
france_wgs84   <- world[world$name_long == "France", ]
france_lambert <- st_transform(france_wgs84, 2154)

p_wgs <- ggplot(france_wgs84) +
  geom_sf(fill = "#2c7bb6", color = "white", linewidth = 0.5) +
  labs(title    = "WGS84 (EPSG:4326)",
       subtitle = "Degrés — non adapté aux calculs de distance") +
  theme_void(base_size = 11) +
  theme(plot.title    = element_text(face = "bold", hjust = 0.5),
        plot.subtitle = element_text(color = "grey40", hjust = 0.5, size = 9))

p_lam <- ggplot(france_lambert) +
  geom_sf(fill = "#d7191c", color = "white", linewidth = 0.5) +
  labs(title    = "Lambert-93 (EPSG:2154)",
       subtitle = "Mètres — projection officielle IGN") +
  theme_void(base_size = 11) +
  theme(plot.title    = element_text(face = "bold", hjust = 0.5),
        plot.subtitle = element_text(color = "grey40", hjust = 0.5, size = 9))

p_wgs + p_lam
Figure 5.2: La France en WGS84 (géographique) vs Lambert-93 (projeté) — la forme est différente

5.5.1 Calculer des superficies correctement

Code
# En WGS84 : st_area() donne des résultats en m² via s2 (sphère)
# En Lambert-93 : calcul plan exact en mètres carrés
france_lambert |>
  mutate(superficie_km2 = as.numeric(st_area(france_lambert)) / 1e6) |>
  st_drop_geometry() |>
  select(name_long, superficie_km2)
# A tibble: 1 × 2
  name_long superficie_km2
  <chr>              <dbl>
1 France           698198.

5.6 Exercices

Exercice 1 — Comparer deux projections

Reprojetez la France en Web Mercator (EPSG:3857) et affichez les trois projections côte à côte (WGS84, Lambert-93, Web Mercator). Laquelle déforme le plus le territoire ?

Code
france_mercator <- st_transform(france_wgs84, 3857)

ggplot(france_mercator) +
  geom_sf(fill = "...", color = "white") +
  labs(title = "Web Mercator (EPSG:3857)") +
  theme_void()
Exercice 2 — Superficies des régions françaises
  1. Chargez gadm41_FRA_1.shp (régions françaises depuis GADM)
  2. Vérifiez son SCR avec st_crs()
  3. Reprojetez en Lambert-93
  4. Calculez la superficie de chaque région avec st_area()
  5. Cartographiez les superficies avec ggplot2
Code
france_reg <- read_sf("data/France/gadm41_FRA_shp/gadm41_FRA_1.shp")

st_crs(france_reg)   # 1. Vérifier

france_reg_lambert <- st_transform(france_reg, 2154)   # 2. Reprojeter

france_reg_lambert <- france_reg_lambert |>
  mutate(superficie_km2 = as.numeric(st_area(france_reg_lambert)) / 1e6)  # 3. Calculer

ggplot(france_reg_lambert) +
  geom_sf(aes(fill = superficie_km2), color = "white", linewidth = 0.3) +
  scale_fill_viridis_c(name = "Superficie (km²)") +
  labs(title   = "Superficie des régions françaises",
       caption = "Source : GADM | Cours R-Carto") +
  theme_void()