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) %>% # drop geometry and hierarchy components
mutate(.vx0 = vertex_, ## specify in segment terms
.vx1 = vertex_ + 1L) %>%
group_by(path_) %>% # group by path hierarchy
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, vertex_), "vertex_") %>%
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.33 0.30 1.62
system.time({plot(SC(inlandwaters))})

## user system elapsed
## 1.20 0.37 1.58