diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssGroupCalc.java b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssGroupCalc.java index 8aa1696e..75ce3e16 100644 --- a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssGroupCalc.java +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssGroupCalc.java @@ -9,6 +9,7 @@ public class GnssGroupCalc { Integer id; String name; Integer filter_hour; + Integer zfilter_hour; Float xy_threshold; Float z_threshold; Boolean adv_filter; diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/bd/FocusCalculator1.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/bd/FocusCalculator1.java index d8ad3554..fc9cb4b8 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/bd/FocusCalculator1.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/bd/FocusCalculator1.java @@ -19,7 +19,7 @@ public class FocusCalculator1 implements FocusCalculator{ // b562算法相关:b562固定解的点、计算球心初始半径、迭代步长、最少点数 final List pointList = Collections.synchronizedList(new ArrayList<>()); int gravityMinCount = 50; - int gravityMaxCount = 300; + int gravityMaxCount = 600; double gravityInitR = 5;//mm double gravityMaxR = 300;//mm double pointSelectedRate = 0.5; 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 52a1e2f2..4c2c4eac 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 @@ -42,14 +42,17 @@ public class GNSSCalcFilterService { newRecord.setEnabled(true); // 计算平滑周期 - int filterCycle = groupCalc.getFilter_hour(); + Integer xyfilterCycle = groupCalc.getFilter_hour(); + Integer zfilterCycle = groupCalc.getZfilter_hour(); + if(null == zfilterCycle) zfilterCycle = xyfilterCycle; VaryFilterCycle varyCycle = autoCycleDevices.get(deviceId); if(varyCycle!=null){ - filterCycle = varyCycle.filterCycleHour; + xyfilterCycle = varyCycle.filterCycleHour; + zfilterCycle = varyCycle.filterCycleHour; } // 平滑处理 - calcFilterLocation(newRecord, referPos, filterCycle, groupCalc.getFilter_min_hour(), + calcFilterLocation(newRecord, referPos, xyfilterCycle, zfilterCycle, groupCalc.getFilter_min_hour(), groupCalc.getXy_threshold(), groupCalc.getZ_threshold(), groupCalc.getAdv_filter()); repository.insert(newRecord); @@ -168,6 +171,81 @@ public class GNSSCalcFilterService { return false; } + public boolean calcFilterLocation(GnssCalcData newRecord, double[] referPos, int filterCycleHour, int zFilterCycleHour, + int minCycleHour, float xyThreshold, float zThreshold, boolean isAdvFilter){ + String deviceId = newRecord.getDeviceid(); + // 选取[newRecordTime-filterCycleHour, newRcordTime]之间的记录做平滑 + // 如果这个时间段的记录数少于FILTER_MIN_RECORD_NUM,本次不做平滑 + LocalDateTime newRecordTime = newRecord.getCreatetime(); + LocalDateTime filterAfterTime = newRecordTime.minusHours(filterCycleHour query = new QueryWrapper<>(); + query.eq("deviceid", deviceId); + query.ge("createtime", filterAfterTime.format(dateFormatter)); + query.le("createtime", newRecordTime.format(dateFormatter)); + //query.eq("enabled", true);// 坏点参与比较,不参与滤波 + query.orderByDesc("createtime"); + + List gnssHistoryRecords = repository.selectList(query); + + if(gnssHistoryRecords.size() == 0){ + //第一个点无参考,当作坏点处理 + newRecord.setEnabled(false); + } + else { + newRecord.setEnabled( + isGoodGnssData(newRecord, referPos, gnssHistoryRecords,xyThreshold,zThreshold,isAdvFilter)); + + if(newRecord.getEnabled()) { + // 求本组和最近recordNum组原始值的平均值 + double sumE = newRecord.getB562e(); + double sumN = newRecord.getB562n(); + double sumD = newRecord.getB562d(); + double msumE = sumE; + double msumN = sumN; + double msumD = sumD; + int xyCount = 1; + int zCount = 1; + int minCount = 1; + + for (GnssCalcData record : gnssHistoryRecords) { + if (record.getEnabled()) {//只选取好点参与滤波 + if(record.getCreatetime().isAfter(xyFilterTime)) { + sumE += record.getB562e(); + sumN += record.getB562n(); + xyCount++; + } + if(record.getCreatetime().isAfter(zFilterTime)) { + sumD += record.getB562d(); + zCount++; + } + // 计算短周期 + if(record.getCreatetime().isAfter(minCycleTime)){ + msumE = sumE; + msumN = sumN; + msumD = sumD; + minCount++; + } + } + } + logger.debug("{} filter records num: {}, {}",deviceId,xyCount,zCount); + if (xyCount >= FILTER_MIN_RECORD_NUM) { + newRecord.setRpose(NumberUtils.scaleTwo(sumE / xyCount)); + newRecord.setRposn(NumberUtils.scaleTwo(sumN / xyCount)); + newRecord.setRposd(NumberUtils.scaleTwo(sumD / zCount)); + newRecord.setAuxe(NumberUtils.scaleTwo(msumE / minCount)); + newRecord.setAuxn(NumberUtils.scaleTwo(msumN / minCount)); + newRecord.setAuxd(NumberUtils.scaleTwo(msumD / minCount)); + return true; + } + } + } + + return false; + } + void refreshFilterCycle(String deviceId, GnssGroupCalc groupCalc, GnssCalcData curCalcData){ if(curCalcData.getAuxe()==null) return; diff --git a/sec-beidou/src/main/resources/db/schema.sql b/sec-beidou/src/main/resources/db/schema.sql index 3842a61d..4316c727 100644 --- a/sec-beidou/src/main/resources/db/schema.sql +++ b/sec-beidou/src/main/resources/db/schema.sql @@ -78,7 +78,8 @@ CREATE TABLE IF NOT EXISTS `gnssgroup` ( CREATE TABLE IF NOT EXISTS `gnssgroupcalc` ( `id` int NOT NULL, `name` varchar(64) DEFAULT NULL, - `filter_hour` int DEFAULT NULL COMMENT '平滑窗口', + `filter_hour` int DEFAULT NULL COMMENT '水平平滑窗口', + `zfilter_hour` int DEFAULT NULL COMMENT '高程平滑窗口', `xy_threshold` float DEFAULT NULL COMMENT '坏点水平门限', `z_threshold` float DEFAULT NULL COMMENT '坏点垂直门限', `adv_filter` bit(1) DEFAULT 0 COMMENT '增强坏点剔除', diff --git a/sec-beidou/src/main/resources/templates/page/gnss_group_cfg.html b/sec-beidou/src/main/resources/templates/page/gnss_group_cfg.html index c7812750..c259d0e4 100644 --- a/sec-beidou/src/main/resources/templates/page/gnss_group_cfg.html +++ b/sec-beidou/src/main/resources/templates/page/gnss_group_cfg.html @@ -146,9 +146,10 @@ {field: 'id', title: '组号', sort: true}, {field: 'name', title: '描述'}, {field: 'ver', title: '算法版本'}, - {field: 'filter_hour', title: '滤波周期(小时)'}, + {field: 'filter_hour', title: '水平滤波周期(小时)'}, + {field: 'zfilter_hour', title: '高程滤波周期(小时)'}, {field: 'xy_threshold', title: '水平异常门限(mm)'}, - {field: 'z_threshold', title: '垂直异常门限(mm)'}, + {field: 'z_threshold', title: '高程异常门限(mm)'}, {field: 'adv_filter', title: '增强异常过滤', templet: "
{{d.adv_filter==1?'启用':'禁用'}}
"}, {field: 'auto_filter', title: '自适应滤波', templet: "
{{d.auto_filter==1?'启用':'禁用'}}
"}, {field: 'filter_min_hour', title: '最小滤波周期'}, @@ -158,7 +159,7 @@ {title: '操作', toolbar: '#currentTableBar', align: "center"} ]; if([[${role}]] != "ADMIN" && [[${role}]] != "SUPER_ADMIN") { - cfg2_cols[12].hide = true; + cfg2_cols[13].hide = true; } table.render({ elem: '#calcParaTableId', diff --git a/sec-beidou/src/main/resources/templates/page/table/gnss_add_group_calc.html b/sec-beidou/src/main/resources/templates/page/table/gnss_add_group_calc.html index 71c18b71..ad208e39 100644 --- a/sec-beidou/src/main/resources/templates/page/table/gnss_add_group_calc.html +++ b/sec-beidou/src/main/resources/templates/page/table/gnss_add_group_calc.html @@ -40,11 +40,17 @@
- +
+
+ +
+ +
+
@@ -140,6 +146,7 @@ group_id.val(data.id); group_id.attr('readonly',true); $('#filter_hour').val(data.filter_hour); + $('#zfilter_hour').val(data.zfilter_hour); $('#xy_threshold').val(data.xy_threshold); $('#z_threshold').val(data.z_threshold); $('#adv_filter').val(data.adv_filter?'1':'0');