1、水平和高程滤波窗口分开配置
2、算法1的每轮周期由支持最多300个解改为600个固定解
This commit is contained in:
parent
a67caf05bd
commit
5f061af312
@ -9,6 +9,7 @@ public class GnssGroupCalc {
|
|||||||
Integer id;
|
Integer id;
|
||||||
String name;
|
String name;
|
||||||
Integer filter_hour;
|
Integer filter_hour;
|
||||||
|
Integer zfilter_hour;
|
||||||
Float xy_threshold;
|
Float xy_threshold;
|
||||||
Float z_threshold;
|
Float z_threshold;
|
||||||
Boolean adv_filter;
|
Boolean adv_filter;
|
||||||
|
|||||||
@ -19,7 +19,7 @@ public class FocusCalculator1 implements FocusCalculator{
|
|||||||
// b562算法相关:b562固定解的点、计算球心初始半径、迭代步长、最少点数
|
// b562算法相关:b562固定解的点、计算球心初始半径、迭代步长、最少点数
|
||||||
final List<double[]> pointList = Collections.synchronizedList(new ArrayList<>());
|
final List<double[]> pointList = Collections.synchronizedList(new ArrayList<>());
|
||||||
int gravityMinCount = 50;
|
int gravityMinCount = 50;
|
||||||
int gravityMaxCount = 300;
|
int gravityMaxCount = 600;
|
||||||
double gravityInitR = 5;//mm
|
double gravityInitR = 5;//mm
|
||||||
double gravityMaxR = 300;//mm
|
double gravityMaxR = 300;//mm
|
||||||
double pointSelectedRate = 0.5;
|
double pointSelectedRate = 0.5;
|
||||||
|
|||||||
@ -42,14 +42,17 @@ public class GNSSCalcFilterService {
|
|||||||
newRecord.setEnabled(true);
|
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);
|
VaryFilterCycle varyCycle = autoCycleDevices.get(deviceId);
|
||||||
if(varyCycle!=null){
|
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());
|
groupCalc.getXy_threshold(), groupCalc.getZ_threshold(), groupCalc.getAdv_filter());
|
||||||
|
|
||||||
repository.insert(newRecord);
|
repository.insert(newRecord);
|
||||||
@ -168,6 +171,81 @@ public class GNSSCalcFilterService {
|
|||||||
return false;
|
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){
|
void refreshFilterCycle(String deviceId, GnssGroupCalc groupCalc, GnssCalcData curCalcData){
|
||||||
if(curCalcData.getAuxe()==null) return;
|
if(curCalcData.getAuxe()==null) return;
|
||||||
|
|
||||||
|
|||||||
@ -78,7 +78,8 @@ CREATE TABLE IF NOT EXISTS `gnssgroup` (
|
|||||||
CREATE TABLE IF NOT EXISTS `gnssgroupcalc` (
|
CREATE TABLE IF NOT EXISTS `gnssgroupcalc` (
|
||||||
`id` int NOT NULL,
|
`id` int NOT NULL,
|
||||||
`name` varchar(64) DEFAULT 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 '坏点水平门限',
|
`xy_threshold` float DEFAULT NULL COMMENT '坏点水平门限',
|
||||||
`z_threshold` float DEFAULT NULL COMMENT '坏点垂直门限',
|
`z_threshold` float DEFAULT NULL COMMENT '坏点垂直门限',
|
||||||
`adv_filter` bit(1) DEFAULT 0 COMMENT '增强坏点剔除',
|
`adv_filter` bit(1) DEFAULT 0 COMMENT '增强坏点剔除',
|
||||||
|
|||||||
@ -146,9 +146,10 @@
|
|||||||
{field: 'id', title: '组号', sort: true},
|
{field: 'id', title: '组号', sort: true},
|
||||||
{field: 'name', title: '描述'},
|
{field: 'name', title: '描述'},
|
||||||
{field: 'ver', title: '算法版本'},
|
{field: 'ver', title: '算法版本'},
|
||||||
{field: 'filter_hour', title: '滤波周期(小时)'},
|
{field: 'filter_hour', title: '水平滤波周期(小时)'},
|
||||||
|
{field: 'zfilter_hour', title: '高程滤波周期(小时)'},
|
||||||
{field: 'xy_threshold', title: '水平异常门限(mm)'},
|
{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: 'adv_filter', title: '增强异常过滤', templet: "<div>{{d.adv_filter==1?'启用':'禁用'}}</div>"},
|
||||||
{field: 'auto_filter', title: '自适应滤波', templet: "<div>{{d.auto_filter==1?'启用':'禁用'}}</div>"},
|
{field: 'auto_filter', title: '自适应滤波', templet: "<div>{{d.auto_filter==1?'启用':'禁用'}}</div>"},
|
||||||
{field: 'filter_min_hour', title: '最小滤波周期'},
|
{field: 'filter_min_hour', title: '最小滤波周期'},
|
||||||
@ -158,7 +159,7 @@
|
|||||||
{title: '操作', toolbar: '#currentTableBar', align: "center"}
|
{title: '操作', toolbar: '#currentTableBar', align: "center"}
|
||||||
];
|
];
|
||||||
if([[${role}]] != "ADMIN" && [[${role}]] != "SUPER_ADMIN") {
|
if([[${role}]] != "ADMIN" && [[${role}]] != "SUPER_ADMIN") {
|
||||||
cfg2_cols[12].hide = true;
|
cfg2_cols[13].hide = true;
|
||||||
}
|
}
|
||||||
table.render({
|
table.render({
|
||||||
elem: '#calcParaTableId',
|
elem: '#calcParaTableId',
|
||||||
|
|||||||
@ -40,11 +40,17 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="layui-form-item">
|
<div class="layui-form-item">
|
||||||
<label class="layui-form-label required">滤波周期(小时)</label>
|
<label class="layui-form-label required">水平滤波周期(小时)</label>
|
||||||
<div class="layui-input-block">
|
<div class="layui-input-block">
|
||||||
<input type="number" name="filter_hour" id="filter_hour" lay-verify="required" lay-reqtext="不能为空" class="layui-input">
|
<input type="number" name="filter_hour" id="filter_hour" lay-verify="required" lay-reqtext="不能为空" class="layui-input">
|
||||||
</div>
|
</div>
|
||||||
</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">
|
<div class="layui-form-item">
|
||||||
<label class="layui-form-label required">水平异常门限(mm)</label>
|
<label class="layui-form-label required">水平异常门限(mm)</label>
|
||||||
<div class="layui-input-block">
|
<div class="layui-input-block">
|
||||||
@ -140,6 +146,7 @@
|
|||||||
group_id.val(data.id);
|
group_id.val(data.id);
|
||||||
group_id.attr('readonly',true);
|
group_id.attr('readonly',true);
|
||||||
$('#filter_hour').val(data.filter_hour);
|
$('#filter_hour').val(data.filter_hour);
|
||||||
|
$('#zfilter_hour').val(data.zfilter_hour);
|
||||||
$('#xy_threshold').val(data.xy_threshold);
|
$('#xy_threshold').val(data.xy_threshold);
|
||||||
$('#z_threshold').val(data.z_threshold);
|
$('#z_threshold').val(data.z_threshold);
|
||||||
$('#adv_filter').val(data.adv_filter?'1':'0');
|
$('#adv_filter').val(data.adv_filter?'1':'0');
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user