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 shapefileREG
.
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()