Tutoriel pratique avec R et sf pour actualiser les limites administratives du Burkina Faso selon la réforme territoriale de 2025.
Auteur·rice
NEBIE G.C.
Date de publication
2 septembre 2025
Résumé
Cet article présente une méthodologie reproductible pour mettre à jour les limites administratives du Burkina Faso suite à la réforme territoriale de 2025. Grâce à R et au package sf, nous passons de l’ancien découpage (13 régions et 45 provinces) au nouveau (17 régions et 47 provinces) en appliquant une série d’opérations spatiales simples et robustes.
Note importante
Les couches produites dans ce tutoriel sont destinées uniquement à des usages pédagogiques et analytiques.
Elles ne se substituent en aucun cas aux données officielles diffusées par l’Institut Géographique du Burkina Faso (IGB), seule institution habilitée à publier les limites administratives de référence.
Introduction
Le Burkina Faso a récemment entrepris une réforme administrative majeure avec la publication des décrets N°2025-1003/PF/PRIM/MATM/MEF portant changement de dénomination de provinces et de régions circonscriptions administratives et N°2025-1012/PF/PRIM/MATM/MEF portant réorganisation du territoire national en circonscriptions administratives. Ces textes officiels réorganisent complètement le territoire national, faisant passer le pays de 13 à 17 régions et de 45 à 47 provinces.
Méthodologie
Notre workflow se déroule en 4 étapes principales :
Associer départements → provinces → régions à l’aide de jointures spatiales sur les centroïdes.
Appliquer les changements de noms et créer les nouvelles entités administratives selon les décrets.
Agréger les géométries des départements pour obtenir les nouvelles provinces et régions.
Valider les géométries, sauvegarder les résultats et comparer l’ancien et le nouveau découpage.
Mise en œuvre
Chargement des packages et données
Afficher le code
# Chargement des packages pour l'analyse spatiale et la visualisationlibrary(sf) # Géotraitement des données spatialeslibrary(tidyverse) # Manipulation de donnéeslibrary(ggplot2) # Visualisation graphiquelibrary(patchwork) # Combinaison de graphiqueslibrary(RColorBrewer)
Importons les anciennes couches administratives :
Afficher le code
region <-st_read("data/ADM_Region.shp")province <-st_read("data/ADM_Province.shp")departement <-st_read("data/ADM_Commune.shp")
Bonnes pratiques :
Vérifier les systèmes de coordonnées (st_crs()) avant toute jointure.
Harmoniser si nécessaire pour éviter les décalages.
Afficher le code
st_crs(departement) ==st_crs(province)
[1] TRUE
Afficher le code
st_crs(region) ==st_crs(province)
[1] TRUE
Observons les noms des colonnes de nos fichiers :
Afficher le code
colnames(region)
[1] "Nom" "SHAPE_Leng" "SHAPE_Area" "geometry"
Afficher le code
colnames(province)
[1] "Nom" "SHAPE_Leng" "SHAPE_Area" "geometry"
Afficher le code
colnames(departement)
[1] "Nom" "SHAPE_Leng" "SHAPE_Area" "geometry"
Sélection et renommage des colonnes pour plus de clarté
Afficher le code
region <- region %>%select(Nom) %>%rename(Nom_region = Nom)province <- province %>%select(Nom) %>%rename(Nom_province = Nom)departement <- departement %>%select(Nom) %>%rename(Nom_departement = Nom)
Association des départements aux provinces et régions
Nous utilisons les centroïdes des départements pour établir les correspondances.
Afficher le code
# Calcul des centroïdes des départementscentroides_departement <-st_centroid(departement)# Jointure spatiale pour associer les départements aux provincesappariement <-st_join(centroides_departement, province, join = st_within)# Jointure spatiale pour associer les départements aux régionsappariement <-st_join(appariement, region, join = st_within)
Vérifions les cas où la jointure n’a pas fonctionné :
departement <- departement %>%mutate(Nom_province = appariement$Nom_province,Nom_region = appariement$Nom_region)
Mise à jour des provinces
Application des changements selon les décrets :
Afficher le code
# Création de la variable Nom_province_nouveaudepartement <- departement %>%mutate(Nom_province_nouveau =case_when(# Création des nouvelles provinces Nom_departement %in%c("BOTOU", "KANTCHARI") ~"DYAMONGOU", Nom_departement %in%c("ARBINDA", "KOUTOUGOU") ~"KARO PELI",# Renommage des provinces existantes Nom_province =="KOSSI"~"KOOSIN", Nom_province =="OUBRITENGA"~"BASSITENGA", Nom_province =="SANMATENGA"~"SANDBONDTENGA", Nom_province =="SOUM"~"DJELGODJI", Nom_province =="TAPOA"~"GOBNANGOU",# Conservation des noms existants pour les autres.default = Nom_province ))
Vérification :
Afficher le code
# Vérification du nombre de provinceslength(unique(departement$Nom_province_nouveau))
[1] 47
Nous avons bel et bien 47 provinces.
Mise à jour des régions
Même logique pour les régions :
Afficher le code
# Création de la variable Nom_region_nouveaudepartement <- departement %>%mutate(Nom_region_nouveau =case_when(# Création des nouvelles régions Nom_province_nouveau %in%c("GNAGNA", "KOMANDJARI") ~"SIRBA", Nom_province_nouveau %in%c("DJELGODJI", "KARO PELI") ~"SOUM", Nom_province_nouveau %in%c("SOUROU", "KOOSIN", "NAYALA") ~"SOUROU", Nom_province_nouveau %in%c("DYAMONGOU", "GOBNANGOU") ~"TAPOA",# Renommage des régions existantes Nom_region =="BOUCLE DU MOUHOUN"~"BANKUI", Nom_region =="CASCADES"~"TANNOUNYAN", Nom_region =="CENTRE"~"KADIOGO", Nom_region =="CENTRE-EST"~"NAKAMBE", Nom_region =="CENTRE-NORD"~"KOULSE", Nom_region =="CENTRE-OUEST"~"NANDO", Nom_region =="CENTRE-SUD"~"NAZINON", Nom_region =="EST"~"GOULMOU", Nom_region =="HAUTS-BASSINS"~"GUIRIKO", Nom_region =="NORD"~"YAADGA", Nom_region =="PLATEAU-CENTRAL"~"OUBRI", Nom_region =="SAHEL"~"LIPTAKO", Nom_region =="SUD-OUEST"~"DJORO" ))
Vérifications :
Afficher le code
# Vérification du nombre de régionslength(unique(departement$Nom_region_nouveau))
[1] 17
Suppression des anciennes colonnes de province et région :
Afficher le code
departement <- departement %>%select(-c(Nom_province, Nom_region))
Agrégation et création des nouvelles couches
Nous agrégeons les départements pour former les nouvelles provinces et régions.
Afficher le code
# Provincesnouvelles_provinces <- departement %>%group_by(Nom_province_nouveau) %>%summarize(geometry =st_union(geometry))# Régionsnouvelles_regions <- departement %>%group_by(Nom_region_nouveau) %>%summarize(geometry =st_union(geometry))# Validationnouvelles_provinces <-st_make_valid(nouvelles_provinces)nouvelles_regions <-st_make_valid(nouvelles_regions)
Validation et sauvegarde
Afficher le code
# Validation des géométriesnouvelles_provinces <-st_make_valid(nouvelles_provinces)nouvelles_regions <-st_make_valid(nouvelles_regions)
Nous comparons les anciennes et nouvelles cartes des régions.
Carte des nouvelles provinces :
Warning: st_centroid assumes attributes are constant over geometries
Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
give correct results for longitude/latitude data
Cartographie avec R
Les cartes présentées ci-dessus illustrent simplement nos résultats.
Avec R, il est possible d’aller bien plus loin : - création de cartes thématiques (indices socio-économiques, densité de population, ressources naturelles),
- production de cartes interactives avec mapview ou leaflet,
- mise en forme avancée avec tmap ou ggspatial.
Conclusion
Cet article a présenté une méthodologie pour mettre à jour les limites administratives du Burkina Faso suite à la réforme de 2025. Nous avons utilisé des techniques de jointure spatiale, de regroupement et de validation de géométries. Les nouvelles couches sont maintenant prêtes à être utilisées dans des analyses spatiales.
---title: "Mise à jour des limites administratives du Burkina Faso selon la réforme de 2025"author: "NEBIE G.C."date: todayformat: html: toc: true toc-depth: 3 toc-title: "Sommaire" code-fold: true code-summary: "Afficher le code" code-tools: true theme: cosmo lang: frabstract: | Cet article présente une méthodologie reproductible pour mettre à jour les limites administratives du Burkina Faso suite à la réforme territoriale de 2025. Grâce à R et au package `sf`, nous passons de l’ancien découpage (13 régions et 45 provinces) au nouveau (17 régions et 47 provinces) en appliquant une série d’opérations spatiales simples et robustes.description: "Tutoriel pratique avec R et sf pour actualiser les limites administratives du Burkina Faso selon la réforme territoriale de 2025."---::: {.callout-tip title="Note importante"}Les couches produites dans ce tutoriel sont destinées uniquement à des usages **pédagogiques et analytiques**. Elles ne se substituent en aucun cas aux données officielles diffusées par l’**Institut Géographique du Burkina Faso (IGB)**, seule institution habilitée à publier les limites administratives de référence. :::# IntroductionLe Burkina Faso a récemment entrepris une réforme administrative majeure avec la publication des décrets **_N°2025-1003/PF/PRIM/MATM/MEF portant changement de dénomination de provinces et de régions circonscriptions administratives_** et **_N°2025-1012/PF/PRIM/MATM/MEF portant réorganisation du territoire national en circonscriptions administratives_**. Ces textes officiels réorganisent complètement le territoire national, faisant passer le pays de 13 à 17 régions et de 45 à 47 provinces. # MéthodologieNotre workflow se déroule en **4 étapes principales** : 1. Associer départements → provinces → régions à l’aide de jointures spatiales sur les centroïdes.2. Appliquer les changements de noms et créer les nouvelles entités administratives selon les décrets. 3. Agréger les géométries des départements pour obtenir les nouvelles provinces et régions. 4. Valider les géométries, sauvegarder les résultats et comparer l’ancien et le nouveau découpage. # Mise en œuvre## Chargement des packages et données```{r}#| label: packages#| message: false#| warning: false# Chargement des packages pour l'analyse spatiale et la visualisationlibrary(sf) # Géotraitement des données spatialeslibrary(tidyverse) # Manipulation de donnéeslibrary(ggplot2) # Visualisation graphiquelibrary(patchwork) # Combinaison de graphiqueslibrary(RColorBrewer)```Importons les anciennes couches administratives : ```{r}#| label: charger-data#| message: false#| warning: false#| results: "hide"region <-st_read("data/ADM_Region.shp")province <-st_read("data/ADM_Province.shp")departement <-st_read("data/ADM_Commune.shp")```Bonnes pratiques :1. Vérifier les systèmes de coordonnées (`st_crs()`) avant toute jointure.2. Harmoniser si nécessaire pour éviter les décalages.```{r}#| label: verification-crs#| message: false#| warning: falsest_crs(departement) ==st_crs(province)st_crs(region) ==st_crs(province)```Observons les noms des colonnes de nos fichiers :```{r}#| label: col-names#| message: false#| warning: falsecolnames(region)colnames(province)colnames(departement)```Sélection et renommage des colonnes pour plus de clarté```{r}#| label: select-rename#| message: false#| warning: falseregion <- region %>%select(Nom) %>%rename(Nom_region = Nom)province <- province %>%select(Nom) %>%rename(Nom_province = Nom)departement <- departement %>%select(Nom) %>%rename(Nom_departement = Nom)```## Association des départements aux provinces et régionsNous utilisons les centroïdes des départements pour établir les correspondances.```{r}#| label: centroid-joint#| message: false#| warning: false# Calcul des centroïdes des départementscentroides_departement <-st_centroid(departement)# Jointure spatiale pour associer les départements aux provincesappariement <-st_join(centroides_departement, province, join = st_within)# Jointure spatiale pour associer les départements aux régionsappariement <-st_join(appariement, region, join = st_within)```Vérifions les cas où la jointure n'a pas fonctionné :```{r}#| label: filter-1#| message: false#| warning: falseappariement %>%filter(is.na(Nom_province) |is.na(Nom_region))```La commune de **KOMBORI** n’est pas correctement associée.Nous corrigeons manuellement :```{r}#| label: correction#| message: false#| warning: falseappariement <- appariement %>%mutate(Nom_province =case_when( Nom_departement =="KOMBORI"~"KOSSI",.default = Nom_province ),Nom_region =case_when( Nom_departement =="KOMBORI"~"BOUCLE DU MOUHOUN",.default = Nom_region) )```Enfin, ajoutons les colonnes aux départements :```{r}#| label: complete-name#| message: false#| warning: falsedepartement <- departement %>%mutate(Nom_province = appariement$Nom_province,Nom_region = appariement$Nom_region)```## Mise à jour des provincesApplication des changements selon les décrets : ```{r}#| label: traitement-province#| message: false#| warning: false# Création de la variable Nom_province_nouveaudepartement <- departement %>%mutate(Nom_province_nouveau =case_when(# Création des nouvelles provinces Nom_departement %in%c("BOTOU", "KANTCHARI") ~"DYAMONGOU", Nom_departement %in%c("ARBINDA", "KOUTOUGOU") ~"KARO PELI",# Renommage des provinces existantes Nom_province =="KOSSI"~"KOOSIN", Nom_province =="OUBRITENGA"~"BASSITENGA", Nom_province =="SANMATENGA"~"SANDBONDTENGA", Nom_province =="SOUM"~"DJELGODJI", Nom_province =="TAPOA"~"GOBNANGOU",# Conservation des noms existants pour les autres.default = Nom_province ))```Vérification :```{r}#| label: nombre-province#| message: false#| warning: false# Vérification du nombre de provinceslength(unique(departement$Nom_province_nouveau))```Nous avons bel et bien 47 provinces.## Mise à jour des régionsMême logique pour les régions :```{r}#| label: traitement-region#| message: false#| warning: false# Création de la variable Nom_region_nouveaudepartement <- departement %>%mutate(Nom_region_nouveau =case_when(# Création des nouvelles régions Nom_province_nouveau %in%c("GNAGNA", "KOMANDJARI") ~"SIRBA", Nom_province_nouveau %in%c("DJELGODJI", "KARO PELI") ~"SOUM", Nom_province_nouveau %in%c("SOUROU", "KOOSIN", "NAYALA") ~"SOUROU", Nom_province_nouveau %in%c("DYAMONGOU", "GOBNANGOU") ~"TAPOA",# Renommage des régions existantes Nom_region =="BOUCLE DU MOUHOUN"~"BANKUI", Nom_region =="CASCADES"~"TANNOUNYAN", Nom_region =="CENTRE"~"KADIOGO", Nom_region =="CENTRE-EST"~"NAKAMBE", Nom_region =="CENTRE-NORD"~"KOULSE", Nom_region =="CENTRE-OUEST"~"NANDO", Nom_region =="CENTRE-SUD"~"NAZINON", Nom_region =="EST"~"GOULMOU", Nom_region =="HAUTS-BASSINS"~"GUIRIKO", Nom_region =="NORD"~"YAADGA", Nom_region =="PLATEAU-CENTRAL"~"OUBRI", Nom_region =="SAHEL"~"LIPTAKO", Nom_region =="SUD-OUEST"~"DJORO" ))```Vérifications :```{r}#| label: nombre-region#| message: false#| warning: false# Vérification du nombre de régionslength(unique(departement$Nom_region_nouveau))```Suppression des anciennes colonnes de province et région :```{r}#| label: suppression-nom#| message: false#| warning: falsedepartement <- departement %>%select(-c(Nom_province, Nom_region))```## Agrégation et création des nouvelles couchesNous agrégeons les départements pour former les nouvelles provinces et régions.```{r}#| label: nouvelle-couche#| message: false#| warning: false# Provincesnouvelles_provinces <- departement %>%group_by(Nom_province_nouveau) %>%summarize(geometry =st_union(geometry))# Régionsnouvelles_regions <- departement %>%group_by(Nom_region_nouveau) %>%summarize(geometry =st_union(geometry))# Validationnouvelles_provinces <-st_make_valid(nouvelles_provinces)nouvelles_regions <-st_make_valid(nouvelles_regions)```## Validation et sauvegarde```{r}#| label: validation#| message: false#| warning: false#| results: "hide"# Validation des géométriesnouvelles_provinces <-st_make_valid(nouvelles_provinces)nouvelles_regions <-st_make_valid(nouvelles_regions)``````{r}#| label: sauvegarde#| message: false#| warning: false#| results: "hide"# Sauvegarde des nouvelles couchesst_write(nouvelles_provinces, "outputs/nouvelles_provinces.shp", delete_dsn =TRUE)st_write(nouvelles_regions, "outputs/nouvelles_regions.shp", delete_dsn =TRUE)st_write(departement, "outputs/departements_actualises.shp", delete_dsn =TRUE)```# VisualisationNous comparons les anciennes et nouvelles cartes des régions.```{r}#| label: visualisation-comparative#| fig-width: 12#| fig-height: 8#| echo: false#| results: "hide"library(RColorBrewer)# Anciennes régionscarte_anciennes <-ggplot() +geom_sf(data = region, aes(fill = Nom_region), color ="white", size =0.2) +scale_fill_viridis_d(option ="plasma") +# palette lisible et élégantetheme_minimal() +labs(title ="Ancien découpage (13 régions)",subtitle ="Structure administrative avant la réforme de 2025",fill ="Régions") +theme(legend.position ="none",plot.title =element_text(face ="bold", size =14))# Nouvelles régionscarte_nouvelles <-ggplot() +geom_sf(data = nouvelles_regions, aes(fill = Nom_region_nouveau), color ="white", size =0.2) +scale_fill_viridis_d(option ="turbo") +# palette plus contrastéetheme_minimal() +labs(title ="Nouveau découpage (17 régions)",subtitle ="Structure administrative après la réforme de 2025",fill ="Régions") +theme(legend.position ="none",plot.title =element_text(face ="bold", size =14))# Comparaisoncarte_anciennes + carte_nouvelles +plot_annotation(title ="Comparaison des découpages administratifs du Burkina Faso",caption ="Source: Décrets N°2025-1003 et N°2025-1012 | Réalisation: NEBIE G.C." )```Carte des nouvelles provinces :```{r}#| label: visualisation-comparative-1#| fig-width: 12#| fig-height: 8#| echo: false#| results: "hide"library(ggrepel) # pour un placement intelligent des étiquettes# Calculer les centroïdes des nouvelles provinces pour les labelscentroides_provinces <-st_centroid(nouvelles_provinces)# Carte des nouvelles provinces avec labelscarte_provinces <-ggplot() +geom_sf(data = nouvelles_provinces, aes(fill = Nom_province_nouveau), color ="white", size =0.3) +geom_label_repel(data = centroides_provinces,aes(label = Nom_province_nouveau, geometry = geometry),stat ="sf_coordinates",size =3, fill ="white", color ="black", segment.size =0.2 ) +scale_fill_viridis_d(option ="turbo") +theme_minimal() +labs(title ="Nouveau découpage administratif : Provinces (2025)",subtitle ="Découpage officiel réorganisé en 47 provinces",fill ="Provinces",x =" ", y =" ") +theme(legend.position ="none",plot.title =element_text(face ="bold", size =14),plot.subtitle =element_text(size =10, color ="gray40"))carte_provinces```::: {.callout-note title="Cartographie avec R"}Les cartes présentées ci-dessus illustrent simplement nos résultats. Avec R, il est possible d'aller bien plus loin : - création de cartes thématiques (indices socio-économiques, densité de population, ressources naturelles), - production de cartes interactives avec `mapview` ou `leaflet`, - mise en forme avancée avec `tmap` ou `ggspatial`. :::# ConclusionCet article a présenté une méthodologie pour mettre à jour les limites administratives du Burkina Faso suite à la réforme de 2025. Nous avons utilisé des techniques de jointure spatiale, de regroupement et de validation de géométries. Les nouvelles couches sont maintenant prêtes à être utilisées dans des analyses spatiales.Le code complet et les données sont disponibles sur GitHub : <https://github.com/ngastoncyrille/02_limites_administrative># Pour aller plus loin## Prochaines étapes- Intégration des données démographiques par nouvelle entité- Calcul d'indices de développement territorial## Packages utiles complémentaires- `tmap` pour la cartographie thématique- `mapview` pour la visualisation interactive- `units` pour la gestion des unités de mesure## Références techniques- [Documentation du package sf](https://r-spatial.github.io/sf/)- [Guide de cartographie avec ggplot2](https://ggplot2-book.org/maps.html)- [Best practices for spatial data in R](https://geocompr.robinlovelace.net/)