1、水平和高程滤波窗口分开配置

2、算法1的每轮周期由支持最多300个解改为600个固定解
This commit is contained in:
weidong 2024-05-18 21:52:51 +08:00
parent a67caf05bd
commit 5f061af312
6 changed files with 97 additions and 9 deletions

View File

@ -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;

View File

@ -19,7 +19,7 @@ public class FocusCalculator1 implements FocusCalculator{
// b562算法相关b562固定解的点计算球心初始半径迭代步长最少点数
final List<double[]> 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;

View File

@ -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<zFilterCycleHour?zFilterCycleHour:filterCycleHour);
LocalDateTime xyFilterTime = newRecordTime.minusHours(filterCycleHour);
LocalDateTime zFilterTime = newRecordTime.minusHours(zFilterCycleHour);
LocalDateTime minCycleTime = newRecordTime.minusHours(minCycleHour);
QueryWrapper<GnssCalcData> 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<GnssCalcData> 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;

View File

@ -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 '增强坏点剔除',

View File

@ -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: "<div>{{d.adv_filter==1?'启用':'禁用'}}</div>"},
{field: 'auto_filter', title: '自适应滤波', templet: "<div>{{d.auto_filter==1?'启用':'禁用'}}</div>"},
{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',

View File

@ -40,11 +40,17 @@
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">滤波周期(小时)</label>
<label class="layui-form-label required">水平滤波周期(小时)</label>
<div class="layui-input-block">
<input type="number" name="filter_hour" id="filter_hour" lay-verify="required" lay-reqtext="不能为空" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">高程滤波周期(小时)</label>
<div class="layui-input-block">
<input type="number" name="zfilter_hour" id="zfilter_hour" lay-verify="required" lay-reqtext="不能为空" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">水平异常门限(mm)</label>
<div class="layui-input-block">
@ -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');