mcpField
M
movement-trajectory

movement-trajectory

github.com/muend数据与数据库3755 次安装2 周前更新
代码仓库

关于 movement-trajectory

将带时间戳的位置点转化为经过验证的行程、停留点和汇总模式的移动分析技能。重点关注采样质量、坐标与时间处理、结果验证及隐私保护。

主要功能

  1. 01分析采样间隔与轨迹质量
  2. 02清理位置点并按时间间隔分段
  3. 03检测停留点并提取行程
  4. 04支持道路网络地图匹配
  5. 05汇总移动数据并实施隐私控制

适用场景

  1. 01速度分析前清理 GPS 轨迹
  2. 02从车队轨迹中汇总停留与行程
  3. 03创建注重隐私的移动流向地图

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/muend/geoai-skills --skill movement-trajectory

安装后在 Claude Code 中输入/movement-trajectory确认已加载。

附带文件agents/openai.yamlreferences/authoritative-sources.md

详细介绍

轨迹与移动分析

目的:将带有时间戳的嘈杂点位转化为可靠的移动事实。反复出现的问题包括:在 GPS 噪声中计算速度(点位跳跃 → 行人速度达到 400 km/h)、信号漂移导致凭空生成停留,以及不顾隐私地交付个人级轨迹。

先定义数据模型

一条轨迹 = 每个对象按顺序排列的定位点:(object_id, timestamp, x, y, [accuracy, ...])。分析前,按对象报告:定位点数量、时间跨度、采样间隔中位数和间隔分布——采样率决定每种方法的选择(1 秒一条的车辆轨迹和每小时 1 个定位点的动物标签,是两个披着相同模式外衣的不同问题)。

import movingpandas as mpd
import geopandas as gpd

gdf = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df.lon, df.lat),
                       crs=4326).to_crs(gdf_utm_epsg)
tc = mpd.TrajectoryCollection(gdf, "object_id", t="timestamp")
设定任何阈值前,先声明 CRS 和时间基准

在回答中、使用数值前说明以下两点,否则此技能中的每个距离半径、速度限制和停留时长都毫无意义:

  1. 所有距离和速度计算所使用的投影 CRS——将“50 m 停留半径”应用于原始经纬度会得到毫无意义的结果,误差还会随纬度变化。请注明 CRS(本地车队可使用 estimate_utm_crs(),大陆范围则使用等距投影)。
  2. 时间戳基准,并将其标准化为带时区的 UTC。车队日志混杂了本地时间、DST 切换和无时区字符串;跨越 DST 边界的停留可能多出或少掉一小时,导致停留时长悄无声息地出错。

请在提出半径或时长前说明这两点,而不是事后才将其作为注意事项。

声明不等于搁置。 CRS 或时区未知,绝不能成为停止作答并反过来提问的理由。请将其作为明确、具体的假设说明,并继续给出方法:

假设距离计算使用本地 UTM 分区,且时间戳为需要标准化为 UTC 的无时区本地时间——请确认这两点,因为它们会改变停留时长。

然后给出清理步骤、参数和敏感性检查。若回答只询问 CRS、时区或文件,而没有给出方法,即使问题问得很好,也不符合此技能要求。可以在回答的同时提问,但绝不能以提问代替回答。绝不要悄悄将无时区时间戳视为 UTC——这里的关键是“悄悄”:明确标注并说明的假设,正是我们需要的做法。

清理流程(按顺序)

  1. 去重相同的(对象、时间戳)定位点。
  2. 精度过滤:如果存在 HDOP/精度列,则删除超过阈值的定位点(报告阈值和删除比例)。
  3. 速度过滤:删除推算速度不符合出行方式实际情况的定位点(持续步行速度 > 15 km/h、汽车速度 > 200 km/h……);迭代处理——一个错误定位点会产生两个错误路段(mpd.OutlierCleaner)。
  4. 按间隔拆分:在时间间隔过长处拆分轨迹(例如 > 中位间隔的 5 倍)——跨越隧道或断电时段进行插值会凭空编造移动。
  5. 可选的平滑处理(卡尔曼滤波/滚动中位数),用于抖动严重的城市峡谷数据——必须在剔除异常值后进行,且绝不能早于停留检测参数调优。

每个步骤都记录数量:输入定位点 → 输出定位点。

停留与行程

停留 = 空间范围内的驻留:在最短持续时间内,定位点都位于某个距离半径内(mpd.TrajectoryStopDetector(max_diameter=50, min_duration=timedelta(minutes=5)))。这两个参数就是分析结果——请报告参数,并进行 ±50% 的敏感性检查;城市峡谷中的漂移会伪装成移动,因此直径小于 GPS 噪声水平时,检测到的停留数会为零。

行程 = 停留点之间的路段。每条行程需提供:起点、终点、开始/结束时间、持续时间、长度,以及适用时的主要出行方式推测。OD 矩阵:将行程起终点聚合到区域(参见下方隐私说明);对于所得流量的可达性问题 → network-accessibility-analysis。

地图匹配

原始 GPS 轨迹并不贴合道路。对于任何以道路为参照的结论(行驶距离、街道级流量、超速),请先匹配到道路网络:

  • 工具:Valhalla (Meili)、OSRM match 或 mappymatch;基于 HMM 的匹配器是标准做法。
  • 采样间隔超过约 30 s 会显著降低匹配效果——请报告匹配置信度和未匹配点的百分比;不要悄悄保留未匹配的几何数据。
  • 绝不要对动物轨迹或越野移动进行地图匹配(显然如此);也不要根据原始含噪定位点计算“行驶距离”(噪声会使路径长度增加约 5-20%);应先平滑处理,并说明所用方法。

聚合分析

  • 流量图/期望线:绘图前先聚合 OD 对(用于交付时可使用 cartography-geoviz);避免线团的做法是按区域聚合并设置最小流量阈值。
  • 密度:使用定位点或行程的 KDE 或六边形分箱——定位点会使缓慢移动的权重偏高(停留期间会产生许多定位点);应使用基于行程或按时间加权的密度,并说明采用了哪种方法。
  • 时空聚类(共同出现、车队):使用 ST-DBSCAN 系列方法;空间和时间的聚类参数需同时报告。
  • 序列/周期性:在提出任何行为结论前,先按对象类别构建“星期几 × 小时”的活动矩阵。

隐私——不可妥协

在几乎所有地方,个人轨迹都属于个人数据(GDPR 等),而且极易被重新识别(居住地/工作地锚点对可以识别大多数人)。默认做法:分享前先聚合(区域内对象数 ≥ k,抑制对象数 < k 的单元格,典型 k=5-10),在住家附近截断行程终点,未经明确许可绝不发布个人原始轨迹。每项交付内容都应说明采用的匿名化措施。

验证流程

  1. 清理后按出行方式绘制速度直方图——尾部必须符合物理实际。
  2. 在底图上绘制 3 条样本轨迹(原始、清理后、匹配后)。
  3. 停留点检测敏感性:将参数调整 ±50%,报告停留点数量变化。
  4. 核对 OD 总量与行程数量(会计核对)。

常见问题检查清单

  • 跨越时间间隔或经过异常定位点计算速度。
  • 根据原始(未平滑、未匹配)定位点计算行驶距离。
  • 检测停留点时使用的半径小于 GPS 噪声范围,或将漂移计为行程。
  • 混用时区/DST 跳变造成虚假的瞬移。
  • 将定位点密度图误读为移动密度图。
  • 未经聚合/抑制就交付个人轨迹。
  • 按对象拆分轨迹,却未按时间间隔拆分。

执行约定

  • 工作流: 验证标识符、时间和 CRS;分段轨迹;移除不可能的定位点;推断停留点或行程;可选地进行地图匹配;聚合;应用隐私控制;验证。
  • 决策规则: 对观测到的带时间戳移动使用轨迹方法;对可能的路线或可达性使用网络分析;在缺少序列和身份信息时使用点模式方法。
  • 验证流程: 检查速度和时间间隔分布,在地图上查看原始与清理后的样本,调整停留点参数,核对行程和 OD 数量,并审查信息泄露风险。
  • 失败模式: 遇到时区歧义、较长时间间隔、不合理速度、网络匹配效果差、采样稀疏或重新识别风险时,应抑制或限定结论。
  • 交付物: 清理后的轨迹或经批准的聚合数据、分段规则、质量报告、派生的停留点/行程表、隐私处理说明、地图和局限性。
  • 来源时效性: 使用格式、库或隐私指南前,请查阅权威来源注册表,并记录查阅日期。

评论

支持 Markdown