library(terra)
library(tidyterra)
library(sf)
library(ggplot2)
library(dplyr)
library(scales)10 Raster : Corse
Ce document contient les réponses complètes à l’exercice Corse posé à la fin de Raster : Indices Topographiques. Essayez d’abord par vous-mêmes avant de consulter ce corrigé.
10.1 Exercice 1 — Charger le MNT
Deux options sont disponibles selon les fichiers à disposition.
Option A — MNT complet déjà assemblé (plus simple)
dem_corse <- rast("data/France/Corse/Corse_tout_lambert.tif")
cat("SCR :", crs(dem_corse, describe = TRUE)$name, "\n")SCR : RGF93 v1 / Lambert-93
cat("Résolution :", res(dem_corse), "\n")Résolution : 27.27336 27.27336
cat("Min / Max :", global(dem_corse, "min", na.rm = TRUE)[[1]], "/",
global(dem_corse, "max", na.rm = TRUE)[[1]], "m\n")Min / Max : -12 / 2664 m
ggplot() +
geom_spatraster(data = dem_corse) +
scale_fill_gradientn(
colors = hcl.colors(50, "Terrain"),
name = "Altitude (m)",
na.value = "transparent"
) +
labs(title = "MNT de la Corse",
caption = "Source : données Corse | Cours R-Carto") +
theme_void(base_size = 12) +
theme(plot.title = element_text(face = "bold", hjust = 0.5))Option B — Assembler les 4 tuiles avec mosaic()
t1 <- rast("data/France/Corse/DEM_corse_1.tif")
t2 <- rast("data/France/Corse/DEM_corse_2.tif")
t3 <- rast("data/France/Corse/DEM_corse_3.tif")
t4 <- rast("data/France/Corse/DEM_corse_4.tif")
dem_corse <- mosaic(t1, t2, t3, t4, fun = "mean")mosaic() ?
Les MNT à haute résolution couvrant un territoire étendu sont souvent distribués en tuiles pour des raisons de taille de fichier. mosaic() les assemble en un seul raster en appliquant une fonction (ici "mean") aux cellules qui se chevauchent sur les bords.
10.2 Exercice 2 — Calculer la pente
On utilise DEM_corse_1_Lambert93.tif — déjà projeté en mètres. Le SCR en mètres est indispensable : avec des coordonnées en degrés, les valeurs de pente seraient fausses car les unités horizontales et verticales seraient incompatibles.
dem_corse_m <- rast("data/France/Corse/DEM_corse_1_Lambert93.tif")
slope_corse <- terrain(dem_corse_m, v = "slope", unit = "degrees")
cat("Pente moyenne :", round(global(slope_corse, "mean", na.rm = TRUE)[[1]], 1), "°\n")Pente moyenne : 7.5 °
cat("Pente max :", round(global(slope_corse, "max", na.rm = TRUE)[[1]], 1), "°\n")Pente max : 76.7 °
ggplot() +
geom_spatraster(data = slope_corse) +
scale_fill_viridis_c(
option = "magma",
name = "Pente (°)",
na.value = "transparent"
) +
labs(title = "Pente du terrain — Corse",
subtitle = "Calculée à partir du MNT projeté en Lambert-93",
caption = "Source : données Corse | 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))10.3 Exercice 3 — Reclassifier en zones altitudinales
rcl_corse <- matrix(c(
0, 200, 1, # Littoral
200, 800, 2, # Basse montagne
800, 1500, 3, # Montagne
1500, Inf, 4 # Haute montagne
), ncol = 3, byrow = TRUE)
corse_zones <- classify(dem_corse, rcl_corse)
# Résumé par zone — group and sum to handle any floating point values
freq_zones <- freq(corse_zones) |>
filter(value %in% 1:4) |>
group_by(value) |>
summarise(count = sum(count), .groups = "drop") |>
mutate(
pct = round(count / sum(count) * 100, 1),
zone = case_when(
value == 1 ~ "Littoral (0–200 m)",
value == 2 ~ "Basse montagne (200–800 m)",
value == 3 ~ "Montagne (800–1500 m)",
value == 4 ~ "Haute montagne (> 1500 m)"
)
)
knitr::kable(freq_zones[, c("zone", "count", "pct")],
col.names = c("Zone", "Cellules", "Part (%)"),
caption = "Répartition des cellules par zone altitudinale")| Zone | Cellules | Part (%) |
|---|---|---|
| Littoral (0–200 m) | 4417445 | 33.7 |
| Basse montagne (200–800 m) | 5427988 | 41.5 |
| Montagne (800–1500 m) | 2542799 | 19.4 |
| Haute montagne (> 1500 m) | 704019 | 5.4 |
ggplot() +
geom_spatraster(data = as.factor(corse_zones)) +
scale_fill_manual(
values = c("1" = "#74add1", "2" = "#fee090",
"3" = "#fc8d59", "4" = "#d73027"),
labels = c("1" = "Littoral (0–200 m)",
"2" = "Basse montagne (200–800 m)",
"3" = "Montagne (800–1500 m)",
"4" = "Haute montagne (> 1500 m)"),
name = "Zone altitudinale",
na.value = "transparent"
) +
labs(title = "Zones altitudinales — Corse",
subtitle = "Reclassification du MNT en 4 catégories",
caption = "Source : données Corse | 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",
legend.direction = "vertical")10.4 Exercice Bonus — Comparer Liban et Corse
stats <- data.frame(
territoire = c("Liban", "Corse"),
alt_moy = c(
global(rast("data/Liban/LBN_elevation_w_bathymetry.tif"), "mean", na.rm = TRUE)[[1]],
global(dem_corse, "mean", na.rm = TRUE)[[1]]
),
alt_max = c(
global(rast("data/Liban/LBN_elevation_w_bathymetry.tif"), "max", na.rm = TRUE)[[1]],
global(dem_corse, "max", na.rm = TRUE)[[1]]
),
superficie_km2 = c(10452, 8680)
)
knitr::kable(stats, digits = 0,
col.names = c("Territoire", "Altitude moy. (m)",
"Altitude max. (m)", "Superficie (km²)"),
caption = "Comparaison topographique Liban / Corse")| Territoire | Altitude moy. (m) | Altitude max. (m) | Superficie (km²) |
|---|---|---|---|
| Liban | -680 | 3065 | 10452 |
| Corse | 119 | 2664 | 8680 |
← Retour au cours : Raster : Indices Topographiques → Suivant : Analyse Avancée
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