Les études sur les aires protégées s’appuient fréquemment sur la base WDPA (World Database on Protected Area), consultable en ligne sur https://protectedplanet.net. On s’aperçoit dans le cas de Madagascar que cette base de données comporte de nombreuses erreurs (qu’on étudiera plus bas). La base rassemblée par l’association Vahatra dans le cadre de la monographie qu’elle a coordonnée sur l’ensemble des aires protégées terrestres malgaches semble beaucoup plus fiable (Goodman et al. 2018). Les données en question sont disponibles sur le portail https://protectedareas.mg avec une licence creative commons (CC-BY).
Le bloc de code ci-dessous (cliquer sur “code” pour visualiser), présente la séquence d’opérations réalisées pour préparer les données.Pour comprendre certaines opérations contenues dans le bloc de code, il est utile d’être familier de la syntaxe de R et des packages du tidyverse. Voir le chapitre Chapter 11.
Code
library(tidyverse)library(lubridate)library(sf)library(tmap)library(geodata)library(cowplot)library(wdpar)library(gt) # Pour faciliter le rendu des tableaux (et ils sont jolis)# Le shapefile est composé d'une série de fichiers, (.shp, .dbf, .prj, .shx)# qui doivent avoir le même nom et être au même endroits pour être ouverts en# même temps. Comme souvent, ils sont compressés ensemble dans un fichier zip.# On commence par dézipper (décompresser) ce fichier.unzip("data/Vahatra98AP.zip", exdir ="data/Vahatra")# On importe dans R en pointant vers le fichier .shp, mais c'est bien toute la# collection de fichiers homonymes .shp, .dbf, .shx qui est chargée.AP_Vahatra <-st_read("data/Vahatra/Vahatra98AP.shp", quiet =TRUE) %>%# Il manque la projection (pas de fichier .prj), on la spécifie à la mainst_set_crs("EPSG:4326") %>%# EPSG 4325 = WSG 84 = le standard pour le webrename(cat_iucn = cat__iucn) # une variable a un nom étrange : on simplifie# L'option ci-dessous est un peu cryptique : des caractéristiques topologiques# de la carte source sont incompatibles avec la possibilité d'avoir des objets# sphériques dans sf. Cela disparait si on désactive cette possibilitésf_use_s2(FALSE) # Identification des dates ----------------------------------------------------# Cette section est un brin complexe, à base de manipulation de chaînes de # caractères et de dates# Détecte les dates écrites 2 avril 2020 ou 02 avril 2020, etc.date_ecrite <-"[:digit:]{1,2} [:alpha:]* [:digit:]{4}"# Détecte les dates écrites 02/04/20 ou 02.04.20 ou 02.04.2020, etc.date_abrev <-"[:digit:]{2}[:punct:][:digit:]{2}[:punct:][:digit:]{2,4}"# Des années écrites à 2 chiffresdate_ecrite_an_abrev <-"[:digit:]{1,2} [:alpha:]* [:digit:]{4}"# Détecte l'une ou l'autre des formes précédentestoute_date <-paste(date_ecrite, date_abrev, date_ecrite_an_abrev, sep ="|")# Détecte une mention d'année seule : 1984, 2015, etc.annee_seule <-"[:digit:]{4}"# Détecte les formes indicatrices d'un changementmention_changement <-"Changement|changement|anciennement|actuel|auparavant"# Une fonction qui traduit les dates écrites en toutes lettre du français à # l'anglais (pour les parser ensuite car ça ne fonctionne qu'en anglais)trad_dates <-function(date_fr) {str_replace_all(date_fr,c("janvier"="January","fevrier"="February","mars"="March","avril"="April","mai"="May","juin"="June","juillet"="July","aout"="August","septembre|setembre"="September","octobre"="October","novembre"="November","decembre|decmbre"="December"))}# Cette fonction remplace 01.04.58 par 01.04.1958 et marche avec . ou /# On indique avec limite le nombre d'année où on considère que c'est 1900 vs 2000complete_annee <-function(date_abrev, limite =20) {if (str_detect(date_abrev, "([:punct:])([:digit:]{2})[:punct:]?$")) { date_abrev <-str_remove(date_abrev, ":punct:]?$")if (as.numeric(str_extract(date_abrev, "[:digit:]{2}$")) > limite) { date_abrev <-str_replace(date_abrev, "([:punct:])([:digit:]{2})[:punct:]?$", "\\119\\2") } else { date_abrev <-str_replace(date_abrev, "([:punct:])([:digit:]{2})[:punct:]?$", "\\120\\2") } }return(date_abrev)}# La fonction précédente est unitaire, on la transforme pour qu'elle s'applique à une liste.complete_liste_dates <-function(liste_dates) {map(liste_dates, complete_annee)}AP_Vahatra <- AP_Vahatra %>%# On extrait les dates des champs de textemutate(date_creation =str_extract_all(creation, toute_date), # Une date a un format incohérent, on la recode à la maindate_creation =ifelse(creation =="Créée le 07 aout 04","07 aout 2004", date_creation),date_creationA =map(date_creation, 1), # La 1ère datedate_creationB =map(date_creation, 2)) %>%# Si 2 dates, la seconde# On traduit les mois en anglais pour une conversion au format datemutate(across(c(date_creationA, date_creationB), trad_dates)) %>%mutate(across(c(date_creationA, date_creationB), complete_liste_dates)) %>%mutate(across(c(date_creationA, date_creationB), dmy)) %>%mutate(date_creation =case_when(is.na(date_creationB) ~ date_creationA, date_creationA > date_creationB ~ date_creationB, date_creationA <= date_creationB ~ date_creationA),date_modification =case_when(is.na(date_creationB) ~ date_creationB, date_creationA < date_creationB ~ date_creationB, date_creationA >= date_creationB ~ date_creationA),# On repère si il y a eu un changement de statut ou de frontièresmention_changement =str_detect(creation, mention_changement)) %>%# On enlève les colonnes inutilesselect(-date_creationA, -date_creationB) %>%# On place les colonnes créées à gauche pour les inspecter facilementrelocate(date_creation:mention_changement, .after = creation) # Après une vérification manuelle, on remarque les données de l'association Vahatra comportent des mentions incomplètes pour certaines aires, qui n'ont pas été extraites:AP_Vahatra <- AP_Vahatra %>%mutate(date_creation =case_when(nom =="Lokobe"~ymd("1927-12-31"), nom =="Mantadia"~ymd("1989-01-11"),TRUE~ date_creation),date_modification =case_when(nom =="Bemaraha"~ymd("2011-07-06"), nom =="Lokobe"~ymd("2011-07-06"), nom =="Tsaratanana"~ymd("2011-07-06"), nom =="Pic d'Ivohibe"~ymd("2015-04-28"), nom =="Mantadia"~ymd("2002-08-07"),TRUE~ date_modification),an_creation =year(date_creation)) %>%st_make_valid() # fiabilise qu'il n'y a pas d'erreurs topologiques# dir.create("AP_Vahatra")# st_write(AP_Vahatra, "out/AP_Vahatra.shp")# writexl::write_xlsx(st_drop_geometry(AP_Vahatra), "AP_Vahatra.xlsx")
Le bloc de code suivant génère une carte interactive. On a également inclus des lignes de code qui permettent de formater la carte joliment pour un rendu figé (pdf/LaTeX, html statique, word), mais ce code est “commenté”, c’est-à-dire qu’on a placé des dièses au début de chaque ligne, de sorte qu’il ne s’exécute pas (R n’exécute jamais ce qui se trouve à droite d’un # sur une ligne). Pour plus de détails sur la manière dont on produit des cartes, voire la section “Cartes simples avec R” dans le chapitre Chapter 11.
Code
# On regarde si les frontières terrestres de Mada ont déjà été téléchargéesif (file.exists("data/contour_mada.rds")) {# Si c'"est le cas, on charge la version déjà disponible localementload("data/contour_mada.rds")} else {# Sinon on la télécharge depuis la base GADM contour_mada <-gadm(country ="Madagascar", resolution =1, level =0,path ="data/GADM") %>%st_as_sf()# On enregistre contour_mada pour s'en servir par la suitesave(contour_mada, file ="data/contour_mada.rds")}# On génère un rendu cartographiquetmap_mode("view") # En mode interactiftm_shape(contour_mada) +tm_borders() +tm_shape(AP_Vahatra) +tm_polygons(col ="cat_iucn", alpha =0.6, title ="Catégorie IUCN",id ="nom",popup.vars =c("Acte de création"="creation","Année de création"="an_creation","Surface (ha)"="hectares","Nom complet"="full_name","Gestionnaire"="gest_1")) +tmap_options(check.and.fix =TRUE)