dissolve internal borders of polygons using st_union and group_by
On Thu, 17 Oct 2019, Marta Rufino wrote:
Hi,
I am trying to dissolve the internal borders of larger polygons (sf object)
by a grouping variable or by proximity (adjacent)
and after looking in the web I found several alternatives, but none is
doing what I wanted.
## Reproducible example:
# World map
require(rnaturalearth); require(sf)
world_map <- rnaturalearth::ne_countries(scale = 'small', returnclass =
c("sf"))
# World countries:
world_map
object.size(world_map)
# 1st alternative: in this case we have the groups by continent, but the
country boundaries are still there, although without label:
(kk <- world_map %>%
dplyr::group_by(continent) %>%
summarise())
object.size(kk)
kk %>%
st_transform(crs = 42310) %>%
ggplot()+
geom_sf()
Please state all versions:
sessionInfo()
sf_extSoftVersion()
With an updated system, most of your code just does not work for me. You
are looking for sf::aggregate():
kk <- aggregate(world_map, list(world_map$continent), head, n=1)
plot(st_geometry(kk))
shows that although the country boundaries are largely removed, the
underlying data are not properly aligned, so slivers remain, some on
continent boundaries, some as holes in land masses.
Contributions welcome to remove the artefacts.
Using tidyverse really occludes analysis here.
Note that EPSG 42310 simply does not exist in PROJ 6, it is retrievable
from:
kk1 <- st_transform(kk, crs = paste0("+proj=merc +lat_ts=0 +lon_0=0",
" +k=1.000000 +x_0=0 +y_0=0 +ellps=GRS80 +datum=WGS84 +units=m"))
plot(st_geometry(kk1))
and should never be used for obvious reasons.
kk2 <- st_transform(kk, crs=3857)
plot(st_geometry(kk2))
is not much better (Web Mercator).
Hope this clarifies,
Roger
# 2nd alternative : apparently different, but very similar... (kk1 <- world_map %>% dplyr::group_by(continent) %>% summarise(st_union(.))) object.size(kk1) kk1 %>% st_transform(crs = 42310) %>% ggplot()+ geom_sf() # 3rd alternative (kk2 <- world_map %>% dplyr::group_by(continent) %>% summarise(geom = st_union(geometry))) object.size(kk2) kk2 %>% st_transform(crs = 42310) %>% ggplot()+ geom_sf() # 4th alternative (kk3 <- world_map %>% dplyr::group_by(continent) %>% summarise(geom = st_combine(geometry))) object.size(kk3) kk3 %>% st_transform(crs = 42310) %>% ggplot()+ geom_sf() # In all cases the objects produced are actually very similar at a first glance, bur in fact they differ on the properties (as reflected by their sizes). object.size(world_map) object.size(kk1) object.size(kk2) object.size(kk3) object.size(kk4) # And more importantly, in no case the borders between countries were actually dissolved, which was my objective. So, the question is how can I get the continents with the country borders dissolved? Further, could I dissolve all contiguous borders (instead of having a grouping variable)- I saw this in a couple of posts but the answers were very complex. Any help will be greatly appreciated, Best wishes, M.
Roger Bivand Department of Economics, Norwegian School of Economics, Helleveien 30, N-5045 Bergen, Norway. voice: +47 55 95 93 55; e-mail: Roger.Bivand at nhh.no https://orcid.org/0000-0003-2392-6140 https://scholar.google.no/citations?user=AWeghB0AAAAJ&hl=en