Systèmes de coordonnées et projections
Effectuez correctement des transformations entre CRS avec st_crs() et st_transform().
Systèmes de coordonnées et projections est une leçon R Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage R Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours R Academy comprend 4 leçons au total.
Pourquoi le CRS est important
Un système de référence des coordonnées (CRS) indique à R ce que signifient les nombres de votre colonne de géométrie — des degrés de latitude et de longitude, des mètres dans une grille projetée ou autre chose. Mélanger des données utilisant des CRS différents sans les reprojeter peut faire échouer silencieusement les jointures spatiales et fausser les calculs de distance.
library(sf)
# Two sf objects in the same CRS: operations work
nc <- read_sf(system.file('shape/nc.shp', package = 'sf'))
# sf will error or warn when CRS do not match during operations
# This is the CRS metadata attached to the object
crs <- st_crs(nc)
cat('EPSG:', crs$epsg, '\n')
cat('Input is geographic (lon/lat)?', st_is_longlat(nc), '\n')
cat('Units:', crs$units_gdal, '\n')st_crs : lire les informations du CRS
st_crs(sf_obj) renvoie un objet crs contenant le code EPSG, la chaîne WKT, la chaîne Proj4 et les informations d’unité. Vous pouvez également transmettre directement un code EPSG entier pour récupérer la définition du CRS.
library(sf)
nc <- read_sf(system.file('shape/nc.shp', package = 'sf'))
# Inspect the CRS object
crs <- st_crs(nc)
cat('Class:', class(crs), '\n')
cat('EPSG:', crs$epsg, '\n')
cat('Proj4:', substr(crs$proj4string, 1, 60), '...\n')
# Lookup a CRS by EPSG code
wgs84 <- st_crs(4326)
web_mercator <- st_crs(3857)
cat('\nWGS84 name:', wgs84$Name, '\n')
cat('Web Mercator name:', web_mercator$Name, '\n')EPSG:4326 — WGS84
EPSG:4326 correspond au World Geodetic System 1984 — la référence standard pour les coordonnées GPS. Les coordonnées sont exprimées en degrés décimaux : la longitude (X) va de −180 à 180 et la latitude (Y) de −90 à 90. Il s’agit d’un CRS géographique, et non projeté.
library(sf)
# Create points in WGS84 (GPS coordinates)
cities <- data.frame(
city = c('London', 'Tokyo', 'Sydney', 'New York'),
lon = c(-0.118, 139.692, 151.209, -74.006),
lat = c(51.509, 35.689, -33.869, 40.713)
)
cities_sf <- st_as_sf(cities,
coords = c('lon', 'lat'),
crs = 4326
)
cat('CRS:', st_crs(cities_sf)$Name, '\n')
cat('Units:', st_crs(cities_sf)$units_gdal, '\n')
# Naive distance in degrees (not meaningful for real distances)
d <- st_distance(cities_sf[1, ], cities_sf[2, ])
cat('London-Tokyo distance (degrees):', round(as.numeric(d), 2), '\n')EPSG:3857 — Mercator Web
EPSG:3857 est la projection Web Mercator utilisée par Google Maps, OpenStreetMap et Leaflet. Les coordonnées sont exprimées en mètres, autour du méridien d’origine et de l’équateur. Cette projection déforme les surfaces proches des pôles, mais convient bien à la visualisation sur le Web.
library(sf)
cities <- data.frame(
city = c('London', 'Tokyo'),
lon = c(-0.118, 139.692),
lat = c(51.509, 35.689)
)
cities_sf <- st_as_sf(cities, coords = c('lon', 'lat'), crs = 4326)
# Transform to Web Mercator
cities_merc <- st_transform(cities_sf, 3857)
cat('WGS84 coords (degrees):\n')
print(st_coordinates(cities_sf))
cat('\nWeb Mercator coords (metres):\n')
print(st_coordinates(cities_merc))
# Distance is now in metres
d <- st_distance(cities_merc[1, ], cities_merc[2, ])
cat('\nLondon-Tokyo distance (km):', round(as.numeric(d) / 1000, 0), '\n')st_set_crs : attribuer un CRS
st_set_crs(sf_obj, crs) attribue un CRS sans transformer les coordonnées. Utilisez cette fonction uniquement lorsque les métadonnées du CRS sont absentes ou incorrectes. Si vous souhaitez reprojeter les coordonnées vers un nouveau CRS, utilisez plutôt st_transform().
library(sf)
# Create geometry with NO CRS
pts <- st_sfc(
st_point(c(-74.006, 40.713)),
st_point(c(-87.629, 41.878))
)
cat('CRS before:', is.na(st_crs(pts)), '(NA = no CRS)\n')
# Assign WGS84 (no coordinate transformation)
pts_wgs84 <- st_set_crs(pts, 4326)
cat('CRS after assignment:', st_crs(pts_wgs84)$epsg, '\n')
# Compare with st_transform (DOES transform coordinates)
pts_sf <- st_sf(id = 1:2, geometry = pts_wgs84)
pts_merc <- st_transform(pts_sf, 3857)
cat('Original lon:', st_coordinates(pts_sf)[1, 'X'], '\n')
cat('Mercator X: ', st_coordinates(pts_merc)[1, 'X'], '\n')st_transform : reprojeter
st_transform(sf_obj, crs) reprojette toutes les géométries de leur CRS actuel vers le CRS cible en appliquant la transformation géodésique complète. L’argument crs accepte un entier EPSG, une chaîne Proj4 ou une chaîne WKT.
library(sf)
nc <- read_sf(system.file('shape/nc.shp', package = 'sf'))
cat('Original CRS:', st_crs(nc)$epsg, '\n')
# Re-project to WGS84
nc_wgs84 <- st_transform(nc, 4326)
cat('Transformed CRS:', st_crs(nc_wgs84)$epsg, '\n')
# Re-project to a local projected CRS (NC State Plane)
nc_stateplane <- st_transform(nc, 32119) # NAD83 / North Carolina
cat('State Plane CRS:', st_crs(nc_stateplane)$Name, '\n')
# Area calculation is more accurate in a projected CRS
area_deg <- st_area(nc[1, ])
area_m2 <- st_area(nc_stateplane[1, ])
cat('Area (degrees^2):', format(area_deg, big.mark = ','), '\n')
cat('Area (m^2): ', format(area_m2, big.mark = ','), '\n')Choisir la bonne projection
Les différentes projections optimisent des propriétés différentes : conservation des surfaces (par ex. Mollweide), conformité (Mercator) ou conservation des distances. Pour une analyse locale, utilisez un CRS projeté en mètres ; pour une vue d’ensemble mondiale, WGS84 convient ; pour les cartes Web, utilisez Web Mercator.
library(sf)
# Common EPSG codes cheat sheet
epsg_table <- data.frame(
EPSG = c(4326, 3857, 4269, 32637, 27700),
Name = c(
'WGS84 (GPS, global)',
'Web Mercator (web maps)',
'NAD83 (North America geographic)',
'UTM zone 37N (Middle East)',
'British National Grid (UK)'
),
Units = c('degrees', 'metres', 'degrees', 'metres', 'metres')
)
print(epsg_table, row.names = FALSE)
# Look up any EPSG online: https://epsg.io/<code>
cat('\nTip: use st_crs(epsg_code)$Name to verify a code\n')Chaînes Proj4
Avant que les codes EPSG ne deviennent la norme, les CRS étaient définis par des chaînes Proj4 — des chaînes de paramètres compactes transmises à la bibliothèque PROJ. Vous pouvez encore les utiliser avec st_transform(), mais les codes EPSG sont préférables pour leur clarté et leur compatibilité à long terme.
library(sf)
nc <- read_sf(system.file('shape/nc.shp', package = 'sf'))
# WGS84 as Proj4 string
wgs84_proj4 <- '+proj=longlat +datum=WGS84 +no_defs'
nc_wgs84 <- st_transform(nc, crs = wgs84_proj4)
cat('Using Proj4 string:\n', wgs84_proj4, '\n')
cat('Result CRS EPSG:', st_crs(nc_wgs84)$epsg, '\n')
# Compare: equivalent to st_transform(nc, 4326)
cat('Same as EPSG 4326?',
identical(st_crs(nc_wgs84), st_crs(st_transform(nc, 4326))), '\n')Vérifier l’égalité des CRS
Avant toute jointure spatiale ou opération de superposition, vérifiez que les deux objets partagent le même CRS à l’aide de st_crs(a) == st_crs(b). S’ils diffèrent, transformez l’un pour qu’il corresponde à l’autre avant de poursuivre.
library(sf)
# Two objects in different CRS
nc_nad27 <- read_sf(system.file('shape/nc.shp', package = 'sf'))
nc_wgs84 <- st_transform(nc_nad27, 4326)
cat('Same CRS?', st_crs(nc_nad27) == st_crs(nc_wgs84), '\n')
# Always check before join/overlay
align_crs <- function(a, b) {
if (st_crs(a) != st_crs(b)) {
message('CRS mismatch! Transforming b to match a.')
b <- st_transform(b, st_crs(a))
}
list(a = a, b = b)
}
aligned <- align_crs(nc_nad27, nc_wgs84)
cat('After alignment - same CRS?',
st_crs(aligned$a) == st_crs(aligned$b), '\n')Calculer des distances avec un CRS
Les distances calculées dans un CRS géographique (en degrés) n’ont pas de signification. Reprojetez d’abord les données dans un CRS projeté conservant les distances ou les surfaces, ou utilisez le calcul de distance géodésique intégré à sf, qui gère correctement WGS84 via la bibliothèque PROJ.
library(sf)
# City points in WGS84
cities <- data.frame(
city = c('Paris', 'Berlin', 'Madrid', 'Rome'),
lon = c(2.350, 13.404, -3.702, 12.496),
lat = c(48.865, 52.520, 40.417, 41.902)
)
cities_sf <- st_as_sf(cities, coords = c('lon', 'lat'), crs = 4326)
# sf computes geodesic distances on WGS84 automatically
dist_matrix <- st_distance(cities_sf)
rownames(dist_matrix) <- cities$city
colnames(dist_matrix) <- cities$city
# Convert to km
dist_km <- round(as.numeric(dist_matrix) / 1000)
mat_km <- matrix(dist_km, 4, 4, dimnames = list(cities$city, cities$city))
print(mat_km)Flux de travail CRS complet
Voici un flux de travail complet : charger les données GPS brutes, attribuer WGS84, reprojeter vers un CRS métrique local pour calculer précisément les surfaces et les distances, effectuer l’analyse, puis reprojeter vers WGS84 pour produire les données destinées à une carte Web.
library(sf)
# Load and assign CRS
nc <- read_sf(system.file('shape/nc.shp', package = 'sf'))
nc_wgs84 <- st_transform(nc, 4326)
# Re-project to NC State Plane (metres) for accurate areas
nc_proj <- st_transform(nc, 32119)
# Compute area per county in km2
nc_proj$area_km2 <- as.numeric(st_area(nc_proj)) / 1e6
# Top 5 largest counties
top5 <- nc_proj[order(-nc_proj$area_km2), c('NAME', 'area_km2')]
cat('5 Largest NC Counties (km2):\n')
print(head(as.data.frame(top5)[, c('NAME', 'area_km2')], 5))
# Back to WGS84 for output
nc_output <- st_transform(nc_proj, 4326)
cat('\nOutput CRS:', st_crs(nc_output)$epsg, '\n')Vérification rapide
Vous devez calculer avec précision les surfaces (en mètres carrés) d’entités polygonales actuellement en WGS84 (EPSG:4326). Que devez-vous faire ?
Récapitulatif : CRS et projections
Points essentiels :
st_crs(sf_obj)lit les métadonnées du CRS ; les codes EPSG sont la méthode privilégiée pour spécifier un CRS- EPSG:4326 = WGS84 (degrés, pour le GPS) ; EPSG:3857 = Web Mercator (mètres, pour les cartes Web)
st_set_crs()attribue un CRS sans transformer les coordonnées ;st_transform()les reprojette- Vérifiez toujours l’égalité des CRS avec
st_crs(a) == st_crs(b)avant les opérations spatiales - Pour calculer précisément les distances et les surfaces, reprojetez d’abord les données vers un CRS projeté métrique
- Les chaînes Proj4 fonctionnent encore, mais les codes EPSG sont plus clairs et plus lisibles
library(sf)
nc <- read_sf(system.file('shape/nc.shp', package = 'sf'))
# CRS pipeline
cat('Original:', st_crs(nc)$epsg, '\n')
nc_wgs84 <- st_transform(nc, 4326)
nc_proj <- st_transform(nc_wgs84, 32119)
cat('WGS84:', st_crs(nc_wgs84)$epsg, '\n')
cat('Projected:', st_crs(nc_proj)$epsg, '\n')Questions Fréquemment Posées
La leçon « Systèmes de coordonnées et projections » est-elle gratuite ?
Oui — le texte complet de « Systèmes de coordonnées et projections » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours R Academy, passe à CoddyKit PRO. Le cours R Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Systèmes de coordonnées et projections » ?
Effectuez correctement des transformations entre CRS avec st_crs() et st_transform(). Tu pratiques R Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer R Academy ?
Aucune expérience préalable n'est requise. R Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Systèmes de coordonnées et projections » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon R Academy ?
Oui. Chaque leçon R Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Objets spatiaux simples avec le paquet sf
- Systèmes de coordonnées et projections
- Jointures et opérations spatiales
- Cartes interactives avec leaflet