library(sf)
## Linking to GEOS 3.6.1, GDAL 2.2.3, proj.4 4.9.3
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(silicate)
library(ggplot2)
system.time({
d <- st_coordinates(inlandwaters) %>% tibble::as_tibble() %>%
mutate(vertex_ = row_number(), path_ = paste(L1, L2, L3, sep = "-")) %>%
group_by(path_) %>% mutate(row_per_path = row_number()) %>% ungroup()
## sf L1/L2/L3 are backwards (L3 only in multipolygon, but it's the feature there)
## here the vertex-within-group-thing needs to be fixed
segs <- d %>% select(-X, -Y, -L3, -L2, -L1, -vertex_, -row_per_path) %>% # drop geometry and hierarchy components
group_by(path_) %>% # group by path hierarchy
mutate(.vx0 = row_number(), ## specify in segment terms
.vx1 = row_number() %% n() + 1L) %>%
slice(-n()) %>% ## now drop final closing (polygon only)
ungroup() %>% mutate(edge_ = row_number())
g <- segs %>% #dplyr::select(-path_) %>%
tidyr::gather(node_, vertex_, -edge_, -path_) %>%
inner_join(d %>% dplyr::select(X, Y, row_per_path, path_), c("vertex_" = "row_per_path", "path_" = "path_")) %>%
dplyr::select(-vertex_) %>%
tidyr::gather(coord, val, -edge_, -node_, -path_) %>%
transmute(path_, edge_, val, .v = paste(node_, coord, sep = '')) %>%
tidyr::spread(.v, val) %>%
ggplot() +
geom_segment(aes(.vx0X, .vx0Y, xend = .vx1X, yend = .vx1Y, colour = path_)) +
guides(colour = FALSE)
print(g)
})

## user system elapsed
## 1.20 0.36 1.58
system.time({plot(SC(inlandwaters))})

## user system elapsed
## 1.29 0.33 1.62