1、水平和高程滤波窗口分开配置
2、算法1的每轮周期由支持最多300个解改为600个固定解
This commit is contained in:
parent
a67caf05bd
commit
5f061af312
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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 '增强坏点剔除',
|
||||
|
||||
@ -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',
|
||||
|
||||
@ -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');
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user