You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按readdate顺序创建带speed属性的点间连线(sf包)

解决按时间顺序生成带属性的点间连线问题

要实现按readdate顺序在相邻点间创建连线并保留speed属性,核心是为每对相邻点单独生成线段,同时绑定对应属性。以下是两种可行方案:

基础方法(原生sf操作)

  1. 先确保数据按时间排序(大型数据集建议先执行,避免顺序混乱):
one_truck_sf <- one_truck_sf[order(one_truck_sf$readdate), ]
  1. 提取点几何并生成线段集合:
# 获取所有点的几何对象
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))
  1. 绑定属性并生成最终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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 18:23:30