gpspathtransfigure
v2.0.2
Published
Designed specifically for rendering trajectories of GPS points reported by devices. Optimize GPS coordinate trajectory. Calculate stop points, stay time, exercise time, mileage and other information.
Readme
GpsPathTransfigure
面向设备上报 GPS 轨迹的优化与结构化建模库。内置停留点时空建模(区间检测 + 密度聚类 DBSCAN)、鲁棒统计异常检测(IQR)与轨迹分段等算法链路,用于把原始轨迹点转成可直接用于地图渲染、停留分析、轨迹回放和统计计算的结果数据。
适用场景
- 轨迹回放:外勤、物流、巡检、车辆历史轨迹回放。
- 停留分析:停留点识别、停留时长统计、驻留行为分析。
- 质量增强:抖动过滤、异常跳点处理、轨迹切段与拼接。
- 业务建模:按运动段/停留段输出结构化
segmentInfo,可直接用于报表和明细卡片。
使用前提与输入要求
- 输入点位字段建议为:
[{ lng, lat, currentTime, p? }]。 - 时间字段必须可被
moment按timeformat正确解析(默认YYYY-MM-DD HH:mm:ss)。 - 点位应按时间升序传入,避免无序数据影响停留建模与速度计算。
- 建议至少提供 10 个以上点位,过短轨迹不利于稳定识别。
- 如果启用
smoothness,需配置aMapKey或gMapKey,并评估地图 API 成本。
入参 p 扩展载荷
设备可在每个 GPS 点附带字段 p:一段 14 位十六进制字符串(7 字节,大端序),用于携带速度、方向与定位质量信息。库在 optimize 入口会通过 normalizeGpsPointsWithPayload 自动解析,并合并为点上的 rawSpeed、rawDirection、hdop、vdop、satelliteCount 等字段,供低速候选、**运动反证(质量门控)**等逻辑使用。
| 字节序 | 十六进制宽度 | 存储方式 | 解码后字段 | 说明 |
| --- | --------- | ------------ | ---------------- | ------------------ |
| 1–2 | 4 位(2 字节) | 速度 ×10,转十六进制 | rawSpeed | 解码值 ÷10,单位 km/h |
| 3–4 | 4 位(2 字节) | 方向 ×10,转十六进制 | rawDirection | 解码值 ÷10,单位度(0–360) |
| 5 | 2 位(1 字节) | 整数转十六进制 | hdop | 水平精度因子 |
| 6 | 2 位(1 字节) | 整数转十六进制 | vdop | 垂直精度因子 |
| 7 | 2 位(1 字节) | 整数转十六进制 | satelliteCount | 卫星数量 |
编码步骤(与库内 parseGpsExtraPayload 一致)
- 将速度、方向分别乘以 10 后,按无符号 16 位整数写成 4 位十六进制(不足左侧补
0)。 - 将
hdop、vdop、satelliteCount各写成 2 位十六进制(单字节,0–255)。 - 按上表顺序拼接为总长 14 位 的字符串(可带或不带
0x前缀,库会去掉前缀并校验长度)。
示例
业务值:速度 10 km/h,方向 357°,hdop=2,vdop=3,卫星数 16。
| 字段 | 计算 | 十六进制段 |
| ---- | --------------- | ------ |
| 速度 | 10 × 10 = 100 | 0064 |
| 方向 | 357 × 10 = 3570 | 0DF2 |
| hdop | 2 | 02 |
| vdop | 3 | 03 |
| 卫星数 | 16 | 10 |
拼接结果:p = "00640DF2020310"。
传入示例:
{
lng: 116.21215,
lat: 34.232906,
currentTime: "2026-04-27 00:01:35",
p: "00640DF2020310"
}解析失败(缺字段、长度不是 14、非法十六进制)时,该点相关扩展字段为 null,pParseOk 为 false,停留主流程仍可继续,但依赖 p 的低速/反证能力会减弱。
常见异常占位(仅卫星有效):部分轨迹仅上报卫星数,hex 形如 00000000000015(前 12 位全 0,末 2 位为卫星数)。此类点解码后 rawSpeed=0 且 pParseOk 仍可能为 true,不能单靠解析成功与否判断载荷是否可用;库会在 optimize 内按占位模式自动降级(见下文「p 载荷异常与运行期降级」)。
插件使用
安装
npm install gpspathtransfigure引用
import GpsPathTransfigure from "gpspathtransfigure"快速开始(最小闭环)
import GpsPathTransfigure from "gpspathtransfigure";
GpsPathTransfigure.conf({
locale: "zh",
openDebug: false,
pathColorOptimize: true,
});
const result = await GpsPathTransfigure.optimize(gpsPoints);
const { finalPoints, trajectoryPoints, stopPoints, segmentInfo } = result;输出如何落图
finalPoints:适合直接画主轨迹线(已完成停留建模和异常处理)。trajectoryPoints:适合按速度颜色渐变渲染轨迹。stopPoints:适合做停留标注、停留卡片、停留时长展示。segmentInfo:适合做“运动段/停留段”时间轴与明细列表。
效果预览(重点)
A. 静止 + 高频抖动(3 组样本)
目标:在静止场景中抑制高频漂移,稳定识别停留段,减少“原地乱跳”。
静止高频抖动样本1 静止高频抖动样本2 静止高频抖动样本3
B. 行驶 + 少量抖动(3 组样本)
目标:在行驶轨迹中保留运动形态,减少轻微抖动对轨迹平滑性和里程统计的干扰。
行驶低噪样本1 行驶低噪样本2 行驶低噪样本3
核心功能特性
- 停留点时空建模:基于方向漂移特征识别停留候选区间,并通过**时长阈值 + 区间合并(距离/时间间隔)**稳定停留段。
- 上报间隔 Δt 自适应(可选):自动估计相邻点主上报间隔,并按 Δt 动态换算
windowSize/startStreak/endStreak/minFallbackSampleSize,使“点数参数”在不同采样频率下保持相近的时间尺度(见下文「Δt 动态参数适配」)。 - p 载荷异常自动降级:当
p缺失或「仅卫星占位」占比过高时,本次optimize自动关闭低速候选与运动反证,仅保留方向漂移主通道(见下文「p 载荷异常与运行期降级」)。 - 时空聚类二次判定:对停留候选区间做**密度聚类(DBSCAN)**与密度评分,释放低密度误判区间(更抗抖动/漂移)。
- 轨迹鲁棒降噪:包含原始噪声过滤、**IQR(四分位距)**异常跳点识别与处理(剔除毛刺/降低里程失真)。
- 轨迹分段:输出
motion/stopped结构化分段,支持业务端直接消费。 - 渲染增强:支持按速度分级着色轨迹输出,提升回放可读性。
- 轨迹补偿:可选调用地图服务做轨迹补点(
smoothness)。 - 统计指标:输出
avgSpeed、moveAvgSpeed、totalMileage、trajectoryMileage。
算法与建模流程
optimize 的主流程为:噪声过滤 -> Δt 估计 -> p 载荷质量评估(可选降级) -> 停留区间观测(可带 Δt 动态参数) -> 停留替换建模 -> 里程速度计算 -> 可选补偿 -> 异常剔除/切段 -> 轨迹拼接 -> 分段输出。
flowchart TD
inputGps[InputGpsPoints] --> noiseFilter[NoiseRecognitionFilter]
noiseFilter --> estimateDt[EstimateDeltaT]
estimateDt --> assessPayload[AssessGpsPayloadQuality]
assessPayload --> driftObserve[DirectionDriftObserve]
driftObserve --> stopModel[StopIntervalModeling]
stopModel --> mileageSpeed[SpeedAndMileageCalc]
mileageSpeed --> smoothnessOpt[OptionalSmoothness]
smoothnessOpt --> iqrRemove[IQRSpikeRemoval]
iqrRemove --> iqrSplit[IQRTrajectorySplit]
iqrSplit --> mergeSegments[MergeSegments]
mergeSegments --> segmentInfo[GenerateSegmentInfo]
segmentInfo --> outputs[FinalOutputs]关键建模说明
- 停留识别主参考:
observeStopPointDirectionDrift的mergedDriftIntervals(先产出候选candidate interval,再做区间后处理)。- 第一层:候选区间识别(candidate interval detection):主通道为方向漂移(相邻向量夹角 + 窗口特征 + 阈值策略),对“原地抖动、来回跳点”较敏感。
- 低速候选信号(low-speed signal):窗口内原始速度(来自
p)长期偏低且低速占比高时,也可进入候选区间,用于补齐“角度不怎么抖但速度接近 0”的真实停留。 - 第二层:运动反证(motion rebuttal):候选区间若呈现“速度持续偏高 + 速度/方向稳定 + 质量门控通过”,则释放为运动段,降低拐弯/慢行/稳定行驶被误判为停留的概率。
- 时空约束的停留建模:区间会应用最小时长(分钟级)约束,并支持按空间距离阈值 + 时间间隔阈值做区间合并,减少断断续续的停留碎片。
Δt 动态参数适配
不同设备上报频率差异很大(例如 30 秒、1 分钟、3 分钟)。若漂移观测里的 windowSize、startStreak、endStreak、minFallbackSampleSize 始终按“点数”写死,等价时间尺度会随采样间隔成倍变化,容易出现“短轨迹失真、长轨迹才好用”的问题。
开启 driftObserveUseDeltaTAdaptiveParams: true 后,optimize 会:
- 用
estimateDeltaTSeconds从轨迹相邻currentTime估计主上报间隔 Δt(秒)(剔除长断档等异常间隔,控制台输出[Δt估计])。 - 将静态配置中的上述四个点数参数,按 30 秒参考间隔 反推其“分钟语义”,再按实际 Δt 换算回点数(控制台输出
[Δt动态参数],含temporalAdaptationMeta)。
| 静态配置(点数) | 动态化后含义(约) |
| ----------------------------------- | ----------------------------------------------- |
| driftObserveWindowSize | 滑动窗口覆盖时长 ≈ windowSize × 30s |
| driftObserveStartStreak | 进入区间确认时长 ≈ startStreak × 30s |
| driftObserveEndStreak | 退出区间确认时长 ≈ endStreak × 30s |
| driftObserveMinFallbackSampleSize | fallback 最小样本时长 ≈ minFallbackSampleSize × 30s |
示例:静态 windowSize=30 表示约 15 分钟窗口;若估计 Δt≈181s(约 3 分钟/点),运行期 windowSize 会约为 round(15×60/181)≈5,避免窗口覆盖整段短轨迹。
关闭开关时行为与旧版一致,始终使用 config 中的静态点数,不进行 Δt 换算。
p 载荷异常与运行期降级
部分轨迹中的 p 大量为 000000000000XX 异常占位:速度、方向、hdop、vdop 均为 0,仅最后一字节卫星数有效。若仍开启依赖 p 的增强层,会出现:
- 低速候选:
rawSpeed=0被当成低速,窗口内低速占比虚高,误增停留候选; - 运动反证:速度/方向/质量字段不可信,反证结论失真。
因此在调用 observeStopPointDirectionDrift 之前,库会用 assessGpsPayloadQuality 统计整段轨迹的 p 异常占比,并按结果对本次运行做开关覆写(不写回全局 config 默认值)。
失效点判定(满足任一即计为 invalid)
| 类型 | 条件 |
| -- | -- |
| p 缺失 | 无 p 或空字符串 |
| 仅卫星占位 | 14 位 hex 匹配 ^000000000000[0-9A-F]{2}$(如 00000000000015) |
轨迹级降级
invalidRatio = invalidCount / totalPoints- 当
invalidRatio >= driftObservePayloadDegradeInvalidRatioThreshold(默认 0.5)时,shouldDegrade = true - 本次运行强制:
driftObserveLowSpeedCandidateEnabled = false、driftObserveMotionRejectEnabled = false - 不关闭方向漂移主通道、DBSCAN 密度二次判定、时长/合并等规则(与全局配置一致)
为何不只用 pParseOk
占位串解码后速度为 0 仍可能 pParseOk: true,无法区分「真停车速度 0」与「未上报运动字段」;故用 hex 占位模式作主判据。
控制台日志(每次 optimize)
[p载荷质量]:missingPCount、satOnlyPlaceholderCount、invalidRatio、threshold、shouldDegrade[p载荷降级开关]:配置默认值 vs 本次运行期lowSpeedCandidateEnabled/motionRejectEnabled停留点输出形式:停留区间点集会被替换为一个**地理质心(centroid)**点,并携带
startPosition/endPosition/startTime/endTime/stopTimeSeconds等停留语义字段。密度聚类二次判定:对每个候选区间内的点做 DBSCAN 并计算密度分数,低于阈值则释放为普通点(避免把“漂移但不集中”的点误判为停留)。
异常毛刺处理:通过 IQR 检测极端跳点,执行剔除或切段,降低里程与速度的系统性偏差。
配置参数(按代码实现整理)
1) 基础与格式化
| 参数 | 类型 | 默认值 | 说明 |
| ------------------- | --------- | --------------------- | ---------------- |
| distanceThreshold | Number | 35 | 距离阈值(米) |
| format | Boolean | true | 是否格式化里程/时间文案 |
| locale | String | zh | 国际化语言 |
| timeformat | String | YYYY-MM-DD HH:mm:ss | 时间解析格式 |
| mapWidth | Number | 1024 | 地图宽度(用于计算 zoom) |
| mapHeight | Number | 768 | 地图高度(用于计算 zoom) |
| defaultZoom | Number | 16 | zoom 回退值 |
| useUniApp | Boolean | false | 是否使用 uniapp 请求方式 |
| openDebug | Boolean | false | 是否输出调试日志 |
2) 异常识别与统计
| 参数 | 类型 | 默认值 | 说明 |
| --------------------------- | --------- | ------ | -------------------- |
| abnormalPointRatio | Number | 0.05 | 异常点占比阈值,超过时判定异常识别不适用 |
| IQRThreshold | Number | 2.5 | 里程异常 IQR 阈值 |
| speedIQRThreshold | Number | 0.75 | 速度异常 IQR 阈值 |
| limitSpeed | Number | 150 | 速度上限(km/h) |
| proximityStopThreshold | Number | 45 | 近距离停留阈值(米) |
| proximityStopTimeInterval | Number | 60 | 近距离停留时间阈值(分钟) |
| proximityStopMerge | Boolean | true | 近距离停留点合并(兼容保留) |
3) 轨迹补偿(可选)
| 参数 | 类型 | 默认值 | 说明 |
| ------------------------- | --------- | ------- | ---------------------- |
| smoothness | Boolean | false | 是否启用轨迹补偿 |
| smoothnessAvgThreshold | Number | 1.6 | 点距超过均值倍数时触发补偿候选 |
| smoothnessLimitAvgSpeed | Number | 40 | 启用补偿的平均速度上限(km/h) |
| aMapKey | String | '' | 高德地图 key |
| gMapKey | String | '' | Google 地图 key |
| defaultMapService | String | '' | 强制地图服务:amap / gmap |
4) 轨迹渲染
| 参数 | 类型 | 默认值 | 说明 |
| ------------------- | --------- | -------- | --------- |
| pathColorOptimize | Boolean | true | 是否开启按速度着色 |
| speedColors | Array | 24 级颜色数组 | 速度由慢到快的色阶 |
| samplePointsNum | Number | 200 | 输出抽样点数量上限 |
5) 漂移观测(停留建模核心参数)
| 参数 | 默认值 | 含义 |
| ------------------------------------------------------------ | --------------- | ---------------------------------------------------------------------------------- |
| driftObservePayloadDegradeInvalidRatioThreshold | 0.5 | p 异常点占比阈值:p 缺失或 000000000000XX 占位占比 >= 该值时,本次运行关闭低速候选与运动反证 |
| driftObserveUseDeltaTAdaptiveParams | false | 是否按估计 Δt 动态换算 windowSize / startStreak / endStreak / minFallbackSampleSize |
| driftObserveWindowSize | 30 | 漂移观测窗口大小(点数;开启动态化时按分钟语义换算) |
| driftObserveStartStreak / driftObserveEndStreak | 5 / 10 | 进入/退出区间连续命中点数 |
| driftObserveHighQuantile / driftObserveLowQuantile | 0.80 / 0.30 | 分位阈值 |
| driftObserveBandRatioMin / driftObserveSpreadMin | 0.35 / 0.35 | 分布退化判据 |
| driftObserveAbsHighScore | 1.2 | 高分绝对线 |
| driftObserveAbsMedianScoreMin | 0.7 | 中位数门控 |
| driftObserveHighScoreRatioTrigger | 0.4 | 高分占比门控 |
| driftObserveMinFallbackSampleSize | 30 | fallback 最小样本保护(点数) |
| driftObserveAbsAngleHigh / driftObserveAbsAngleLow | 60 / 35 | 固定角度 fallback 阈值 |
| driftObserveMergeDistanceThresholdMeters | 70 | 区间合并距离阈值(米) |
| driftObserveMergeGapMaxMinutes | 30 | 区间合并时间间隔阈值(分钟) |
| driftObserveMinStopDurationMinutes | 15 | 最短停留时长阈值(分钟) |
| driftObserveGpsEndTrim | 10 | 停留区间映射到 GPS 索引时,末端向前裁剪点数 |
| driftObserveDensityScoreEnabled | true | 是否启用 DBSCAN 密度二次判定 |
| driftObserveDensityEpsMeters / driftObserveDensityMinPts | 15 / 8 | DBSCAN 核心参数 |
| driftObserveDensitySampleTriggerCount | 200 | 密度观测触发采样阈值 |
| driftObserveDensityMaxPoints | 300 | 密度观测最大点数 |
| driftObserveDensityScoreThreshold | 0.6 | 密度分数释放阈值 |
| driftObserveLowSpeedCandidateEnabled | true | 第一层:是否启用低速候选(low-speed signal)参与停留候选区间识别 |
| driftObserveLowSpeedThresholdKmh | 5 | 第一层:低速阈值(km/h),原始速度 <= 该值视为低速点(依赖 p) |
| driftObserveLowSpeedRatioThreshold | 0.65 | 第一层:窗口内低速点占比阈值,达到后命中低速候选 |
| driftObserveMotionRejectEnabled | true | 第二层:是否启用运动反证(motion rebuttal),命中则释放候选区间为运动段 |
| driftObserveMotionRejectMedianSpeedKmh | 8 | 第二层:区间原始速度中位数 >= 该值才可能触发反证 |
| driftObserveMotionRejectStableSpeedMaxMadKmh | 2 | 第二层:速度稳定性门控(MAD <= 阈值) |
| driftObserveMotionRejectStableDirectionMaxMadDeg | 20 | 第二层:方向稳定性门控(环形 MAD <= 阈值) |
| driftObserveMotionRejectGoodHdopMax | 3 | 第二层:质量门控(quality gate)- hdop 上限 |
| driftObserveMotionRejectGoodVdopMax | 5 | 第二层:质量门控(quality gate)- vdop 上限 |
| driftObserveMotionRejectMinSatelliteCount | 6 | 第二层:质量门控(quality gate)- 卫星数下限 |
| driftObserveMotionRejectQualityRatioThreshold | 0.7 | 第二层:区间内“好质量点”占比阈值,达到才允许触发反证 |
兼容保留参数(旧逻辑,不建议新项目依赖)
minComparisonPoints、distanceThresholdPercentage、stationaryEndPoints、limitStopPointTime、autoOptimize、autoOptimizeMaxCount。
使用案例(Vue3)
<script setup>
import { onMounted } from "vue";
import GpsPathTransfigure from "gpspathtransfigure"
......
onMounted(async ()=>{
var gpsPoint =[
......
{lon: 14.3908478, lat: 38.3038816, currentTime: '2024-06-27 01:43:36'},
{lon: 114.3908478, lat: 38.3038816, currentTime: '2024-06-27 01:46:35'},
{lon: 114.3906792, lat: 38.3037608, currentTime: '2024-06-27 01:47:50'},
{lon: 114.3906634, lat: 38.3037528, currentTime: '2024-06-27 01:47:55'},
......
]
GpsPathTransfigure.conf({
locale:'zh',
aMapKey:webApiKey,
defaultMapService:'amap',
openDebug:false,
pathColorOptimize:true,
samplePointsNum:300
})
const staticPoints = await GpsPathTransfigure.optimize(pathParam);
const { finalPoints, stopPoints,trajectoryPoints, center, zoom ,segmentInfo,startPoint,endPoint,samplePoints} = staticPoints;
......
}
......
</script>请注意,在使用此插件时需要异步引用。代码中直接使用finalPoints渲染轨迹即可。若想要渲染停留点标注效果,则渲染所有的stopPoints。渲染带颜色的轨迹请使用trajectoryPoints渲染。高德地图和Google地图的渲染案例请查阅Amap.vue/Gmap.vue源码
进度条使用方法
<template>
......
<ProgressChart :locale="locale" :data="playPoints" :onMove="handleMove" :setPosition="playPosition" sliderImage="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAASBJREFUaEPtltENgkAQRO/q0H6oRNsQ29BK6EfrwGBi4gey9zIsCXH85bG3s7NyU8vOf3Xn/RcLOJ6HfhzLZXKy1nJ93Lp+yVXKRxsiOfDdzOegJRGUj5p/D60F+sUcTsM49+x572brUr6lt/8WQFeC8ukOTAfQPyXlIxHSCkXFt3huAVtMeekMO2AHxAnIK0Q/i5SP9EkC6MVE+ah5ZyEaziif7gBdCcqnC3AWahlxwEhfoRXOl0tYgDxCsYAdEAcovy47QLMN5SOFkgB6MVE+at5ZiGYbyqc7QFeC8ukCnIVaRuwstMKUMktI90BmY621LaB1Ulmc7ADNNpSPhEsC6MVE+ah5ZyGabSif7gBdCcqnC3AWahmxs9AKU8os8QK/SiBAyMIBIAAAAABJRU5ErkJggg==" />
......
</template>
<script setup>
import ProgressChart from 'gpspathtransfigure/src/component/ProgressChart.vue';
//国际化语言 en/zh(default)
let locale = 'en'
//用于可播放的轨迹点
let playPoints = []
//播放位置。这里是轨迹点的下标。修改后可反响控制进度条进度
let playPosition = ref(0)
/**
* 拖动进度条时的回调。
* @param {*} index 轨迹下标
*/
const handleMove = (index) => {
//在这里处理回调。index是轨迹数据下标
};
</script>项目中Amap.vue有完整的使用案例
返回值说明
| 字段 | 含义 | 主要用途 |
| ------------------------- | ------------------- | --------- |
| turnAngleSeries | 角度漂移观测序列(调参与分析用) | 停留识别调试 |
| finalPoints | 优化后的轨迹主点集(包含停留建模结果) | 主轨迹渲染 |
| trajectoryPoints | 按速度拆分后的着色轨迹片段 | 渐变轨迹渲染 |
| stopPoints | 停留点集合(含起止时间与停留时长) | 停留标注、停留统计 |
| center | 轨迹中心点 | 地图初始化 |
| zoom | 自动计算的缩放级别 | 地图初始化 |
| segmentInfo | 运动段/停留段结构化信息 | 行程卡片、明细报表 |
| startPoint / endPoint | 轨迹起终点 | 起终点标注 |
| samplePoints | 固定数量抽样点 | 轨迹预览/缩略图 |
| avgSpeed | 全时段平均速度(含停留) | 总览统计 |
| moveAvgSpeed | 仅运动段平均速度 | 运动效率分析 |
| totalMileage | 总里程(含补点/虚线连接影响) | 总览统计 |
| trajectoryMileage | 真实轨迹里程(不含虚线连接) | 真实里程统计 |
调试与可视化说明
开启 openDebug: true 时,控制台会输出停留建模相关日志;若已接入 Δt 估计,还会看到:
[Δt估计]:主上报间隔、样本量、inlier/outlier 等。[Δt动态参数]:driftObserveUseDeltaTAdaptiveParams开关状态,以及静态/动态四点数参数对照(temporalAdaptationMeta)。[p载荷质量]/[p载荷降级开关]:p 异常占位占比、是否触发降级、运行期低速/反证开关(见「p 载荷异常与运行期降级」)。
debuggingMode.png:停留点建模调试示意
停留建模调试示意
该图用于解释停留点建模过程中的观测信号与区间判断逻辑,适合配合 openDebug: true 排查停留误判或漏判。
trajectorySegmentation.png:轨迹分段示意
轨迹分段示意
该图用于展示轨迹被分解为 motion 与 stopped 段后的结构化结果,可用于时间轴、分段卡片和行为分析视图。
调参建议(按场景)
- 上报间隔差异大(30s / 1min / 3min 混用):建议开启
driftObserveUseDeltaTAdaptiveParams,先观察[Δt估计]与[Δt动态参数],再微调静态四点数参数的时间语义。 - 静止抖动明显:优先关注
driftObserveWindowSize、driftObserveAbsAngleHigh/Low、driftObserveDensityScoreThreshold。 - 需要低速/质量门控:确保点位携带合法
p载荷,并检查driftObserveLowSpeed*、driftObserveMotionReject*。 p仅卫星占位异常(000000000000XX占比高):无需手关开关,库会自动降级;可看[p载荷质量]确认shouldDegrade,必要时调整driftObservePayloadDegradeInvalidRatioThreshold(默认 0.5)。- 漏判“角度不怎么抖但确实停住”的场景:先别急着改方向阈值,优先把第一层的低速候选打开并调顺(
driftObserveLowSpeedCandidateEnabled、driftObserveLowSpeedThresholdKmh、driftObserveLowSpeedRatioThreshold)。直觉上这是在补召回(recall):让真实停留别漏掉。 - 容易把拐弯/慢行/稳定行驶误判成停留:优先看第二层运动反证(
driftObserveMotionReject*)。你可以先从driftObserveMotionRejectMedianSpeedKmh下手,再用Stable*Mad和quality gate(hdop/vdop/satelliteCount)把“高质量稳定运动段”稳稳放回去。直觉上这是在提精确(precision):把误停留释放出来。 - 行驶为主且抖动轻微:保持默认漂移参数,重点调整
IQRThreshold与pathColorOptimize。 - 存在长距离跳点:适当降低
IQRThreshold,观察切段结果与trajectoryMileage变化。 - 需要轨迹更平滑:开启
smoothness,并配合smoothnessLimitAvgSpeed控制误补点风险。
