Return end-vertices of an sf linestring

st_cast is what you are looking for.


ls  <- st_sfc(st_linestring(rbind(c(0,0),c(0,1))),

ptns = st_cast(ls, "POINT")

mapview(ls, color = "red") + ptns

You can also cast to MULTIPOINT if you wish.


As mentioned by @Spacedman in the comments, this returns 4 points, because 2 separate linestrings with 2 vertices each are cast. If we want only 3 points, we need to set up the line to be a single linestring with 3 vertices:

ls = st_sfc(st_linestring(matrix(c(c(0,1),c(0,0),c(10,0)), 
                                 ncol = 2, byrow = TRUE)))

Then pnts = st_cast(ls, "POINT") will result in 3 points.

Edit 2:

If you only want the endpoints, then st_line_sample is what you are looking for:

ptns = st_line_sample(ls, sample = 1)

where sample is a numeric value between 0 and 1 (0 being the start point and 1 the endpoint).

If still of interest (or for those having the same question):

The package lwgeom contains the st_startpoint and st_endpoint functions that return respectively the source and target vertices of a linestring.