The goal of sfarc.node is to extract unique shared boundaries (arcs) from sf polygons as sf lines.
You can install the dev version of sfarc.node from Github with:
remotes::install_github("mdsumner/sfarc.node")
This shows examples of getting these shared boundaries. The feature id/s (the row number/s) from which each boundary came are listed in a list column, so that we can look up the original polygon/s for each arc. (There should be 1, or possibly 2 but results may vary wildly with unclean data).
library(sfarc.node) f <- system.file("gpkg/nc.gpkg", package = "sf", mustWork = TRUE) sfx <- sf::read_sf(f) arcs <- sf_arcnode(sfx) plot(arcs["arc"], col = sample(hcl.colors(nrow(arcs))))
We can get the original polygon id/s for a given boundary.
s <- sample(seq_len(dim(arcs)[1L]), 1L) plot(sfx[arcs$feature_ids[[s]]$row, "geom"], reset = FALSE, col = c("grey", "grey10")) plot(arcs[s, 1], add = TRUE, col = "hotpink2", lwd = 6)
plot(sfx$geom, col = sample(grey.colors(10), 100, replace = TRUE), reset = FALSE) plot(dplyr::sample_n(arcs[1], 20), col = "hotpink2", lwd = 6, add = TRUE)
Works fine with more intensive data.
xx <- ozmaps::abs_ced arx <- sf_arcnode(xx) idx <- which(unlist(lapply(arx$feature_ids, function(.x) length(.x$row) > 1))) s <- idx[1] plot(xx[arx$feature_ids[[s]]$row, "geometry"], reset = FALSE, col = c("grey", "grey10")) plot(arx[s, 1], add = TRUE, col = "hotpink2", lwd = 4)
for (j in 1:6) { par(mfrow = c(5, 5), mar = rep(0, 4)) for (i in 1:25) { s <- sample(idx, 1) plot(xx[arx$feature_ids[[s]]$row, "geometry"], reset = FALSE, col = grey(c(0.8, 0.5))) plot(arx[s, 1], add = TRUE, col = "hotpink1", lwd = 4) } }
Please note that the sfarc.node project is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.