R: sf package points to multiple lines with st_cast
I think that the sf
package need to know first how you want to create the lines from your points. I mean which pair of POINT
make every LINESTRING
. In my example that was defined inside the lapply
function. Follow the reproducible and commented code below, hope that helps:
# Load library
library(sf)
# Create points data
multipoints <- st_multipoint(matrix(c(10, 10, 15, 20, 30, 30), nrow = 3, byrow = TRUE), dim = "XY")
points <- st_cast(st_geometry(multipoints), "POINT")
# Number of total linestrings to be created
n <- length(points) - 1
# Build linestrings
linestrings <- lapply(X = 1:n, FUN = function(x) {
pair <- st_combine(c(points[x], points[x + 1]))
line <- st_cast(pair, "LINESTRING")
return(line)
})
# One MULTILINESTRING object with all the LINESTRINGS
multilinetring <- st_multilinestring(do.call("rbind", linestrings))
# Plot
plot(multipoints, pch = 19, cex = 2)
plot(multilinetring[[1]], col = "orange", lwd = 2, add = TRUE)
plot(multilinetring[[2]], col = "green", lwd = 2, add = TRUE)
I have found a solution! For all of the others, which are looking for an answer as well, the way I have solved it:
# Load library
library(sf)
# create points data
m <- matrix(c(10, 10, 30, 30, 15, 20), nrow = 3, byrow = TRUE)
multipoints <- st_multipoint(m, dim = "XY")
# save ranges of coordinates
x.range <- max(m[,1]) - min(m[,1])
y.range <- max(m[,2]) - min(m[,2])
# order by greatest range
if (x.range > y.range) {
sort.id <- order(m[,1])
} else if (y.range > x.range) {
sort.id <- order(m[,2])
} else if (y.range == x.range) {
sort.id <- order(m[,2])
}
# creat lines by previous sorting and save them in the list
lines <- lapply(1:(length(sort.id)-1), function(i) {
st_linestring(rbind(multipoints[sort.id[i],], multipoints[sort.id[i+1],]))
})
# plot results
plot(multipoints)
plot(lines[[1]], col = "orange", lwd = 2, add = TRUE)
plot(lines[[2]], col = "green", lwd = 2, add = TRUE)
Nevertheless, thanks again for your help!