Le logo ThinkR créé avec la librairie {sf}

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}.

 

[code language= »r »]
# 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"
[/code]

 

[code language= »r »]
viewRGB(logo)
[/code]

On utilise {mapedit} pour dessiner manuellement les trois polygones qui composent le logo (cf. gif ci-dessous).

[code language= »r »]
logo_pol <- viewRGB(logo) %>%
editMap()

logo_overlap <- logo_pol$finished %>%
mutate(col = c("#f15522", "#ada9ae", "#15b7d6"))
[/code]

 

gif thinkr - library sf

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.

[code language= »r »]
ggplot(logo_overlap) +
geom_sf(aes(fill = factor(X_leaflet_id)), alpha = 0.5) +
scale_fill_manual(values = logo_overlap$col) +
guides(fill = FALSE)
[/code]

logo overlap polygons - library sf

Trouver les polygones qui se recouvrent

Utilisons la nouvelle fonctionnalité de st_intersection pour trouver les zones qui se recouvrent.

[code language= »r »]
# devtools::install_github("r-spatial/sf")
st_intersection(logo_overlap) %>%
st_cast()
[/code]

[code]
## 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…
[/code]

 

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.

[code language= »r »]
# 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()
[/code]

 

logo thinkr intersection polygons - library sf

Affichage du logo dans leaflet

Parce qu’on a commencé avec la création en mode interactif, finissons avec un affichage leaflet interactif.

[code language= »r »]
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 = "")
[/code]


À propos de l'auteur

Sébastien Rochette

Sébastien Rochette

Modélisateur, formateur R, joueur de cartographies


Commentaires


À lire également