3. 轨迹数据质量检查与清理
野外采集回来的GPS轨迹,几乎不可能“开箱即用”。手持机或手机在树冠下、峡谷里、贴近陡崖时,卫星几何构型变差,定位解会突然跳到几十米外再跳回来;设备静止休息时又会连续记录同一坐标;偶尔还会因为电量、存储或导出中断,出现时间戳缺失或间隔异常。这些问题的共同特点是:单看一行属性完全正常,只有把点连成线、把时间排成序列,异常才暴露出来。因此本节的核心不是“删点”,而是先建立一套可判断的质量标准,再在QGIS属性表中定位、筛选、修正。
一、先认识三类典型异常
漂移点表现为轨迹在真实路径两侧出现“毛刺”,相邻点距离突然增大又迅速回落,形成尖刺状折返;跳跃点更极端,一个点直接飞到数百米外,下一个点又回到原路径,往往对应失锁后重新捕获卫星的瞬间;重复点则是同一坐标(或坐标差在厘米级)被连续记录多次,常见于停留休息、午餐、等待队友时设备仍在按固定间隔打点。此外还有缺失值:经纬度为NULL、时间为空、或高程为异常负值(如-9999)。
判断异常不能只看坐标,必须结合时间属性。一个合理的经验判据是瞬时速度:用相邻两点的平面距离除以时间差,若结果远超步行或车辆的正常速度(例如徒步调查中大于5 m/s、车辆调查中大于40 m/s),该点就高度可疑。注意这是示例阈值,实际应结合调查方式、设备采样间隔和地形调整。
二、在属性表中建立检查字段
QGIS的字段计算器是质量检查的主力。打开轨迹点图层的属性表,进入编辑模式,先新增几个检查字段,再逐列计算。以下表达式均以字段名 time(日期时间型)、lat、lon 为例,实际请替换为你的字段名。
第一步,计算相邻点时间差(秒)。在字段计算器中新建 dt(整型),表达式使用 age() 或直接相减:
-- 新建字段 dt(秒),表达式:
epoch("time") - epoch(attribute(get_feature_by_id(@layer, $id - 1), 'time'))
-- 新建字段 dist(米),计算到上一点的平面距离:
distance($geometry, geometry(get_feature_by_id(@layer, $id - 1)))
-- 新建字段 speed(m/s):
"dist" / "dt"
这里有一个关键前提:点必须按时间排序。若原始记录顺序混乱,应先用“按表达式排序”或导出时按 time 升序排列,否则 $id - 1 取到的“上一点”并非时间上的前一点,速度计算会完全失真。计算完成后,把 speed 降序排列,排在最前面的就是最可疑的跳跃点。
三、筛选、定位与编辑
有了 speed 字段,就可以用属性表筛选(筛选栏输入 "speed" > 5)或“按表达式选择”把可疑点选出来。选中后建议做两件事:一是用缩放至所选要素在画布上查看这些点是否真的脱离主路径,避免把急转弯、原地掉头误判为异常;二是对照时间列,确认相邻点的时间间隔是否合理。
对确认的异常点,处理方式要分情况:跳跃点通常直接删除该点,让前后两点直接相连;漂移点若只是轻微毛刺,可删除或用相邻点坐标的平均值修正;重复点用“删除重复几何图形”工具(矢量 → 几何工具)按坐标去重,但要注意保留时间最早的一条;缺失值若经纬度为NULL则无法修复,只能删除;若仅时间为空,可依据采样间隔推算补填,并在备注字段标注“推算”。
track_raw),所有编辑在副本上进行,保留可回溯的原始数据。四、时间属性检查要点
时间检查不只是看有没有空值,还要看间隔是否均匀。把 dt 字段做一次统计(属性表底部统计面板或“基本统计”),若出现大量 dt 远大于设定采样间隔(例如设定10秒却出现300秒),说明设备曾中断记录,这段“空白”不能简单用直线连接,应作为轨迹分段处理。另外要确认时间字段的时区与格式:野外设备常记录UTC,而调查记录本用北京时间,两者相差8小时,若混用会导致速度计算出现8倍误差,这是新手最容易踩的坑。
五、一份可执行的检查清单
| 检查项 | 判断依据 | 处理动作 |
|---|---|---|
| 空坐标 / 空时间 | 字段为NULL | 删除或按采样间隔推算补填 |
| 重复点 | 相邻坐标差 < 0.5 m | 保留最早一条,其余删除 |
| 跳跃点 | speed 远超正常速度 | 删除该点 |
| 漂移毛刺 | 折返角接近180°且偏离主路径 | 删除或邻点均值修正 |
| 时间断档 | dt 远大于采样间隔 | 标记分段,不强行连线 |
| 时区一致性 | 与记录本时间比对 | 统一为同一时区再计算 |
完成上述清理后,建议再算一次总长度与点数,与清理前对比:若总长度明显缩短、点数减少但轨迹形态更贴合实际行走路线,说明清理有效。清理后的轨迹才适合进入后续的平滑、分段与成果制图环节。