diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/GNSSCalcFilterService.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/GNSSCalcFilterService.java index 06a94fd3..21c01332 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/GNSSCalcFilterService.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/GNSSCalcFilterService.java @@ -33,6 +33,7 @@ public class GNSSCalcFilterService { static final float XY_THRESHOLD = 30; //水平异常点30mm static final float Z_THRESHOLD = 30; //高程异常点30mm static final float AUTO_THRESHOLD = 50; //触发自适应滤波的门限50mm + static final double MIN_CHANGE = 0.01; static class VaryFilterCycle{ public LocalDateTime startTime; @@ -116,6 +117,12 @@ public class GNSSCalcFilterService { newRecord.setEnabled(false); //记录为坏点,下次不参与滤波 logger.info(deviceId + " abnormal gnss data"); } + else if (Math.abs(newRecord.getB562e() - record0.getB562e()) < MIN_CHANGE && + Math.abs(newRecord.getB562n() - record0.getB562n()) < MIN_CHANGE && + Math.abs(newRecord.getB562d() - record0.getB562d()) < MIN_CHANGE) { + newRecord.setEnabled(false); //如果两次解算结果相等,数据有被冻住的嫌疑,记录为坏点,下次不参与滤波 + logger.info(deviceId + " abnormal gnss data"); + } else { // 求本组和最近recordNum组原始值的平均值 double sumE = newRecord.getB562e(); @@ -166,20 +173,22 @@ public class GNSSCalcFilterService { LocalDateTime cmpTime = now.minusHours(groupCalc.getFilter_min_hour()); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("deviceid", deviceId); - queryWrapper.ge("createtime",cmpTime.format(dateFormatter)); - queryWrapper.last("limit 1"); - GnssCalcData gnssCalcData = repository.selectOne(queryWrapper); - if(gnssCalcData != null && gnssCalcData.getEnabled()){ - if(gnssCalcData.getRb562e()!=null && gnssCalcData.getRb562d()!=null){ + queryWrapper.le("createtime",cmpTime.format(dateFormatter)); + queryWrapper.last("limit 3"); + queryWrapper.orderByDesc("createtime"); + List gnssCalcDataList = repository.selectList(queryWrapper); + for (GnssCalcData gnssCalcData:gnssCalcDataList) { + if (gnssCalcData.getEnabled() && gnssCalcData.getRb562e() != null) { double gapE = Math.abs(gnssCalcData.getRb562e() - curCalcData.getRb562e()); double gapN = Math.abs(gnssCalcData.getRb562n() - curCalcData.getRb562n()); - if(gapE>=groupCalc.getAuto_threshold() || gapN>=groupCalc.getAuto_threshold()){ + if (gapE >= groupCalc.getAuto_threshold() || gapN >= groupCalc.getAuto_threshold()) { VaryFilterCycle varyCycle1 = new VaryFilterCycle(); varyCycle1.startTime = now; varyCycle1.filterCycleHour = groupCalc.getFilter_min_hour(); autoCycleDevices.put(deviceId, varyCycle1); - logger.info(deviceId + ": filter cycle change to "+varyCycle1.filterCycleHour); + logger.info(deviceId + ": filter cycle change to " + varyCycle1.filterCycleHour); } + break; } } }