[This article was first published on r.iresmi.net, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
or more precisely union many spatial tables in R in a tidy way.
- dplyr::bind_rows doesn’t work on sf objects ;
- base::rbind only work on two tables and so that’s not straightforward to use*.
So we’ll use purrr::map and tidyr::unnest.
First get some data, the communes of three french départements :
library(tidyverse)
library(sf)
library(fs)
library(httr)
library(leaflet)
# https://fr.actualitix.com/blog/shapefiles-des-departements-de-france.html
url <- c("https://fr.actualitix.com/blog/actgeoshap/01-Ain.zip",
"https://fr.actualitix.com/blog/actgeoshap/73-savoie.zip",
"https://fr.actualitix.com/blog/actgeoshap/74-haute-savoie.zip")
dep <- str_extract(url, "\\d{2}.*$")
list(url, dep) %>%
pwalk(~ GET(.x, write_disk(.y)))
walk(dep, unzip, junkpaths = TRUE, exdir = "shp")
We can then create a 3 rows data frame containing a list-column in which we store the sf object. Then we just unnest it. This operation erases the sf-class, we have to add it back.
res <- dir_ls("shp", glob = "*.shp") %>%
tibble(fname = .) %>%
mutate(data = map(fname, read_sf)) %>%
unnest(data) %>%
st_as_sf() %>%
st_set_crs(2154)
write_sf(res, "shp/3dep.shp")
res %>%
st_transform(4326) %>%
leaflet() %>%
addPolygons() %>%
addTiles()
Bonus : we have the source filename stored in the resulting shapefile.
* We could have used
dir_ls("shp", glob = "*.shp") %>%
map(read_sf) %>%
do.call(rbind, .)
but the column structure doesn’t match here…
To leave a comment for the author, please follow the link and comment on their blog: r.iresmi.net.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
