Кажется, что проще всего превратить df
в длинный кадр данных sf.Таким образом, вы можете сгруппировать его и вызвать summarise
, чтобы объединить точки, чтобы получить многоточечную геометрию.Затем приведите его и перезагрузите CRS.
@ Spacedman подмечает, что вам нужно убедиться, что вы храните информацию вместе по строкам, поэтому я добавил столбец идентификаторов.Чтобы проиллюстрировать, что линии все еще создаются на основе их исходной группировки, я расширил набор данных, включив в него пару точек, которые дублируют значения foo и bar.
library(dplyr)
library(sf)
points1 <- data.frame(foo = c(seq(15, 75, 15), 30),
long = c(-85, -80, -78, -75, -82, -70),
lat = c(34, 36, 37, 38, 35, 30)) %>%
st_as_sf(coords = c('long', 'lat'), crs = 4326)
points2 <- data.frame(bar = c(seq(15, 75, 15), 30),
long = c(85, 80, 78, 75, 82, 70),
lat = c(30, 32, 34, 36, 38, 32)) %>%
st_as_sf(coords = c('long', 'lat'), crs = 4326)
cbind(points1, points2) -> df
df_linestring <- df %>%
mutate(id = row_number()) %>%
tidyr::gather(key, value = geometry, -id, -foo, -bar) %>%
group_by(id, foo, bar) %>%
summarise() %>%
ungroup() %>%
st_cast("LINESTRING") %>%
st_set_crs(st_crs(points1))
#> Warning: attributes are not identical across measure variables;
#> they will be dropped
plot(df_linestring["id"])