r ggplot2 maps sf

encaja dos polígonos sf a la perfección



ggplot2 maps (1)

El problema

Supongamos que tenemos dos shapefiles que deben bordearse perfectamente. Sólo que no lo hacen. ¿Hay una manera de obligarlos a pegarse el uno al otro sin vacíos?

El caso especifico

Tengo dos shapefiles: uno para las regiones europeas - REG , el otro para los países vecinos - NEI . Ambos shapefiles están tomados del repositorio de Eurostat y deben encajar bien; Pero hay pequeños huecos. Además, necesito simplificar los polígonos, y luego las brechas se vuelven realmente notables.

Lo mejor que se me ocurre

He intentado varios enfoques pero sin éxito. La única forma de lograr el resultado deseado que veo requiere los siguientes pasos:

  • crear una línea sf con sólo el borde entre mis shapefiles;
  • desde esta línea, cree un polígono de búfer lo suficientemente grande para cubrir todos los huecos;
  • unir y disolver este búfer al shapefile para vecinos - NEI ;
  • recorte el NEI expandido con el shapefile REG .

Obviamente, esta es una solución bastante torpe.

¿Hay una mejor manera de ir?

Ejemplo reproducible en esta esencia.

Un ejemplo mínimo.

# install dev version of ggplot2 devtools::dev_mode() devtools::install_github("tidyverse/ggplot2") library(tidyverse) library(sf) library(rmapshaper) library(ggthemes) # load data source(file = url("https://gist.githubusercontent.com/ikashnitsky/4b92f6b9f4bcbd8b2190fb0796fd1ec0/raw/1e281b7bb8ec74c9c9989fe50a87b6021ddbad03/minimal-data.R")) # test how good they fit together ggplot() + geom_sf(data = REG, color = "black", size = .2, fill = NA) + geom_sf(data = NEI, color = "red", size = .2, fill = NA)+ coord_sf(datum = NA)+ theme_map() ggsave("test-1.pdf", width = 12, height = 10) # simplify REGs <- REG %>% ms_simplify(keep = .5, keep_shapes = TRUE) NEIs <- NEI %>% ms_simplify(keep = .5, keep_shapes = TRUE) ggplot() + geom_sf(data = REGs, color = "black", size = .2, fill = NA) + geom_sf(data = NEIs, color = "red", size = .2, fill = NA)+ coord_sf(datum = NA)+ theme_map() ggsave("test-2.pdf", width = 12, height = 10)


Parece que ms_simplify funciona en tu ejemplo mínimo, pero primero debes agrupar tus 2 "shapefiles" en un "shapefile". Si fuera necesario, sería fácil dividirlos después de la simplificación de los límites.
(nota: mi versión de rmapshaper devuelve un error cuando se usa ms_simplify con un objeto sf . Por eso he transformado mi objeto tmp en un objeto sp con as(tmp, "Spatial") )

NEI <- st_transform(NEI, st_crs(REG)$epsg) tmp <- rbind(REG , NEI) tmp <- ms_simplify(as(tmp, "Spatial"), keep = .1, keep_shapes = T) ggplot() + geom_sf(data = st_as_sf(tmp)) + theme_bw()