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

如何使用GPS轨迹数据在R中绘制流向图?新手技术求助

帮你搞定R语言GPS轨迹流向图绘制!

嘿,作为R语言新手刚接触GPS轨迹数据画流向图确实容易懵——毕竟很多示例用的是整理好的OD数据,和你手里的原始轨迹不一样,我来一步步帮你理清楚!

一、绘制流向图必备的数据集条件

流向图的核心是OD(起点-终点)数据,如果你的原始数据是连续的GPS点(每隔几秒/分钟一条记录),需要先预处理成OD格式,具体要求:

  • 核心字段:
    • 起点地理坐标:start_lon(经度)、start_lat(纬度)
    • 终点地理坐标:end_lon(经度)、end_lat(纬度)
    • 个体标识:比如user_id或device_id,用来区分不同人的移动,方便后续聚合流量
  • 可选但实用的字段:
    • 移动时间:start_time、end_time,可以按早高峰/晚高峰等时段拆分分析
    • 流量计数:如果已经聚合过相同起点-终点的移动次数,直接用count字段更高效
  • 预处理关键:把连续GPS轨迹拆分成完整出行段——比如当某个点停留超过设定阈值(比如30分钟),就把这个点作为上一段的终点、下一段的起点,这样就能把零散的轨迹转换成一条条起点到终点的OD记录

二、R语言实操步骤(从OD数据到流向图)

我用最常用的空间数据包sf和可视化包ggplot2来演示,步骤清晰易懂:

1. 安装并加载所需包

install.packages(c("sf", "ggplot2", "dplyr"))
library(sf)
library(ggplot2)
library(dplyr)

2. 准备OD数据

假设你已经把原始GPS处理成了OD格式(或者直接有现成的OD数据),结构大概是这样:

user_idstart_lonstart_latend_lonend_lat
1116.39739.908116.4539.92
2116.3839.89116.4239.91
...............

先读取数据:

od_data <- read.csv("your_od_data.csv") # 替换成你的文件路径

3. 转换为空间数据格式

把起点、终点转成空间点对象,再生成连接起点和终点的流向线:

# 转换起点和终点为sf空间点(crs=4326是WGS84坐标系,GPS数据一般用这个)
start_points <- st_as_sf(od_data, coords = c("start_lon", "start_lat"), crs = 4326)
end_points <- st_as_sf(od_data, coords = c("end_lon", "end_lat"), crs = 4326)

# 生成起点到终点的连线(流向线)
od_lines <- st_sfc(mapply(function(x, y) st_cast(st_union(x, y), "LINESTRING"),
                          start_points$geometry, end_points$geometry,
                          SIMPLIFY = FALSE))
# 把连线和原始数据绑定成sf对象
od_lines <- st_sf(geometry = od_lines, data = od_data)

4. 聚合流量(可选但推荐)

如果想展示不同起点-终点的移动人次,先聚合数据:

od_aggregated <- od_lines %>%
  group_by(start_lon, start_lat, end_lon, end_lat) %>%
  summarise(total_count = n(), .groups = "drop")

5. 绘制流向图

ggplot() +
  # 绘制流向线,线宽随流量大小变化
  geom_sf(data = od_aggregated, aes(size = total_count), color = "#2c3e50", alpha = 0.7) +
  # 标记起点(红色)和终点(绿色)
  geom_sf(data = start_points, color = "#e74c3c", size = 1.5) +
  geom_sf(data = end_points, color = "#27ae60", size = 1.5) +
  # 调整图例和标题
  scale_size_continuous(name = "移动人次") +
  labs(title = "区域人口移动流向图", x = "经度", y = "纬度") +
  theme_minimal()

小提示

如果你的原始数据还是连续GPS点,推荐用trajectories包来识别停留点、拆分出行段——这个包专门处理轨迹数据,能帮你快速生成OD格式的数据。

内容的提问来源于stack exchange,提问作者A. Quinones

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:43:39