项目地址https://github.com/jinyuttt/GNSS-QC.git定位说明本项目为研究测试性质聚焦于GNSS形变监测中数据清洗算法的思路探讨非生产级部署方案。欢迎大家 fork、讨论、提出改进意见共同完善。写在前面在GNSS形变监测中位移数据NEU常受多路径、卫星几何、电离层等影响出现跳变、粗差、阶跃等异常。如何在压制噪声的同时保护真实形变信号是一个有挑战性的课题。本项目是一个Java语言实现的探索性框架尝试用“七层递进式”的思路对单历元NEU结果进行逐层过滤。它并非为高并发、高可用生产环境设计而是提供一个可读性强、易于修改的实验平台供研究人员和学生借鉴其中的检测逻辑如Hampel粗差、双基线阶跃、空间一致性等并在此基础上开展自己的实验。所有层级均可按需开关参数可调且存储、历史数据等均通过接口解耦方便替换为您的实验数据源。欢迎在GitHub上提Issue/PR一起讨论更优的清洗策略。一、项目概览GNSS-QC 是一个面向单测点GNSS位移时序的七层递进式质量控制框架核心模块包括L1 质量门禁基于解算状态、卫星数、PDOP、RMS、Ratio 的前置拦截L2 跳变检测相邻历元突变识别 同向趋势快速通道保护真实形变L3 统计粗差去趋势残差 Hampel / IQR / 3σ 多种算法L4 异常替换仅当L3触发时用窗口统计量替换粗差点L5 基线记忆与阶跃校准快慢双基线对比三阶段检测长期偏移L6 空间一致性校验可选同组多设备空间离群识别L7 综合仲裁可选可信度加权评分 后置纠偏。此外还附带一个旁路影子评测服务RRCF LSTM-Attention 双模型用于离线研究异常识别和修复效果不干扰主链路。⚠️重要提醒影子评测模块需要Python环境模型训练部分且当前仅为实验性集成生产环境请谨慎使用。二、设计思路与原则本框架遵循以下实验性原则实际使用时可根据数据特点调整原则说明递进过滤每层独立判断未通过则标记并阻止进入下一层L2例外只标记不阻断只看过去纯历史驱动不依赖未来数据便于流式模拟不漏形变趋势快速通道 趋势保护双重防线尽量保留连续形变只压噪声只替换孤立异常点连续趋势数据原样保留接口解耦存储、历史查询通过回调/接口接入方便替换为不同实验环境可选层级L6、L7及影子评测均为可选默认关闭降低实验复杂度三、七层架构详解实验性实现以下各层的阈值均为经验初值强烈建议根据您自己的数据分布进行调优。Layer 1 — 质量门禁检查项与默认阈值可修改解算状态条件INVALID / SINGLE直接拒绝FLOAT卫星数≥6PDOP≤6.0RMS≤0.15mFIX卫星数≥6PDOP≤4.0RMS≤0.05mRatio≥3.0Layer 2 — 跳变检测水平跳变 0.05m 或 高程跳变 0.08m → 标记异常不阻断连续3历元同向跳变 → 判定为真实形变放行快速通道Layer 3 — 统计粗差检测滑动窗口默认20条内先线性去趋势再对残差做异常检测Hampel Identifier默认残差偏离中位数超过k * MAD水平k3.0高程k3.5IQR法超出 [Q1-1.5IQR, Q31.5IQR]3σ法偏离均值超过3σLayer 4 — 异常替换仅当L3触发时执行替换值 窗口中位数Hampel/IQR或均值3σ替换后清除异常标记继续流转Layer 5 — 基线记忆与阶跃校准快速基线最近300条中位数5分钟1Hz慢速基线最近1440条中位数24小时级差值 0.03m → 进入观察期连续60历元稳定在候选位置 → 确认阶跃超时则回正Layer 6 — 空间一致性校验可选需要≥2个邻居设备计算组中位数当前与组中位数偏差 0.03m → 判定为空间离群替换为中位数默认关闭需手动enableSpatialCheck trueLayer 7 — 综合仲裁可选基于加权综合异常分WCS进行后置判决textWCS 0.35×sigmoid(|时序残差|) 0.35×sigmoid(|空间残差|/阈值) 0.20×(1-解算质量归一化) 0.10×阶跃标记WCS ≤ 0.85 → 放行WCS 0.85 → 查询历史50ms超时熔断结合趋势保护判断是否替换四、影子评测服务旁路实验该模块为独立旁路不参与主数据流专门用于离线研究异常识别和修复算法。双模型RRCF流式异常检测 LSTMAttention时序预测10维语义特征涵盖位移、变化率、残差、空间残差、解算质量等双环路同步推理≤50ms 定时增量学习默认5分钟修复策略单点/短时异常用LSTM预测或邻域插值长时段失锁标记无效不做插值 该模块目前为实验集成模型训练部分在Python侧Java仅负责特征提取和调用。若您只关注主清洗逻辑可直接忽略此模块。五、快速上手本地实验环境JDK 17Maven 3.6编译与测试bashmvn compile mvn test # 运行全部测试最小示例单点清洗javaCleanConfig cleanConfig new CleanConfig(); DisplacementCalculator calc new DefaultDisplacementCalculator( cleanConfig, new DiagnosisConfig(), new CacheConfig() ); DisplacementResult result new DisplacementResult(); result.setdNorth(0.012); result.setdEast(0.005); result.setdUp(0.003); result.setStatus(SolutionStatus.FIX); result.setRatio(5.0); result.setRms(0.020); result.setPdop(2.0); result.setNumSatellites(10); result.setTimestamp(Instant.now()); CleanResult cr calc.cleanWithHistory(result, device-001); if (cr.isPassed()) { System.out.println(清洗通过); } else { System.out.println(拒绝原因 cr.getFailureReason()); }启用L6/L7在CleanConfig和Layer7Config中设置enabled true并实现HistoryDataProvider接口用于L7历史查询。六、项目结构仅供参考textsrc/main/java/org/gnss/ ├── DisplacementCalculator.java # 主接口 ├── DefaultDisplacementCalculator.java # 默认实现 ├── cache/DeviceStateCache.java # LRU状态缓存 ├── cleaning/ │ ├── DisplacementCleaner.java # L1-L6清洗器 │ └── Layer7Arbitrator.java # L7仲裁器 ├── config/ # 各种配置类 ├── diagnosis/DeviceDiagnostician.java # 温漂/周期/抖动诊断实验性 ├── model/ # 数据模型 ├── persistence/ # 存储回调接口 └── shadow/ # 影子评测客户端实验七、总结与讨论本项目提供了一个七层递进式GNSS位移数据清洗的实验框架主要特点逻辑清晰每层职责单一便于修改和测试参数开放所有阈值均可配置方便适配不同数据模块可选空间校验、综合仲裁、影子评测均可按需关闭接口解耦便于接入自己的数据源和存储。但必须再次强调这不是一个生产级系统未经过大规模压力测试和长期稳定性验证。它的价值在于展示一种清洗思路的组合方式并为研究者提供一个可运行的实验基础。欢迎大家基于此框架进行修改、对比实验并在GitHub上分享您的改进。可能的研究方向不同粗差检测算法Hampel vs IQR vs 3σ的对比效果双基线阶跃检测的参数敏感性分析空间校验对多设备网平差的改善作用影子评测中LSTMAttention与RRCF的融合策略优化。