Une nouvelle fonctionnalité de la librairie {sf} permet de trouver les intersections entre les polygones d’un même objet géographique qui se recouvrent. L’occasion de reproduire notre logo ThinkR manuellement dans R, comme un objet spatialisé.
La nouvelle fonctionnalité de la librairie {sf} est présentée dans l’article : higher-order geometry differences and intersections. L’exemple proposé m’a fait penser au logo ThinkR. Je viens de rejoindre l’équipe alors c’est l’occasion de faire mon premier article sur le blog. Comme j’aime bien la cartographie, je trouvais ça cool de reproduire entièrement le logo ThinkR avec des librairies spatiales dans R.
Jouons avec les librairies spatiales de r-spatial.org : {sf}, {mapedit} et {mapview}
Numérisation manuelle du logo ThinkR avec {mapedit}
Le logo est chargé comme un raster. On lui associe une étendue spatiale qui couvre Paris. On aurait pu couvrir la France puisqu’on est présent partout, mais restons modestes… On lui assigne une projection mercator pour qu’il s’affiche proprement avec {leaflet} sur {mapview}.
# install.packages("mapedit")
# install.packages("mapview")
# install.packages("leaflet.extras")
# install.packages("sf")
library(sf)
library(raster)
library(mapedit)
library(mapview)
library(ggplot2)
library(dplyr)
logo <- stack("ThinkR_logo_500px.png")
extent(logo) <- c(170000, 330000, 6140000, 6300000)
projection(logo) <- "+init=epsg:3857"
viewRGB(logo)
On utilise {mapedit} pour dessiner manuellement les trois polygones qui composent le logo (cf. gif ci-dessous).
logo_pol <- viewRGB(logo) %>%
editMap()
logo_overlap <- logo_pol$finished %>%
mutate(col = c("#f15522", "#ada9ae", "#15b7d6"))
Les polygones dessinés à la main dans {mapedit} sont directement sauvés comme un objet de la librairie {sf}. En choisissant les bonnes couleurs, on voit déjà se profiler le logo.
ggplot(logo_overlap) +
geom_sf(aes(fill = factor(X_leaflet_id)), alpha = 0.5) +
scale_fill_manual(values = logo_overlap$col) +
guides(fill = FALSE)
Trouver les polygones qui se recouvrent
Utilisons la nouvelle fonctionnalité de st_intersection
pour trouver les zones qui se recouvrent.
# devtools::install_github("r-spatial/sf")
st_intersection(logo_overlap) %>%
st_cast()
## Simple feature collection with 7 features and 5 fields
## geometry type: GEOMETRY
## dimension: XY
## bbox: xmin: 1.5779 ymin: 48.2146 xmax: 2.9128 ymax: 49.1341
## epsg (SRID): 4326
## proj4string: +proj=longlat +datum=WGS84 +no_defs
## X_leaflet_id feature_type col n.overlaps origins
## 1 102 polygon #f15522 1 1
## 2 102 polygon #f15522 2 1, 2
## 3 129 polygon #ada9ae 1 2
## 4 129 polygon #ada9ae 2 2, 3
## 5 102 polygon #f15522 3 1, 2, 3
## 6 102 polygon #f15522 2 1, 3
## 7 158 polygon #15b7d6 1 3
## geometry
## 1 POLYGON ((1.6109 49.1152, 1...
## 2 POLYGON ((2.07940952471329 ...
## 3 POLYGON ((2.3758 48.285, 2....
## 4 POLYGON ((2.37136364514876 ...
## 5 POLYGON ((2.37136364514876 ...
## 6 GEOMETRYCOLLECTION (POINT (...
## 7 MULTIPOLYGON (((2.8331 48.2...
On filtre la collection pour ne conserver que les polygones, on change la couleur pour du blanc sur les polygones issus d’intersections et on fait la figure.
# devtools::install_github("r-spatial/sf")
logo_overlap_i <- st_intersection(logo_overlap) %>%
st_collection_extract("POLYGON") %>%
mutate(
id = 1:n(),
col = ifelse(n.overlaps > 1, "#ffffff", col))
ggplot(logo_overlap_i) +
geom_sf(aes(fill = factor(id)), color = NA) +
scale_fill_manual(values = logo_overlap_i$col) +
guides(fill = FALSE) +
theme_minimal()
Affichage du logo dans leaflet
Parce qu’on a commencé avec la création en mode interactif, finissons avec un affichage leaflet interactif.
m <- leaflet(width = '100%') %>%
addTiles(urlTemplate = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png") %>%
addPolygons(data = logo_overlap_i,
fillColor = logo_overlap_i$col,
fill = TRUE, fillOpacity = 0.8,
color = "")
Je fais un commentaire test sur mon propre article
Tu voulais juste prévenir que tu étais d’accord avec tout ce qui était raconté dans cet article ? 😀
Tout à fait
Test de disqus sur ThinkR