Dans le chapitre Données Raster, nous avons vu ce qu’est un raster, les grands types de données (MNT, images multispectrales, nightlights), le compromis résolution spatiale/temporelle, et les principales sources d’imagerie. Ce chapitre part de là pour se concentrer entièrement sur les Modèles Numériques de Terrain : comment les obtenir, les charger, et en extraire des indices topographiques utiles.
Les cinq opérations couvertes sur un MNT du Liban :
Opération
Fonction
Charger et explorer
rast()
Recadrer et masquer
crop() + mask()
Calculer la pente
terrain()
Reclassifier
classify()
Extraire vers des données vecteur
terra::extract()
À la fin, vous reproduirez ces étapes sur la Corse en exercice indépendant.
8.2 Obtenir des données d’altitude
Trois grandes familles de sources couvrent les besoins selon l’étendue géographique et la résolution souhaitée : les données globales de la NASA (SRTM, ASTER GDEM, NASADEM), les données françaises de haute précision de l’IGN (RGE ALTI®), et les tuiles accessibles directement depuis R via le package elevatr.
La NASA distribue plusieurs MNT mondiaux librement accessibles après création d’un compte gratuit sur Earthdata.
Les trois produits NASA à connaître
SRTM (Shuttle Radar Topography Mission, 2000) — collecté en 11 jours par la navette spatiale Endeavour, il couvre 80 % de la surface terrestre à ~30 m de résolution. C’est la référence mondiale pour la plupart des analyses topographiques.
ASTER GDEM v3 — produit à partir de plus d’un million d’images stéréoscopiques du satellite Terra (NASA/METI), il couvre 99 % de la surface terrestre jusqu’à 83° de latitude. Résolution nominale de 30 m, mais précision réelle légèrement inférieure au SRTM dans les zones nuageuses.
NASADEM — retraitement amélioré du SRTM intégrant des données ASTER GDEM, ICESat et ALOS pour combler les vides et améliorer la précision verticale. À privilégier par rapport au SRTM brut pour les nouvelles analyses.
Les données sont distribuées en tuiles de 1° × 1° au format GeoTIFF. Une fois téléchargées, on les charge et assemble directement avec terra :
Code
library(terra)library(tidyterra)library(ggplot2)# Après téléchargement manuel depuis https://earthdata.nasa.gov# Les fichiers SRTM ont la convention de nommage : N48E002.SRTMGL1.hgt.zip# Les fichiers NASADEM : NASADEM_HGT_n48e002.zip# Charger une tuile SRTM décompresséesrtm_tuile <-rast("data/DEM/N48E002.hgt")cat("Résolution :", res(srtm_tuile), "degrés (~30 m)\n")cat("Étendue :", as.character(ext(srtm_tuile)), "\n")# Assembler plusieurs tuiles avec mosaic()# (nécessaire si la zone d'intérêt couvre plusieurs tuiles)t1 <-rast("data/DEM/N48E001.hgt")t2 <-rast("data/DEM/N48E002.hgt")t3 <-rast("data/DEM/N49E001.hgt")t4 <-rast("data/DEM/N49E002.hgt")dem_mosaic <-mosaic(t1, t2, t3, t4, fun ="mean")ggplot() +geom_spatraster(data = dem_mosaic) +scale_fill_gradientn(colors =hcl.colors(50, "Terrain"),name ="Altitude (m)",na.value ="transparent") +labs(title ="MNT SRTM assemblé",caption ="Source : NASA SRTM | Earthdata") +theme_void(base_size =12) +theme(plot.title =element_text(face ="bold", hjust =0.5))
8.2.3 Option 2 — RGE ALTI® : le MNT 1 m de l’IGN pour la France
Pour les analyses sur la France, le RGE ALTI® de l’IGN est la source de référence. Il décrit l’altitude de la surface du sol à 1 mètre de résolution sur l’ensemble du territoire métropolitain et des DOM-TOM, avec une précision verticale de 20 cm dans les zones inondables et littorales.
Créez un compte gratuit sur le Géoportail de l’IGN
Sélectionnez le département ou la région souhaités
Choisissez le format GeoTIFF et la résolution 1 m ou 5 m
Les fichiers sont distribués par dalles (tuiles) — utilisez mosaic() pour les assembler
Le RGE ALTI® à 1 m est aussi accessible via l’API flux WCS de l’IGN pour une extraction directe par emprise.
Code
# Après téléchargement depuis geoservices.ign.fr/rgealti# Structure typique des fichiers IGN :# RGEALTI_2-0_1M_ASC_LAMB93-IGN69_D075_2021-01-01/# RGEALTI_FXX_0630_6860_MNT_LAMB93_IGN69.asc ← tuiles ASCII Grid# ou format GeoTIFF selon la version téléchargée# Charger une tuile GeoTIFFign_tuile <-rast("data/IGN/RGEALTI_FXX_0630_6860_MNT_LAMB93_IGN69.tif")cat("SCR :", crs(ign_tuile, describe =TRUE)$name, "\n") # Lambert-93cat("Résolution :", res(ign_tuile), "mètres\n") # 1 m × 1 mcat("Min / Max :", global(ign_tuile, "range", na.rm =TRUE)[[1]], "m\n")# Le RGE ALTI® est déjà en Lambert-93 (EPSG:2154) — aucune reprojection nécessaire# pour les analyses sur la France# Si les fichiers sont au format ASCII Grid (.asc), terra les lit de la même façonign_asc <-rast("data/IGN/RGEALTI_FXX_0630_6860_MNT_LAMB93_IGN69.asc")# Assembler plusieurs dallesdalles <-list.files("data/IGN/", pattern ="\\.tif$", full.names =TRUE)dem_ign <-do.call(mosaic, c(lapply(dalles, rast), list(fun ="mean")))ggplot() +geom_spatraster(data = dem_ign) +scale_fill_gradientn(colors =hcl.colors(50, "Terrain"),name ="Altitude (m)",na.value ="transparent") +labs(title ="RGE ALTI® IGN — résolution 1 m",caption ="Source : IGN — RGE ALTI® | geoservices.ign.fr") +theme_void(base_size =12) +theme(plot.title =element_text(face ="bold", hjust =0.5))
8.2.4 Option 3 — NextGIS : SRTM France prêt à l’emploi
NextGIS propose des MNT SRTM préconfigurés par pays, directement téléchargeables au format GeoTIFF sans création de compte. C’est l’option la plus rapide pour obtenir un MNT de la France entière à ~30 m de résolution.
Code
# Après téléchargement depuis https://data.nextgis.com/en/region/FR/dem/# Le fichier est un GeoTIFF unique couvrant toute la Francedem_france <-rast("data/nextgis/dem.tif")cat("SCR :", crs(dem_france, describe =TRUE)$name, "\n")cat("Résolution :", res(dem_france), "\n")cat("Min / Max :", global(dem_france, "min", na.rm =TRUE)[[1]], "/",global(dem_france, "max", na.rm =TRUE)[[1]], "m\n")# Reprojeter en Lambert-93 pour les analyses sur la Francedem_france_l93 <-project(dem_france, "EPSG:2154")ggplot() +geom_spatraster(data = dem_france_l93) +scale_fill_gradientn(colors =hcl.colors(50, "Terrain"),name ="Altitude (m)",na.value ="transparent") +labs(title ="MNT France — SRTM via NextGIS",caption ="Source : NextGIS / SRTM | data.nextgis.com") +theme_void(base_size =12) +theme(plot.title =element_text(face ="bold", hjust =0.5))
8.2.5 Option 4 — elevatr : import direct depuis R sans téléchargement manuel
Le package elevatr permet de récupérer des données d’altitude directement depuis R, sans passer par un navigateur. Il interroge les tuiles AWS Terrain (synthèse SRTM/3DEP/GMTED2010) ou l’API OpenTopography, et renvoie un objet terra prêt à l’emploi.
Code
install.packages("elevatr")
Code
library(elevatr)library(sf)library(terra)library(tidyterra)library(ggplot2)library(rnaturalearth)# elevatr accepte un objet sf comme emprise — on utilise la France métropolitainefrance <-ne_countries(country ="France", returnclass ="sf") |>st_transform(4326)# get_elev_raster() télécharge les tuiles couvrant l'emprise de l'objet sf# z = niveau de zoom (1 à 14) — z = 5 ≈ ~5 km, z = 8 ≈ ~600 m, z = 10 ≈ ~150 m# src = "aws" → tuiles AWS (SRTM + 3DEP + GMTED2010, pas de compte requis)# src = "gl1" → SRTM 1 arc-sec (~30 m) via OpenTopography (clé API requise)# src = "alos" → ALOS World 3D (~30 m) via OpenTopography (clé API requise)dem_fr <-get_elev_raster(locations = france, z =6, src ="aws",clip ="locations") # découper sur le contour exact# Convertir en SpatRaster terra et reprojeterdem_fr_terra <-rast(dem_fr)dem_fr_l93 <-project(dem_fr_terra, "EPSG:2154")cat("Résolution après reprojection :", res(dem_fr_l93), "mètres\n")ggplot() +geom_spatraster(data = dem_fr_l93) +scale_fill_gradientn(colors =hcl.colors(50, "Terrain"),name ="Altitude (m)",na.value ="transparent") +labs(title ="MNT France — elevatr (AWS Terrain Tiles, z = 6)",caption ="Source : AWS Terrain Tiles via elevatr | Cours R-Carto") +theme_void(base_size =12) +theme(plot.title =element_text(face ="bold", hjust =0.5))
Choisir le bon niveau de zoom (z)
z
Résolution approx.
Usage
4–5
5–10 km
Vue continentale, aperçu rapide
6–7
1–5 km
Pays entier, analyses régionales
8–9
300–600 m
Région, département
10–11
75–150 m
Zone d’étude locale
12–14
10–40 m
Analyse fine (fichiers volumineux)
Plus le zoom est élevé, plus les fichiers sont lourds et le téléchargement lent. Pour une première exploration, commencez par z = 6 ou z = 7.
Code
# Avec OpenTopography (clé API gratuite requise)# Créer un compte sur https://portal.opentopography.org/newUser# puis récupérer votre clé dans myOpenTopo → API Key# Enregistrer la clé une fois pour toutes dans votre .Renviron :# usethis::edit_r_environ()# → ajouter la ligne : OPENTOPO_KEY=votre_cle_ici# Télécharger le SRTM 1 arc-sec (~30 m) pour une zone précisecorsica <-ne_states(country ="France", returnclass ="sf") |> dplyr::filter(name =="Corse-du-Sud"| name =="Haute-Corse") |>st_transform(4326)dem_corse_gl1 <-get_elev_raster(locations = corsica,src ="gl1", # SRTM 1 arc-secclip ="locations") # découper sur la Corsedem_corse_terra <-rast(dem_corse_gl1) |>project("EPSG:2154")ggplot() +geom_spatraster(data = dem_corse_terra) +scale_fill_gradientn(colors =hcl.colors(50, "Terrain"),name ="Altitude (m)",na.value ="transparent") +labs(title ="MNT Corse — SRTM 1 arc-sec via OpenTopography",caption ="Source : OpenTopography / SRTM GL1 | Cours R-Carto") +theme_void(base_size =12) +theme(plot.title =element_text(face ="bold", hjust =0.5))
Sources disponibles via OpenTopography dans elevatr
src
Produit
Résolution
"gl3"
SRTM 3 arc-sec
~90 m
"gl1"
SRTM 1 arc-sec
~30 m
"alos"
ALOS World 3D
~30 m
"srtm15plus"
SRTM 15 arc-sec + bathymétrie
~450 m
L’option "alos" (satellite japonais ALOS) peut être plus précise que le SRTM dans les zones montagneuses tropicales ou très boisées.
Code
library(terra) # manipulation des rasterslibrary(tidyterra) # geom_spatraster() pour ggplot2library(sf) # données vectorielleslibrary(ggplot2) # visualisationlibrary(dplyr) # manipulation de donnéeslibrary(scales) # rescale()
Installer les packages si nécessaire
Code
install.packages(c("terra", "tidyterra"))
terra remplace l’ancien package raster (déprécié depuis 2023). tidyterra permet d’utiliser les objets terra directement dans ggplot2 via geom_spatraster().
8.3 Étape 1 — Charger et explorer le MNT
Code
dem <-rast("data/Liban/LBN_elevation_w_bathymetry.tif")cat("SCR :", crs(dem, describe =TRUE)$name, "\n")
ggplot() +geom_spatraster(data = dem_liban) +scale_fill_gradientn(colors =hcl.colors(50, "Terrain"),name ="Altitude (m)",na.value ="transparent" ) +geom_sf(data = Lebanon, fill =NA, color ="white", linewidth =0.6) +labs(title ="MNT du Liban — recadré et masqué",caption ="Source : SRTM / GADM | Cours R-Carto") +theme_void(base_size =12) +theme(plot.title =element_text(face ="bold", hjust =0.5))
Figure 8.2: MNT recadré sur le Liban avec les gouvernorats
8.5 Étape 3 — Calculer la pente
La pente mesure l’inclinaison du terrain en degrés. On utilise terrain() avec un MNT projeté en mètres pour obtenir des valeurs correctes.
Code
dem_m <-rast("data/Liban/DEM_Leb_projected.tif")slope <-terrain(dem_m, v ="slope", unit ="degrees")cat("Pente moyenne :", round(global(slope, "mean", na.rm =TRUE)[[1]], 1), "°\n")
Pente moyenne : 8.1 °
Code
cat("Pente max :", round(global(slope, "max", na.rm =TRUE)[[1]], 1), "°\n")
Pente max : 62.5 °
Code
ggplot() +geom_spatraster(data = slope) +scale_fill_viridis_c(option ="magma",name ="Pente (°)",na.value ="transparent" ) +geom_sf(data = Lebanon, fill =NA, color ="white", linewidth =0.5) +labs(title ="Pente du terrain — Liban",caption ="Source : SRTM | Cours R-Carto") +theme_void(base_size =12) +theme(plot.title =element_text(face ="bold", hjust =0.5))
Figure 8.3: Pente du terrain — Liban (degrés)
8.6 Étape 4 — Reclassifier
La reclassification transforme un raster continu en catégories selon des seuils. Ici, on identifie les zones à risque d’inondation (altitude < 10 m).
Code
rcl <-matrix(c(-Inf, 10, 1,10, Inf, 0), ncol =3, byrow =TRUE)flood_risk <-classify(dem_m, rcl)freq_tbl <-freq(flood_risk)pct_risk <-round(freq_tbl$count[freq_tbl$value ==1] /sum(freq_tbl$count) *100, 1)cat("Proportion de zones à risque (< 10 m) :", pct_risk, "%\n")
Proportion de zones à risque (< 10 m) : 1.1 %
Code
ggplot() +geom_spatraster(data =as.factor(flood_risk)) +scale_fill_manual(values =c("0"="#d9d9d9", "1"="#2166ac"),labels =c("0"="Hors risque (≥ 10 m)", "1"="Zone à risque (< 10 m)"),name ="",na.value ="transparent" ) +geom_sf(data = Lebanon, fill =NA, color ="grey40", linewidth =0.5) +labs(title ="Zones à risque d'inondation — Liban",subtitle ="Altitude inférieure à 10 m",caption ="Source : SRTM | Cours R-Carto") +theme_void(base_size =12) +theme(plot.title =element_text(face ="bold", hjust =0.5),plot.subtitle =element_text(color ="grey40", hjust =0.5),legend.position ="bottom")
Figure 8.4: Zones à risque d’inondation côtière — altitude < 10 m
8.7 Étape 5 — Extraction vers des données vectorielles
Les étapes précédentes produisent des rasters. Mais en pratique, on veut souvent extraire des valeurs raster à des emplacements précis — des points d’enquête, des communes, des bassins versants — pour les analyser statistiquement ou les cartographier dans un cadre vectoriel sf.
terra::extract() fait exactement cela : pour chaque géométrie vecteur (point ou polygone), il identifie les cellules raster correspondantes et renvoie leurs valeurs.
8.7.1 Extraction à des points
Code
# Charger des données d'enquête géolocalisées# (points représentant des ménages au Liban)households <-read_sf("data/Lebanon/random_survey_LBN.shp")# terra::extract() trouve pour chaque point la cellule raster# qui le contient et renvoie sa valeur.# Le MNT dem (chargé à l'étape 1) est utilisé directement.households_elevation <- terra::extract(dem, vect(households))# vect() convertit l'objet sf en SpatVector, requis par terrahead(households_elevation)
Harmoniser les SCR avant l’extraction
Si vos données vecteur et votre raster ne sont pas dans le même SCR, terra::extract() tentera une transformation automatique mais affichera un avertissement :
Warning: [extract] transforming vector data to the CRS of the raster
Ne laissez pas cette transformation se faire silencieusement — reprojetez explicitement avec st_transform() (pour sf) ou project() (pour terra) avant l’extraction. Si vous obtenez des NA à la place de valeurs, c’est presque toujours un problème de SCR.
Code
# Vérifier les SCRst_crs(households)$sridcrs(dem, describe =TRUE)$code# Reprojeter les points dans le SCR du rasterhouseholds <-st_transform(households, crs(dem))# Ou reprojeter le raster dans le SCR des points (plus coûteux)dem_reproj <- terra::project(dem, "EPSG:4326")
Code
# Attacher les altitudes extraites au data frame d'origine# cbind() ajoute la colonne en conservant la géométrie sfhouseholds <-cbind(households, households_elevation)# Vérifier le résultathead(households)
Le résultat ressemble à ceci — une colonne d’altitude ajoutée pour chaque point :
Simple feature collection with 6 features and 3 fields
Geometry type: POINT
Dimension: XY
Bounding box: xmin: 35.69817 ymin: 33.72841 xmax: 36.17128 ymax: 34.33229
Geodetic CRS: WGS 84
id ID LBN_elevation_w_bathymetry geometry
1 0 1 878.1839 POINT (35.90386 33.72841)
2 1 2 1558.2007 POINT (36.17128 34.20268)
3 2 3 1096.7252 POINT (35.81425 34.19914)
4 3 4 1251.2185 POINT (36.03916 34.06442)
5 4 5 986.273 POINT (35.69817 34.04050)
6 5 6 1323.2316 POINT (35.98001 34.33229)
8.7.2 Extraction à des polygones (statistiques zonales)
Pour des polygones (gouvernorats, communes, bassins versants), terra::extract() renvoie toutes les valeurs des cellules dont le centroïde tombe dans le polygone. On les agrège ensuite avec fun = mean (ou toute autre fonction).
Code
# Charger les gouvernorats du Liban (déjà utilisés à l'étape 2)Lebanon <-read_sf("data/Liban/LBN_adm1.shp")# Harmoniser le SCRLebanon <-st_transform(Lebanon, crs(dem))# Extraire l'altitude moyenne par gouvernorat# fun = mean agrège directement → une ligne par polygone# bind = TRUE conserve les attributs originaux du vecteurgov_elevation <- terra::extract(dem, vect(Lebanon),fun = mean,na.rm =TRUE,bind =TRUE) |>st_as_sf()head(gov_elevation |>st_drop_geometry() |>select(NAME_1, LBN_elevation_w_bathymetry))
terra::extract() vs exactextractr::exact_extract()
Pour un MNT à 1 m ou 5 m avec de nombreux polygones, exactextractr::exact_extract() est nettement plus rapide et gère les cellules partiellement couvertes en les pondérant par leur fraction de surface :
Voir le script rgealti_extraction.R pour une comparaison complète des deux méthodes.
8.7.3 Visualiser les points extraits
Code
ggplot() +geom_spatraster(data = dem_liban) +scale_fill_gradientn(colors =hcl.colors(50, "Terrain"),name ="Altitude (m)",na.value ="transparent") +geom_sf(data = households,aes(color = LBN_elevation_w_bathymetry),size =3, shape =21, fill ="white", stroke =1.2) +scale_color_viridis_c(option ="plasma", name ="Altitude\nextraite (m)") +geom_sf(data = Lebanon, fill =NA, color ="white", linewidth =0.5) +labs(title ="Extraction du MNT aux points d'enquête",caption ="Source : SRTM / données enquête | Cours R-Carto") +theme_void(base_size =12) +theme(plot.title =element_text(face ="bold", hjust =0.5))
8.8 Récapitulatif
Les 5 opérations raster essentielles
# 1. Chargerdem <-rast("fichier.tif")# 2. Recadrer + masquerdem_zone <-crop(dem, vecteur) |>mask(vecteur)# 3. Calculer la pente (MNT projeté en mètres obligatoire)slope <-terrain(dem_proj, v ="slope", unit ="degrees")# 4. Reclassifierrcl <-matrix(c(0, 10, 1, 10, Inf, 0), ncol =3, byrow =TRUE)zones <-classify(dem, rcl)# 5. Extraire vers des données vectoriellespts_sf <-st_transform(pts_sf, crs(dem)) # harmoniser les SCRalt_pts <- terra::extract(dem, vect(pts_sf)) # extraction ponctuellepoly_mean <- terra::extract(dem, vect(poly_sf), # extraction polygonalefun = mean, na.rm =TRUE,bind =TRUE) |>st_as_sf()
Pour assembler des tuiles : mosaic(t1, t2, t3, t4, fun = "mean")
8.9 À vous de jouer — Exercice Corse
Reproduire l’analyse sur la Corse
La Corse présente une topographie contrastée similaire au Liban : côte méditerranéenne et massif montagneux dépassant 2 700 m. Reproduisez les quatre étapes ci-dessus avec les données corses.
Fichiers disponibles dans data/France/Corse/ :
Fichier
Description
Corse_tout_lambert.tif
MNT complet en Lambert-93
DEM_corse_1_Lambert93.tif
Tuile projetée en mètres (pour la pente)
DEM_corse_1.tif → DEM_corse_4.tif
4 tuiles WGS84 à assembler avec mosaic()
Étapes :
Chargez Corse_tout_lambert.tif — ou assemblez les 4 tuiles avec mosaic()
Visualisez le MNT
Calculez la pente à partir de DEM_corse_1_Lambert93.tif
Reclassifiez en 4 zones : 0–200 m · 200–800 m · 800–1500 m · > 1500 m
8.10 Pour aller plus loin : classification supervisée
Une fois les bases raster maîtrisées, l’étape suivante est de transformer des pixels en catégories — cartographier l’occupation du sol, distinguer l’urbain du rural, identifier les cultures. C’est le domaine de la classification supervisée.
Le principe : chaque pixel d’une image multispectrale possède une signature spectrale — une empreinte de la façon dont il réfléchit la lumière dans chaque bande. La classification supervisée consiste à entraîner un algorithme à reconnaître ces empreintes à partir d’exemples labelisés (points d’entraînement), puis à appliquer le modèle à l’ensemble de l’image.
La chaîne de classification en six étapes
Définir les classes — urbain, péri-urbain, agriculture, forêt, eau…
Collecter des points d’entraînement — idéalement 50 à 200+ exemples par classe
Extraire les valeurs spectrales aux emplacements d’entraînement
Entraîner un classifieur — Forêt Aléatoire, SVM, Maximum de Vraisemblance…
Appliquer à l’image complète — chaque pixel reçoit un label
Valider — réserver un jeu de test, calculer la matrice de confusion et les métriques de précision
Le pipeline est simple. Les choix méthodologiques à l’intérieur ne le sont pas.
Les bandes infrarouge (PIR, SWIR) sont particulièrement utiles pour la distinction urbain/rural : la végétation saine réfléchit fortement le PIR tandis que les surfaces imperméables ne le font pas. Les frontières péri-urbaines restent cependant notoriellement difficiles à classifier avec précision.
Dr. Elisabetta Pietrostefani — Directrice Adjointe, Geographic Data Science Lab — Université de Liverpool | Co-Directrice, Imago : Data Service for Imagery | Chercheuse Associée, London School of Economics
---title: "Raster : Indices Topographiques"author: "Dr. Elisabetta Pietrostefani"date: todayformat: html: toc: true toc-depth: 3 toc-title: "Table des matières" number-sections: true code-fold: show code-tools: true theme: cosmo highlight-style: github embed-resources: true fig-align: center fig-width: 8 fig-height: 6execute: warning: false message: false echo: true---## Introduction {#sec-intro}Dans le chapitre [Données Raster](raster.qmd), nous avons vu ce qu'est un raster, les grands types de données (MNT, images multispectrales, nightlights), le compromis résolution spatiale/temporelle, et les principales sources d'imagerie. Ce chapitre part de là pour se concentrer entièrement sur les **Modèles Numériques de Terrain** : comment les obtenir, les charger, et en extraire des indices topographiques utiles.Les cinq opérations couvertes sur un MNT du Liban :| Opération | Fonction ||-----------------------------------|---------------------|| Charger et explorer |`rast()`|| Recadrer et masquer |`crop()` + `mask()`|| Calculer la pente |`terrain()`|| Reclassifier |`classify()`|| Extraire vers des données vecteur |`terra::extract()`|À la fin, vous reproduirez ces étapes sur la **Corse** en exercice indépendant.------------------------------------------------------------------------------------------------------------------------------------------------## Obtenir des données d'altitude {#sec-dem-sources}Trois grandes familles de sources couvrent les besoins selon l'étendue géographique et la résolution souhaitée : les données globales de la NASA (SRTM, ASTER GDEM, NASADEM), les données françaises de haute précision de l'IGN (RGE ALTI®), et les tuiles accessibles directement depuis R via le package `elevatr`.### Comparaison des principales sources| Source | Résolution | Couverture | Accès | Usage typique ||----|----|----|----|----|| **SRTM** (NASA) | \~30 m (1 arc-sec) | Mondial (60°N–56°S) | Libre | Analyse topographique générale || **ASTER GDEM v3** | \~30 m | Mondial (83°N–83°S) | Libre | Zones hors couverture SRTM || **NASADEM** | \~30 m | Mondial (60°N–56°S) | Libre | SRTM retraité, moins de vides || **RGE ALTI® IGN** | **1 m** | France entière | Libre | Analyses fines, zones inondables || **NextGIS / SRTM France** | \~30 m | France | Libre | Téléchargement rapide, prêt à l'emploi || **AWS Terrain Tiles** | Variable (zoom 1–14) | Mondial | Via `elevatr`| Import direct dans R sans compte |------------------------------------------------------------------------### Option 1 — NASA Earthdata : SRTM, ASTER GDEM, NASADEMLa NASA distribue plusieurs MNT mondiaux librement accessibles après création d'un compte gratuit sur [Earthdata](https://www.earthdata.nasa.gov/topics/land-surface/digital-elevation-terrain-model-dem).::: callout-note## Les trois produits NASA à connaître**SRTM** (*Shuttle Radar Topography Mission*, 2000) — collecté en 11 jours par la navette spatiale Endeavour, il couvre 80 % de la surface terrestre à \~30 m de résolution. C'est la référence mondiale pour la plupart des analyses topographiques.**ASTER GDEM v3** — produit à partir de plus d'un million d'images stéréoscopiques du satellite Terra (NASA/METI), il couvre 99 % de la surface terrestre jusqu'à 83° de latitude. Résolution nominale de 30 m, mais précision réelle légèrement inférieure au SRTM dans les zones nuageuses.**NASADEM** — retraitement amélioré du SRTM intégrant des données ASTER GDEM, ICESat et ALOS pour combler les vides et améliorer la précision verticale. À privilégier par rapport au SRTM brut pour les nouvelles analyses.:::Les données sont distribuées en tuiles de 1° × 1° au format GeoTIFF. Une fois téléchargées, on les charge et assemble directement avec `terra` :```{r}#| label: nasa-dem-load#| eval: falselibrary(terra)library(tidyterra)library(ggplot2)# Après téléchargement manuel depuis https://earthdata.nasa.gov# Les fichiers SRTM ont la convention de nommage : N48E002.SRTMGL1.hgt.zip# Les fichiers NASADEM : NASADEM_HGT_n48e002.zip# Charger une tuile SRTM décompresséesrtm_tuile <-rast("data/DEM/N48E002.hgt")cat("Résolution :", res(srtm_tuile), "degrés (~30 m)\n")cat("Étendue :", as.character(ext(srtm_tuile)), "\n")# Assembler plusieurs tuiles avec mosaic()# (nécessaire si la zone d'intérêt couvre plusieurs tuiles)t1 <-rast("data/DEM/N48E001.hgt")t2 <-rast("data/DEM/N48E002.hgt")t3 <-rast("data/DEM/N49E001.hgt")t4 <-rast("data/DEM/N49E002.hgt")dem_mosaic <-mosaic(t1, t2, t3, t4, fun ="mean")ggplot() +geom_spatraster(data = dem_mosaic) +scale_fill_gradientn(colors =hcl.colors(50, "Terrain"),name ="Altitude (m)",na.value ="transparent") +labs(title ="MNT SRTM assemblé",caption ="Source : NASA SRTM | Earthdata") +theme_void(base_size =12) +theme(plot.title =element_text(face ="bold", hjust =0.5))```------------------------------------------------------------------------### Option 2 — RGE ALTI® : le MNT 1 m de l'IGN pour la FrancePour les analyses sur la France, le [RGE ALTI®](https://geoservices.ign.fr/rgealti) de l'IGN est la source de référence. Il décrit l'altitude de la surface du sol à **1 mètre de résolution** sur l'ensemble du territoire métropolitain et des DOM-TOM, avec une précision verticale de 20 cm dans les zones inondables et littorales.::: callout-tip## Comment télécharger le RGE ALTI®1. Rendez-vous sur [geoservices.ign.fr/rgealti](https://geoservices.ign.fr/rgealti)2. Créez un compte gratuit sur le Géoportail de l'IGN3. Sélectionnez le département ou la région souhaités4. Choisissez le format **GeoTIFF** et la résolution **1 m** ou **5 m**5. Les fichiers sont distribués par dalles (tuiles) — utilisez `mosaic()` pour les assemblerLe RGE ALTI® à 1 m est aussi accessible via l'[API flux WCS de l'IGN](https://geoservices.ign.fr/documentation/services/api-et-services-ogc/images-wcs) pour une extraction directe par emprise.:::```{r}#| label: rgealti-load#| eval: false# Après téléchargement depuis geoservices.ign.fr/rgealti# Structure typique des fichiers IGN :# RGEALTI_2-0_1M_ASC_LAMB93-IGN69_D075_2021-01-01/# RGEALTI_FXX_0630_6860_MNT_LAMB93_IGN69.asc ← tuiles ASCII Grid# ou format GeoTIFF selon la version téléchargée# Charger une tuile GeoTIFFign_tuile <-rast("data/IGN/RGEALTI_FXX_0630_6860_MNT_LAMB93_IGN69.tif")cat("SCR :", crs(ign_tuile, describe =TRUE)$name, "\n") # Lambert-93cat("Résolution :", res(ign_tuile), "mètres\n") # 1 m × 1 mcat("Min / Max :", global(ign_tuile, "range", na.rm =TRUE)[[1]], "m\n")# Le RGE ALTI® est déjà en Lambert-93 (EPSG:2154) — aucune reprojection nécessaire# pour les analyses sur la France# Si les fichiers sont au format ASCII Grid (.asc), terra les lit de la même façonign_asc <-rast("data/IGN/RGEALTI_FXX_0630_6860_MNT_LAMB93_IGN69.asc")# Assembler plusieurs dallesdalles <-list.files("data/IGN/", pattern ="\\.tif$", full.names =TRUE)dem_ign <-do.call(mosaic, c(lapply(dalles, rast), list(fun ="mean")))ggplot() +geom_spatraster(data = dem_ign) +scale_fill_gradientn(colors =hcl.colors(50, "Terrain"),name ="Altitude (m)",na.value ="transparent") +labs(title ="RGE ALTI® IGN — résolution 1 m",caption ="Source : IGN — RGE ALTI® | geoservices.ign.fr") +theme_void(base_size =12) +theme(plot.title =element_text(face ="bold", hjust =0.5))```------------------------------------------------------------------------### Option 3 — NextGIS : SRTM France prêt à l'emploi[NextGIS](https://data.nextgis.com/en/region/FR/dem/) propose des MNT SRTM préconfigurés par pays, directement téléchargeables au format GeoTIFF sans création de compte. C'est l'option la plus rapide pour obtenir un MNT de la France entière à \~30 m de résolution.```{r}#| label: nextgis-load#| eval: false# Après téléchargement depuis https://data.nextgis.com/en/region/FR/dem/# Le fichier est un GeoTIFF unique couvrant toute la Francedem_france <-rast("data/nextgis/dem.tif")cat("SCR :", crs(dem_france, describe =TRUE)$name, "\n")cat("Résolution :", res(dem_france), "\n")cat("Min / Max :", global(dem_france, "min", na.rm =TRUE)[[1]], "/",global(dem_france, "max", na.rm =TRUE)[[1]], "m\n")# Reprojeter en Lambert-93 pour les analyses sur la Francedem_france_l93 <-project(dem_france, "EPSG:2154")ggplot() +geom_spatraster(data = dem_france_l93) +scale_fill_gradientn(colors =hcl.colors(50, "Terrain"),name ="Altitude (m)",na.value ="transparent") +labs(title ="MNT France — SRTM via NextGIS",caption ="Source : NextGIS / SRTM | data.nextgis.com") +theme_void(base_size =12) +theme(plot.title =element_text(face ="bold", hjust =0.5))```------------------------------------------------------------------------### Option 4 — `elevatr` : import direct depuis R sans téléchargement manuelLe package `elevatr` permet de récupérer des données d'altitude directement depuis R, sans passer par un navigateur. Il interroge les tuiles AWS Terrain (synthèse SRTM/3DEP/GMTED2010) ou l'API OpenTopography, et renvoie un objet `terra` prêt à l'emploi.```{r}#| label: elevatr-install#| eval: falseinstall.packages("elevatr")``````{r}#| label: elevatr-demo#| eval: falselibrary(elevatr)library(sf)library(terra)library(tidyterra)library(ggplot2)library(rnaturalearth)# elevatr accepte un objet sf comme emprise — on utilise la France métropolitainefrance <-ne_countries(country ="France", returnclass ="sf") |>st_transform(4326)# get_elev_raster() télécharge les tuiles couvrant l'emprise de l'objet sf# z = niveau de zoom (1 à 14) — z = 5 ≈ ~5 km, z = 8 ≈ ~600 m, z = 10 ≈ ~150 m# src = "aws" → tuiles AWS (SRTM + 3DEP + GMTED2010, pas de compte requis)# src = "gl1" → SRTM 1 arc-sec (~30 m) via OpenTopography (clé API requise)# src = "alos" → ALOS World 3D (~30 m) via OpenTopography (clé API requise)dem_fr <-get_elev_raster(locations = france, z =6, src ="aws",clip ="locations") # découper sur le contour exact# Convertir en SpatRaster terra et reprojeterdem_fr_terra <-rast(dem_fr)dem_fr_l93 <-project(dem_fr_terra, "EPSG:2154")cat("Résolution après reprojection :", res(dem_fr_l93), "mètres\n")ggplot() +geom_spatraster(data = dem_fr_l93) +scale_fill_gradientn(colors =hcl.colors(50, "Terrain"),name ="Altitude (m)",na.value ="transparent") +labs(title ="MNT France — elevatr (AWS Terrain Tiles, z = 6)",caption ="Source : AWS Terrain Tiles via elevatr | Cours R-Carto") +theme_void(base_size =12) +theme(plot.title =element_text(face ="bold", hjust =0.5))```::: callout-tip## Choisir le bon niveau de zoom (`z`)|`z`| Résolution approx. | Usage ||-------|--------------------|------------------------------------|| 4–5 | 5–10 km | Vue continentale, aperçu rapide || 6–7 | 1–5 km | Pays entier, analyses régionales || 8–9 | 300–600 m | Région, département || 10–11 | 75–150 m | Zone d'étude locale || 12–14 | 10–40 m | Analyse fine (fichiers volumineux) |Plus le zoom est élevé, plus les fichiers sont lourds et le téléchargement lent. Pour une première exploration, commencez par `z = 6` ou `z = 7`.:::```{r}#| label: elevatr-opentopo#| eval: false# Avec OpenTopography (clé API gratuite requise)# Créer un compte sur https://portal.opentopography.org/newUser# puis récupérer votre clé dans myOpenTopo → API Key# Enregistrer la clé une fois pour toutes dans votre .Renviron :# usethis::edit_r_environ()# → ajouter la ligne : OPENTOPO_KEY=votre_cle_ici# Télécharger le SRTM 1 arc-sec (~30 m) pour une zone précisecorsica <-ne_states(country ="France", returnclass ="sf") |> dplyr::filter(name =="Corse-du-Sud"| name =="Haute-Corse") |>st_transform(4326)dem_corse_gl1 <-get_elev_raster(locations = corsica,src ="gl1", # SRTM 1 arc-secclip ="locations") # découper sur la Corsedem_corse_terra <-rast(dem_corse_gl1) |>project("EPSG:2154")ggplot() +geom_spatraster(data = dem_corse_terra) +scale_fill_gradientn(colors =hcl.colors(50, "Terrain"),name ="Altitude (m)",na.value ="transparent") +labs(title ="MNT Corse — SRTM 1 arc-sec via OpenTopography",caption ="Source : OpenTopography / SRTM GL1 | Cours R-Carto") +theme_void(base_size =12) +theme(plot.title =element_text(face ="bold", hjust =0.5))```::: callout-note## Sources disponibles via OpenTopography dans `elevatr`|`src`| Produit | Résolution ||----------------|-------------------------------|------------||`"gl3"`| SRTM 3 arc-sec | \~90 m ||`"gl1"`| SRTM 1 arc-sec | \~30 m ||`"alos"`| ALOS World 3D | \~30 m ||`"srtm15plus"`| SRTM 15 arc-sec + bathymétrie | \~450 m |L'option `"alos"` (satellite japonais ALOS) peut être plus précise que le SRTM dans les zones montagneuses tropicales ou très boisées.:::------------------------------------------------------------------------```{r}#| label: setup#| message: falselibrary(terra) # manipulation des rasterslibrary(tidyterra) # geom_spatraster() pour ggplot2library(sf) # données vectorielleslibrary(ggplot2) # visualisationlibrary(dplyr) # manipulation de donnéeslibrary(scales) # rescale()```::: {.callout-note collapse="true"}## Installer les packages si nécessaire```{r}#| eval: falseinstall.packages(c("terra", "tidyterra"))````terra` remplace l'ancien package `raster` (déprécié depuis 2023). `tidyterra` permet d'utiliser les objets `terra` directement dans `ggplot2` via `geom_spatraster()`.:::------------------------------------------------------------------------## Étape 1 — Charger et explorer le MNT {#sec-import}```{r}#| label: load-rasterdem <-rast("data/Liban/LBN_elevation_w_bathymetry.tif")cat("SCR :", crs(dem, describe =TRUE)$name, "\n")cat("Résolution :", res(dem), "degrés\n")cat("Min / Max :", global(dem, "min", na.rm =TRUE)[[1]], "/",global(dem, "max", na.rm =TRUE)[[1]], "m\n")``````{r}#| label: fig-dem-raw#| fig-cap: "MNT du Liban — emprise originale"ggplot() +geom_spatraster(data = dem) +scale_fill_gradientn(colors =hcl.colors(50, "Terrain"),name ="Altitude (m)",na.value ="transparent" ) +labs(title ="MNT du Liban",caption ="Source : SRTM | Cours R-Carto") +theme_void(base_size =12) +theme(plot.title =element_text(face ="bold", hjust =0.5))```------------------------------------------------------------------------## Étape 2 — Recadrer et masquer {#sec-crop}Le MNT couvre une zone plus large que le pays. On utilise deux opérations :- `crop()` — découpe selon l'**emprise rectangulaire** du vecteur- `mask()` — applique le **contour exact** du polygone (valeurs extérieures → `NA`)```{r}#| label: load-vector-cropLebanon <-read_sf("data/Liban/LBN_adm1.shp")dem_proj <- terra::project(dem, crs(Lebanon))dem_crop <-crop(dem_proj, Lebanon)dem_liban <-mask(dem_crop, Lebanon)``````{r}#| label: fig-dem-liban#| fig-cap: "MNT recadré sur le Liban avec les gouvernorats"ggplot() +geom_spatraster(data = dem_liban) +scale_fill_gradientn(colors =hcl.colors(50, "Terrain"),name ="Altitude (m)",na.value ="transparent" ) +geom_sf(data = Lebanon, fill =NA, color ="white", linewidth =0.6) +labs(title ="MNT du Liban — recadré et masqué",caption ="Source : SRTM / GADM | Cours R-Carto") +theme_void(base_size =12) +theme(plot.title =element_text(face ="bold", hjust =0.5))```------------------------------------------------------------------------## Étape 3 — Calculer la pente {#sec-slope}La pente mesure l'inclinaison du terrain en degrés. On utilise `terrain()` avec un MNT **projeté en mètres** pour obtenir des valeurs correctes.```{r}#| label: calc-slopedem_m <-rast("data/Liban/DEM_Leb_projected.tif")slope <-terrain(dem_m, v ="slope", unit ="degrees")cat("Pente moyenne :", round(global(slope, "mean", na.rm =TRUE)[[1]], 1), "°\n")cat("Pente max :", round(global(slope, "max", na.rm =TRUE)[[1]], 1), "°\n")``````{r}#| label: fig-slope#| fig-cap: "Pente du terrain — Liban (degrés)"ggplot() +geom_spatraster(data = slope) +scale_fill_viridis_c(option ="magma",name ="Pente (°)",na.value ="transparent" ) +geom_sf(data = Lebanon, fill =NA, color ="white", linewidth =0.5) +labs(title ="Pente du terrain — Liban",caption ="Source : SRTM | Cours R-Carto") +theme_void(base_size =12) +theme(plot.title =element_text(face ="bold", hjust =0.5))```------------------------------------------------------------------------## Étape 4 — Reclassifier {#sec-reclass}La reclassification transforme un raster continu en **catégories** selon des seuils. Ici, on identifie les zones à risque d'inondation (altitude \< 10 m).```{r}#| label: reclassifyrcl <-matrix(c(-Inf, 10, 1,10, Inf, 0), ncol =3, byrow =TRUE)flood_risk <-classify(dem_m, rcl)freq_tbl <-freq(flood_risk)pct_risk <-round(freq_tbl$count[freq_tbl$value ==1] /sum(freq_tbl$count) *100, 1)cat("Proportion de zones à risque (< 10 m) :", pct_risk, "%\n")``````{r}#| label: fig-flood#| fig-cap: "Zones à risque d'inondation côtière — altitude < 10 m"ggplot() +geom_spatraster(data =as.factor(flood_risk)) +scale_fill_manual(values =c("0"="#d9d9d9", "1"="#2166ac"),labels =c("0"="Hors risque (≥ 10 m)", "1"="Zone à risque (< 10 m)"),name ="",na.value ="transparent" ) +geom_sf(data = Lebanon, fill =NA, color ="grey40", linewidth =0.5) +labs(title ="Zones à risque d'inondation — Liban",subtitle ="Altitude inférieure à 10 m",caption ="Source : SRTM | Cours R-Carto") +theme_void(base_size =12) +theme(plot.title =element_text(face ="bold", hjust =0.5),plot.subtitle =element_text(color ="grey40", hjust =0.5),legend.position ="bottom")```------------------------------------------------------------------------## Étape 5 — Extraction vers des données vectorielles {#sec-extract}Les étapes précédentes produisent des rasters. Mais en pratique, on veut souvent **extraire des valeurs raster à des emplacements précis** — des points d'enquête, des communes, des bassins versants — pour les analyser statistiquement ou les cartographier dans un cadre vectoriel `sf`.`terra::extract()` fait exactement cela : pour chaque géométrie vecteur (point ou polygone), il identifie les cellules raster correspondantes et renvoie leurs valeurs.### Extraction à des points```{r}#| label: extract-points#| eval: false# Charger des données d'enquête géolocalisées# (points représentant des ménages au Liban)households <-read_sf("data/Lebanon/random_survey_LBN.shp")# terra::extract() trouve pour chaque point la cellule raster# qui le contient et renvoie sa valeur.# Le MNT dem (chargé à l'étape 1) est utilisé directement.households_elevation <- terra::extract(dem, vect(households))# vect() convertit l'objet sf en SpatVector, requis par terrahead(households_elevation)```::: callout-important## Harmoniser les SCR avant l'extractionSi vos données vecteur et votre raster ne sont pas dans le même SCR, `terra::extract()` tentera une transformation automatique mais affichera un avertissement :``` Warning: [extract] transforming vector data to the CRS of the raster```Ne laissez pas cette transformation se faire silencieusement — reprojetez explicitement avec `st_transform()` (pour sf) ou `project()` (pour terra) **avant** l'extraction. Si vous obtenez des `NA` à la place de valeurs, c'est presque toujours un problème de SCR.```{r}#| eval: false# Vérifier les SCRst_crs(households)$sridcrs(dem, describe =TRUE)$code# Reprojeter les points dans le SCR du rasterhouseholds <-st_transform(households, crs(dem))# Ou reprojeter le raster dans le SCR des points (plus coûteux)dem_reproj <- terra::project(dem, "EPSG:4326")```:::```{r}#| label: extract-attach#| eval: false# Attacher les altitudes extraites au data frame d'origine# cbind() ajoute la colonne en conservant la géométrie sfhouseholds <-cbind(households, households_elevation)# Vérifier le résultathead(households)```Le résultat ressemble à ceci — une colonne d'altitude ajoutée pour chaque point :``` Simple feature collection with 6 features and 3 fieldsGeometry type: POINTDimension: XYBounding box: xmin: 35.69817 ymin: 33.72841 xmax: 36.17128 ymax: 34.33229Geodetic CRS: WGS 84 id ID LBN_elevation_w_bathymetry geometry1 0 1 878.1839 POINT (35.90386 33.72841)2 1 2 1558.2007 POINT (36.17128 34.20268)3 2 3 1096.7252 POINT (35.81425 34.19914)4 3 4 1251.2185 POINT (36.03916 34.06442)5 4 5 986.273 POINT (35.69817 34.04050)6 5 6 1323.2316 POINT (35.98001 34.33229)```### Extraction à des polygones (statistiques zonales)Pour des polygones (gouvernorats, communes, bassins versants), `terra::extract()` renvoie toutes les valeurs des cellules dont le centroïde tombe dans le polygone. On les agrège ensuite avec `fun = mean` (ou toute autre fonction).```{r}#| label: extract-polygons#| eval: false# Charger les gouvernorats du Liban (déjà utilisés à l'étape 2)Lebanon <-read_sf("data/Liban/LBN_adm1.shp")# Harmoniser le SCRLebanon <-st_transform(Lebanon, crs(dem))# Extraire l'altitude moyenne par gouvernorat# fun = mean agrège directement → une ligne par polygone# bind = TRUE conserve les attributs originaux du vecteurgov_elevation <- terra::extract(dem, vect(Lebanon),fun = mean,na.rm =TRUE,bind =TRUE) |>st_as_sf()head(gov_elevation |>st_drop_geometry() |>select(NAME_1, LBN_elevation_w_bathymetry))```::: callout-tip## `terra::extract()` vs `exactextractr::exact_extract()`Pour un MNT à 1 m ou 5 m avec de nombreux polygones, `exactextractr::exact_extract()` est **nettement plus rapide** et gère les cellules partiellement couvertes en les pondérant par leur fraction de surface :```{r}#| eval: false# install.packages("exactextractr")library(exactextractr)gov_elevation_exact <-exact_extract(dem, Lebanon, "mean",progress =FALSE)Lebanon$alt_moy <- gov_elevation_exact```Voir le script `rgealti_extraction.R` pour une comparaison complète des deux méthodes.:::### Visualiser les points extraits```{r}#| label: fig-extract-points#| fig-cap: "Altitude extraite du MNT aux points d'enquête — Liban"#| eval: falseggplot() +geom_spatraster(data = dem_liban) +scale_fill_gradientn(colors =hcl.colors(50, "Terrain"),name ="Altitude (m)",na.value ="transparent") +geom_sf(data = households,aes(color = LBN_elevation_w_bathymetry),size =3, shape =21, fill ="white", stroke =1.2) +scale_color_viridis_c(option ="plasma", name ="Altitude\nextraite (m)") +geom_sf(data = Lebanon, fill =NA, color ="white", linewidth =0.5) +labs(title ="Extraction du MNT aux points d'enquête",caption ="Source : SRTM / données enquête | Cours R-Carto") +theme_void(base_size =12) +theme(plot.title =element_text(face ="bold", hjust =0.5))```------------------------------------------------------------------------## Récapitulatif {#sec-summary}::: callout-note## Les 5 opérations raster essentielles``` r# 1. Chargerdem <-rast("fichier.tif")# 2. Recadrer + masquerdem_zone <-crop(dem, vecteur) |>mask(vecteur)# 3. Calculer la pente (MNT projeté en mètres obligatoire)slope <-terrain(dem_proj, v ="slope", unit ="degrees")# 4. Reclassifierrcl <-matrix(c(0, 10, 1, 10, Inf, 0), ncol =3, byrow =TRUE)zones <-classify(dem, rcl)# 5. Extraire vers des données vectoriellespts_sf <-st_transform(pts_sf, crs(dem)) # harmoniser les SCRalt_pts <- terra::extract(dem, vect(pts_sf)) # extraction ponctuellepoly_mean <- terra::extract(dem, vect(poly_sf), # extraction polygonalefun = mean, na.rm =TRUE,bind =TRUE) |>st_as_sf()```Pour assembler des tuiles : `mosaic(t1, t2, t3, t4, fun = "mean")`:::------------------------------------------------------------------------## À vous de jouer — Exercice Corse {#sec-exercise}::: callout-note## Reproduire l'analyse sur la CorseLa Corse présente une topographie contrastée similaire au Liban : côte méditerranéenne et massif montagneux dépassant 2 700 m. Reproduisez les quatre étapes ci-dessus avec les données corses.**Fichiers disponibles dans `data/France/Corse/` :**| Fichier | Description ||----|----||`Corse_tout_lambert.tif`| MNT complet en Lambert-93 ||`DEM_corse_1_Lambert93.tif`| Tuile projetée en mètres (pour la pente) ||`DEM_corse_1.tif` → `DEM_corse_4.tif`| 4 tuiles WGS84 à assembler avec `mosaic()`|**Étapes :**1. Chargez `Corse_tout_lambert.tif` — ou assemblez les 4 tuiles avec `mosaic()`2. Visualisez le MNT3. Calculez la pente à partir de `DEM_corse_1_Lambert93.tif`4. Reclassifiez en 4 zones : 0–200 m · 200–800 m · 800–1500 m · \> 1500 m**→ Corrigé : [Corse](indices_topo_Corse.qmd)**:::------------------------------------------------------------------------## Pour aller plus loin : classification supervisée {#sec-classification}Une fois les bases raster maîtrisées, l'étape suivante est de **transformer des pixels en catégories** — cartographier l'occupation du sol, distinguer l'urbain du rural, identifier les cultures. C'est le domaine de la **classification supervisée**.Le principe : chaque pixel d'une image multispectrale possède une **signature spectrale** — une empreinte de la façon dont il réfléchit la lumière dans chaque bande. La classification supervisée consiste à entraîner un algorithme à reconnaître ces empreintes à partir d'exemples labelisés (*points d'entraînement*), puis à appliquer le modèle à l'ensemble de l'image.::: callout-note## La chaîne de classification en six étapes1. **Définir les classes** — urbain, péri-urbain, agriculture, forêt, eau…2. **Collecter des points d'entraînement** — idéalement 50 à 200+ exemples par classe3. **Extraire les valeurs spectrales** aux emplacements d'entraînement4. **Entraîner un classifieur** — Forêt Aléatoire, SVM, Maximum de Vraisemblance…5. **Appliquer à l'image complète** — chaque pixel reçoit un label6. **Valider** — réserver un jeu de test, calculer la matrice de confusion et les métriques de précision*Le pipeline est simple. Les choix méthodologiques à l'intérieur ne le sont pas.*:::Les bandes infrarouge (PIR, SWIR) sont particulièrement utiles pour la distinction urbain/rural : la végétation saine réfléchit fortement le PIR tandis que les surfaces imperméables ne le font pas. Les frontières péri-urbaines restent cependant notoriellement difficiles à classifier avec précision.------------------------------------------------------------------------## Liens utiles {#sec-links}- [terra documentation](https://rspatial.org/terra/)- [tidyterra](https://dieghernan.github.io/tidyterra/)- [Geocomputation with R — Raster operations](https://geocompr.robinlovelace.net/spatial-operations.html#spatial-ras)- [OpenTopography](https://opentopography.org/) — MNT haute résolution (LiDAR, SRTM, ALOS)- [USGS Earth Explorer](https://earthexplorer.usgs.gov/) — Landsat, MODIS et archives NASA- [Copernicus Open Access Hub](https://scihub.copernicus.eu/) — Sentinel-1, 2, 3, 5P (ESA)------------------------------------------------------------------------> **← Précédent : [Géotraitement Paris](geoprocessing_Paris.qmd)** **→ Suivant : [Analyse Avancée](interpolation.qmd)**------------------------------------------------------------------------*Dr. Elisabetta Pietrostefani — Directrice Adjointe, Geographic Data Science Lab — Université de Liverpool \| Co-Directrice, [Imago : Data Service for Imagery](https://imago.ac.uk/) \| Chercheuse Associée, London School of Economics*