说明文档及下载链接

主要修复内容:

1.制定了锚点管理的四个基本原则

  • 锚点位置不可变
    锚点是用户在现场基于物理里程牌手动标记的真实坐标,其经纬度和里程值是整个坐标库的基准。任何优化逻辑都不能修改锚点的经纬度、里程值、锚点标记
  • 校准按锚段分段进行
    插入一个锚点时,它只修正该锚点与相邻上一个锚点、下一个锚点之间的数据。不能隔着锚点去修复其他锚段的数据。样条插值的范围严格限制在相邻两个锚点之间,不做外推。
  • 异常点不能硬拉
    如果某个普通点的里程值明显不属于它所在的锚段范围(比如K18的点混在K0~K2的锚段里),应当删除该点或提醒用户手动移动到正确的锚段,而不是用样条强行拉伸。
  • 插入锚点时需合理性校验
    用户手动输入里程可能出错(如在K0位置输入了K109的里程)。系统应在插入前对比当前GPS推算里程与用户输入里程,差异过大时弹出警告让用户确认,防止错误锚点污染全库。

2. 确认 hermiteSplineCalibrate 的外推保护

核对了 CoordinateOptimizer.kt 的当前代码,确认外推保护逻辑已经生效。 在样条计算中,系统现在通过 when (rightIdx) 分支严格限制了校准范围:
•第一个锚点之前 (0 -> d):直接返回原始里程 d。
•最后一个锚点之后 (-1 -> d):直接返回原始里程 d。
•结论:这彻底杜绝了异常锚点通过“线性外推”拉低或拉高全线里程的风险。

3. 优化 doSmartOptimize 的过滤机制

在 InspectorViewModel.kt 的 doSmartOptimize 中增加了锚段边界过滤。
•逻辑实现:在进行平滑和去重前,系统会先计算当前线路上所有锚点的里程极值(firstAnchorM 和 lastAnchorM)。
•物理删除:凡是里程值落在锚段范围之外的普通采集点(孤立点),都会在优化过程中被剔除。
•效果:通过 overwriteMileageLibrary 覆盖写入时,这些“流浪点”将被永久删除,确保坐标库只保留受锚点约束的有效数据,进一步提升了库的纯净度。

4. 合理性校验的平衡

已将 insertQuickPoint 的“拦截”改为“强提醒”。
•当偏差 > 1km 时,弹出显著的 Toast 提醒。
•绝对信任原则,不拦截插入:确保在新线采集初期,即使预估里程偏差很大,也能成功插入中间锚点来建立基准

5.导出逻辑纠正 (exportMileageLibrary):

◦引入了 csvEscape 辅助函数,自动为 LineName、LineDirection、MileageText 和 Features 字段添加双引号,并对字段内部原有的双引号进行转义(将 " 替换为 "")。
◦这保证了即便特征字段包含逗号(如 "CP0064308,桥梁"),导出的 CSV 行也能被正确识别为 9 列,避免了 IsAnchor 被误读为 CalibratedMileage 的问题。

6.导出原始数据增强 (exportRawData):

◦同步为检测记录的 CSV 导出增加了转义逻辑。对“线路名称”、“行别”、“车型”、“车次”、“特征”以及“报警等级”等所有可能包含特殊字符的文本字段进行了加引号处理。

7.解析算法升级 (parseCsvLine):

◦重构了 CSV 行解析器。现在它能完美支持标准 CSV 规范:
▪识别并保留双引号内的逗号,不将其作为分隔符。
▪自动去除字段两端的双引号。
▪正确处理转义的双引号(即 "" 被还原为 ")。

8.完善了锚点删除逻辑

自动刷新机制:
◦在 InspectorViewModel 的 deleteAnchor 函数中,将刷新逻辑合并到同一个协程作用域内。现在删除操作完成后,会立即顺序调用 loadAnchors 和 loadAllAnchors,确保 UI 状态在数据库更新后同步刷新。
◦同时在 insertQuickPoint(快速打点)和 doImport(导入库)操作中也加入了自动刷新,保证坐标库的任何变动都能实时反映在列表中。
列表打开即刷新:
◦修改了 showDialog 的逻辑。现在点击“查看所有锚点”时,系统会先触发一次 loadAllAnchors() 刷新,然后再显示弹窗,确保用户看到的是最新数据。