如何按readdate顺序创建带speed属性的点间连线(sf包)
解决按时间顺序生成带属性的点间连线问题
要实现按readdate顺序在相邻点间创建连线并保留speed属性,核心是为每对相邻点单独生成线段,同时绑定对应属性。以下是两种可行方案:
基础方法(原生sf操作)
- 先确保数据按时间排序(大型数据集建议先执行,避免顺序混乱):
one_truck_sf <- one_truck_sf[order(one_truck_sf$readdate), ]
- 提取点几何并生成线段集合:
# 获取所有点的几何对象 points <- st_geometry(one_truck_sf) # 遍历相邻点对,生成每条线段 lines_list <- lapply(1:(length(points)-1), function(i) { # 将当前点和下一个点的坐标绑定,转为LINESTRING st_linestring(rbind(st_coordinates(points[i]), st_coordinates(points[i+1]))) }) # 将线段列表转为sf几何列,保留原坐标系 lines_sfc <- st_sfc(lines_list, crs = st_crs(one_truck_sf))
- 绑定属性并生成最终sf对象:
lines_sf <- st_sf( readdate_start = one_truck_sf$readdate[-nrow(one_truck_sf)], # 线段起点时间 readdate_end = one_truck_sf$readdate[-1], # 线段终点时间 speed = one_truck_sf$speed[-nrow(one_truck_sf)], # 保留起点的speed属性 id = one_truck_sf$id[-nrow(one_truck_sf)], geometry = lines_sfc )
简洁方案(dplyr管道式)
如果习惯用dplyr,可通过管道流实现更紧凑的代码:
library(dplyr) library(sf) lines_sf <- one_truck_sf %>% arrange(readdate) %>% # 确保时间顺序 mutate( # 获取下一个点的几何 next_point = lead(geometry), # 生成线段几何列 line_geom = st_sfc(lapply(1:(n()-1), function(i) { st_linestring(rbind(st_coordinates(geometry[i]), st_coordinates(next_point[i]))) }), crs = st_crs(.)) ) %>% slice(-n()) %>% # 移除最后一行(无后续点可连线) select(readdate, speed, id, geometry = line_geom) # 保留需要的属性
为什么之前的方法失效?
st_combine(one_truck_sf[1:2,]) %>% st_cast():st_combine会把多个点合并为一个MULTIPOINT对象,丢失原属性;st_cast转为LINESTRING后仅保留几何,无法关联原数据的speed。st_cast(one_truck_sf, "LINESTRING"):单个POINT对象无法直接转为LINESTRING,必须是连续的点组(或MULTIPOINT),但这种方式会把所有点连成一条完整的线,而非相邻点间的多条线段,不符合需求。
内容的提问来源于stack exchange,提问作者Pep
相关产品推荐
相关产品推荐

