# load libraries
library(data.table)
library(sf)
library(floodam.data)
library(so.ii)
# set paths
# origin = tempdir()
= file.path("_data-local", "3M", "ruissellement", "zonage", "ruissellement-2024-11-22.gpkg")
path_hazard = file.path("_data-local", "so-ii", "to-adaptation", "state_2024-09-04.csv.gz")
path_adaptation = file.path("_data-local", "so-ii", "to-adaptation", "state-hazard_2024-09-04.csv.gz")
path_adaptation_hazard = file.path("image", "map") path_output_map
Comparaison du ruissellement avec les observations des adaptations
Génération d’une carte avec R qui permet la comparaison de l’étendue spatiale du ruissellement avec les observations ponctuelles des adaptations des bâtiments.
Objectif
Cette note vise à montrer comment produire une carte pour un rendu visuel de la cohérence entre les observations de terrains de la TO adaptation et la représentation spatiale au niveau institutionnel de l’aléa d’inondation.
Paramétrage initial
Le code est destiné à être exécuté avec R. Il est donc nécessaire que R](https://www.r-project.org/) soit installé sur votre système.
Ce tutoriel utilise les bibliothèques suivantes :
- data.table qui permet (entre autres) de lire rapidement un jeu de données tabulaires.
- sf qui permet de réaliser de nombreux traitements avec les données géomatiques au format vectoriel.
- floodam.data qui permet de réaliser des opérations adaptées aux données de l’observatoire.
- so.ii qui permet notamment de réaliser des cartes centrées sur le territoire de l’observatoire.
Il est également présupposé que vous disposiez d’un dossier **_data-local** accessible depuis votre espace de travail.
Chargement des librairies et définition des chemins
Chargement des données
Les données de ruissellement sont chargées. Elles sont au format gpkg dans notre exemple, mais quasiment n’importe quel format peut être lu avec la librairie sf.
# data in GPKG format
= sf::st_read(path_hazard)
hazard st_geometry(hazard) = "geometry"
if (!is.null(hazard[["area"]])) hazard[["area"]] = units::set_units(hazard[["area"]], km^2)
# Compressed data are managed
# Test if adapted files already exists, if not take none adapted file
if (!file.exists(path_adaptation_hazard)) {
= data.table::fread(path_adaptation, data.table = FALSE)
adaptation = sf::st_as_sf(adaptation, coords = c("lon", "lat"), crs = "WGS84")
adaptation else {
} = data.table::fread(path_adaptation_hazard, data.table = FALSE)
adaptation = sf::st_as_sf(adaptation, coords = c("lon", "lat"), crs = "WGS84")
adaptation }
Traitements
Préparation des codes couleurs pour les cartes et des légendes
Pour la couche ruissellement, il est choisi d’utiliser des couleurs avec de la transparence via la fonction alpha()
de la librairie scales
.
Pour la couche des adaptations, il est choisi d’utiliser des couleurs sans transparence, les dégradés sont obtenus avec la fonction col_mix()
de la librairie scales
. Les couleurs sans transparence sont nécessaires car beaucoup de points (autant que d’adresses) vont être dessinés. À l’échelle choisie ces points vont nécessairement se chevaucher. Avec des couleurs transparentes, il en résulterait un mélange des couleurs qui ne pourraient pas être décrit dans la légende.
= c(
col_hazard "Aléa très fort" = scales::alpha("red", .4),
"Aléa fort" = scales::alpha("red", .2),
"Aléa modéré" = scales::alpha("orange", .2),
"Aléa résiduel" = scales::alpha("blue", .2),
"Bande de sécurité" = scales::alpha("green", .2)
)
= list(
legend_hazard legend = names(col_hazard),
fill = col_hazard
)
= c("with", "none", "unobserved")
level_adaptation
= c(
col_adaptation "with - out" = scales::col_mix("blue", "white", .25),
"with - 1" = "green",
"with - 2" = scales::col_mix("green", "white", .25),
"with - 3" = scales::col_mix("green", "white"),
"none - 1" = "red",
"none - 2" = scales::col_mix("red", "orange"),
"none - 3" = "orange",
"none - out" = scales::col_mix("black", "white", .80),
"unobserved" = scales::col_mix("black", "white", .95)
)
= list(
legend_adaptation legend = c("Avec 'in'", "Sans 'in", "Non observé", "Avec 'out'", "Sans 'out'"),
col = col_adaptation[c("with - 1", "none - 1", "unobserved", "with - out", "none - out")],
pt.bg = col_adaptation[c("with - 1", "none - 1", "unobserved", "with - out", "none - out")],
pch = 21,
pt.cex = 1,
ncol = 2
)
Croisement des informations
# Affect hazard_level to each observation
# Give priority to highest level
# Take time and need a valid geometry for hazard to function
if (FALSE && !all(sf::st_is_valid(hazard))){
"hazard_level"]] = "Hors aléa"
adaptation[[for (h in rev(names(col_hazard))) {
= hazard[["hazard_level"]] %in% h
sel_h = floodam.data::in_layer(adaptation[0], hazard[sel_h, "geometry"])
sel_a "hazard_level"]][sel_a] = h
adaptation[[
}
= sf::st_drop_geometry(adaptation)
dataset = sf::st_coordinates(adaptation)
coordinates "lon"]] = coordinates[, "X"]
dataset[["lat"]] = coordinates[, "Y"]
dataset[[::fwrite(dataset, path_adaptation_hazard)
data.table }
Exploration des données de ruissellement
# Manage geometry
# condition set to FALSE as it takes time
if (FALSE && !all(sf::st_is_valid(hazard))){
= sf::st_make_valid(hazard)
hazard "area"]] = units::set_units(st_area(hazard), km^2)
hazard[[::st_write(hazard, path_hazard, delete_dsn = TRUE)
sf
}
# Select only Montpellier
= hazard[hazard[["commune"]] == "34172", ]
hazard
# Prepare info for Montpellier
= units::set_units(
area_montpellier ::st_area(so.ii::so_ii_collectivity[so.ii::so_ii_collectivity[["commune"]] == "34172", ]),
sf^2
km
)
# Areas
"hazard_level"]] = factor(hazard[["hazard_level"]], levels = names(col_hazard))
hazard[[= aggregate(list(superficie = hazard[["area"]]), list(zone = hazard[["hazard_level"]]), sum)
area = data.frame(
area zone = c(as.character(area[["zone"]]), "Hors zonage", "Montpellier"),
superficie = c(area[["superficie"]] , area_montpellier - sum(area[["superficie"]] ), area_montpellier)
)"proportion"]] = round(area[["superficie"]] / area_montpellier * 100, 2)
area[["superficie"]] = round(area[["superficie"]], 2)
area[[
::kable(area) knitr
Exploration des données d’adaptation
= adaptation[adaptation[["commune"]] == "34172", ]
adaptation "state"]] = factor(adaptation[["state"]], levels = level_adaptation)
adaptation[["hazard_level"]] = factor(adaptation[["hazard_level"]], levels= c(names(col_hazard), "Hors aléa"))
adaptation[[= adaptation[order(adaptation[["state"]], decreasing = TRUE), ]
adaptation
= sf::st_drop_geometry(adaptation)
dataset = table(dataset[c("hazard_level", "state")])
exposure = addmargins(exposure, FUN = list("total" = sum))
exposure ::kable(exposure) knitr
Génération de la carte
La librairie so.ii permet de générer facilement des cartes sur les périmètres inclus dans so-ii. Ici nous faisons une carte avec les caractéristiques suivantes :
- centrée sur Montpellier (
scope = "34172"
) - pas de thème particulier
- sauvegardée au format png (c’est induit par le choix de l’extension pour le fichier de sauvegarde).
par(bg = "white")
map_so_ii(
dataset = adaptation[0],
pch = 21,
cex = .1,
col = scales::col_mix("black", "white", .95),
bg = scales::col_mix("black", "white", .95),
scope = "34172"
)
map_so_ii(
dataset = hazard[0],
col = col_hazard[hazard[["hazard_level"]]],
border = NA,
dataset_legend = legend_hazard,
add = TRUE,
path = file.path(path_output_map, "runoff.png")
)
# plot(seq_along(col_adaptation), seq_along(col_adaptation), type = "p", pch = 21, cex = 3, col = col_adaptation, bg = col_adaptation)
= rep(col_adaptation[["unobserved"]], length(adaptation[["state"]]))
col_dataset
"state"]] %in% "none"] = col_adaptation[["none - out"]]
col_dataset[adaptation[["state"]] %in% "none" & adaptation[["hazard_level"]] %in% "Aléa modéré" ] = col_adaptation["none - 3"]
col_dataset[adaptation[["state"]] %in% "none" & adaptation[["hazard_level"]] %in% "Aléa fort"] = col_adaptation["none - 2"]
col_dataset[adaptation[["state"]] %in% "none" & adaptation[["hazard_level"]] %in% "Aléa très fort"] = col_adaptation["none - 1"]
col_dataset[adaptation[[
"state"]] %in% "with" & adaptation[["hazard_level"]] %in% "Aléa modéré" ] = col_adaptation[["with - 3"]]
col_dataset[adaptation[["state"]] %in% "with" & adaptation[["hazard_level"]] %in% "Aléa fort"] = col_adaptation[["with - 2"]]
col_dataset[adaptation[["state"]] %in% "with" & adaptation[["hazard_level"]] %in% "Aléa très fort"] = col_adaptation[["with - 1"]]
col_dataset[adaptation[[
"state"]] %in% "with" & adaptation[["hazard_level"]] %in% "Hors aléa" ] = col_adaptation[["with - out"]]
col_dataset[adaptation[[
= order(factor(col_dataset, levels = col_adaptation), decreasing = TRUE)
o = adaptation[o, ]
adaptation = col_dataset[o]
col_dataset
map_so_ii(
dataset = adaptation[0],
pch = 21,
cex = .1,
col = col_dataset,
bg = col_dataset,
dataset_legend = legend_adaptation,
scope = "34172",
path = file.path(path_output_map, "runoff-adaptation.png")
)