补传数据后,更新补传最后时间的后一个平滑周期内的Rb562值
This commit is contained in:
parent
58d8355d6f
commit
b5946d0f03
@ -39,22 +39,16 @@ public class GNSSDeviceLocationRecordServiceImpl implements GNSSDeviceLocationRe
|
|||||||
public static final int FILTER_SHORT_CYCLE_HOUR = 4;
|
public static final int FILTER_SHORT_CYCLE_HOUR = 4;
|
||||||
public static final int FILTER_LONG_CYCLE_HOUR = 25;
|
public static final int FILTER_LONG_CYCLE_HOUR = 25;
|
||||||
static final int FILTER_MIN_RECORD_NUM = 10;
|
static final int FILTER_MIN_RECORD_NUM = 10;
|
||||||
static final double XY_THRESHOLD = 30; //水平异常点30mm
|
static final float XY_THRESHOLD = 30; //水平异常点30mm
|
||||||
static final double Z_THRESHOLD = 30; //高程异常点30mm
|
static final float Z_THRESHOLD = 30; //高程异常点30mm
|
||||||
|
|
||||||
int shortCycleHour; //hour
|
static class FilterSetting{
|
||||||
int longCycleHour;
|
|
||||||
boolean enableAutoFilter = false;
|
|
||||||
double xyThreshold = XY_THRESHOLD; //水平异常点30mm
|
|
||||||
double zThreshold = Z_THRESHOLD; //高程异常点30mm
|
|
||||||
|
|
||||||
class FilterSetting{
|
|
||||||
public LocalDateTime startTime;
|
public LocalDateTime startTime;
|
||||||
public int filterCycleHour;
|
public int filterCycleHour;
|
||||||
}
|
}
|
||||||
private ConcurrentHashMap<String, FilterSetting> shortCycleDevices = new ConcurrentHashMap<>();
|
final private ConcurrentHashMap<String, FilterSetting> shortCycleDevices = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||||
protected Class<GnssCalcData> getClazz() {
|
protected Class<GnssCalcData> getClazz() {
|
||||||
return GnssCalcData.class;
|
return GnssCalcData.class;
|
||||||
}
|
}
|
||||||
@ -68,50 +62,36 @@ public class GNSSDeviceLocationRecordServiceImpl implements GNSSDeviceLocationRe
|
|||||||
locationRecord.setEnabled(true);
|
locationRecord.setEnabled(true);
|
||||||
|
|
||||||
// 获取平滑参数
|
// 获取平滑参数
|
||||||
refreshCalcParams(gnssDevice.getCalc_group_id());
|
GnssGroupCalc groupCalc = getCalcParams(gnssDevice.getCalc_group_id());
|
||||||
|
|
||||||
// 平滑处理
|
// 平滑处理
|
||||||
int filterCycle = shortCycleHour;
|
int filterCycle = groupCalc.getFilter_hour();
|
||||||
if(enableAutoFilter) {
|
if(groupCalc.getAuto_filter()) {
|
||||||
filterCycle = calcFilterCycle(locationRecord.getDeviceid(), isExceed);
|
filterCycle = calcFilterCycle(locationRecord.getDeviceid(), isExceed, groupCalc);
|
||||||
}
|
}
|
||||||
calcFilterLocation(locationRecord, filterCycle);
|
calcFilterLocation(locationRecord, filterCycle,
|
||||||
|
groupCalc.getXy_threshold(), groupCalc.getZ_threshold());
|
||||||
|
|
||||||
repository.insert(locationRecord);
|
repository.insert(locationRecord);
|
||||||
}
|
}
|
||||||
|
|
||||||
void refreshCalcParams(int calcGroupId){
|
GnssGroupCalc getCalcParams(int calcGroupId){
|
||||||
GnssGroupCalc calcParam = groupCalcMapper.selectById(calcGroupId);
|
GnssGroupCalc calcParam = groupCalcMapper.selectById(calcGroupId);
|
||||||
if(calcParam != null){
|
if(calcParam == null){
|
||||||
if(calcParam.getXy_threshold()!=null){
|
calcParam = new GnssGroupCalc();
|
||||||
xyThreshold = calcParam.getXy_threshold();
|
calcParam.setAuto_filter(false);
|
||||||
}
|
calcParam.setFilter_hour(FILTER_SHORT_CYCLE_HOUR);
|
||||||
if(calcParam.getZ_threshold()!=null){
|
calcParam.setFilter_max_hour(FILTER_LONG_CYCLE_HOUR);
|
||||||
zThreshold = calcParam.getZ_threshold();
|
calcParam.setXy_threshold(XY_THRESHOLD);
|
||||||
}
|
calcParam.setZ_threshold(Z_THRESHOLD);
|
||||||
if(calcParam.getFilter_hour()!=null){
|
|
||||||
shortCycleHour = calcParam.getFilter_hour();
|
|
||||||
}
|
|
||||||
if(calcParam.getAuto_filter()!=null){
|
|
||||||
enableAutoFilter = calcParam.getAuto_filter();
|
|
||||||
}
|
|
||||||
if(calcParam.getFilter_max_hour()!=null){
|
|
||||||
longCycleHour = calcParam.getFilter_max_hour();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
enableAutoFilter = false;
|
|
||||||
shortCycleHour = FILTER_SHORT_CYCLE_HOUR;
|
|
||||||
xyThreshold = XY_THRESHOLD; //水平异常点50mm
|
|
||||||
zThreshold = Z_THRESHOLD; //高程异常点50mm
|
|
||||||
longCycleHour = FILTER_LONG_CYCLE_HOUR;
|
|
||||||
}
|
}
|
||||||
|
return calcParam;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 计算东北天的最近融合数据的加权平均, 刘畅20230725 copy 自 avgEND; id>20, 滤波参数6h 或 25h
|
* 计算东北天的最近融合数据的加权平均, 刘畅20230725 copy 自 avgEND; id>20, 滤波参数6h 或 25h
|
||||||
*/
|
*/
|
||||||
public boolean calcFilterLocation(GnssCalcData newRecord, int filterCycleHour){
|
public boolean calcFilterLocation(GnssCalcData newRecord, int filterCycleHour, float xyThreshold, float zThreshold){
|
||||||
String deviceId = newRecord.getDeviceid();
|
String deviceId = newRecord.getDeviceid();
|
||||||
// 选取[newRecordTime-filterCycleHour, newRcordTime]之间的记录做平滑
|
// 选取[newRecordTime-filterCycleHour, newRcordTime]之间的记录做平滑
|
||||||
// 如果这个时间段的记录数少于FILTER_MIN_RECORD_NUM,本次不做平滑
|
// 如果这个时间段的记录数少于FILTER_MIN_RECORD_NUM,本次不做平滑
|
||||||
@ -191,13 +171,13 @@ public class GNSSDeviceLocationRecordServiceImpl implements GNSSDeviceLocationRe
|
|||||||
* 2)固定:平滑窗口大小始终固定
|
* 2)固定:平滑窗口大小始终固定
|
||||||
* 3)自适应:当isExceed为true时,平滑窗口为SHORT_CYCLE,过了SHORT_CYCLE后,逐渐增长到LONG_CYCLE
|
* 3)自适应:当isExceed为true时,平滑窗口为SHORT_CYCLE,过了SHORT_CYCLE后,逐渐增长到LONG_CYCLE
|
||||||
*/
|
*/
|
||||||
int calcFilterCycle(String deviceId, boolean isExceed){
|
int calcFilterCycle(String deviceId, boolean isExceed, GnssGroupCalc groupCalc){
|
||||||
int filterCycle = longCycleHour;
|
int filterCycle = groupCalc.getFilter_max_hour();
|
||||||
LocalDateTime now = LocalDateTime.now();
|
LocalDateTime now = LocalDateTime.now();
|
||||||
if (isExceed) {
|
if (isExceed) {
|
||||||
FilterSetting filterData = new FilterSetting();
|
FilterSetting filterData = new FilterSetting();
|
||||||
filterData.startTime = now;
|
filterData.startTime = now;
|
||||||
filterData.filterCycleHour = shortCycleHour;
|
filterData.filterCycleHour = groupCalc.getFilter_hour();
|
||||||
shortCycleDevices.put(deviceId, filterData);
|
shortCycleDevices.put(deviceId, filterData);
|
||||||
filterCycle = filterData.filterCycleHour;
|
filterCycle = filterData.filterCycleHour;
|
||||||
logger.info(deviceId + " switch to short cycle");
|
logger.info(deviceId + " switch to short cycle");
|
||||||
@ -205,12 +185,12 @@ public class GNSSDeviceLocationRecordServiceImpl implements GNSSDeviceLocationRe
|
|||||||
FilterSetting filterData = shortCycleDevices.get(deviceId);
|
FilterSetting filterData = shortCycleDevices.get(deviceId);
|
||||||
if (filterData != null) {
|
if (filterData != null) {
|
||||||
Duration duration = Duration.between(now, filterData.startTime); // start - now
|
Duration duration = Duration.between(now, filterData.startTime); // start - now
|
||||||
if (Math.abs(duration.toHours()) >= longCycleHour) {
|
if (Math.abs(duration.toHours()) >= groupCalc.getFilter_max_hour()) {
|
||||||
shortCycleDevices.remove(deviceId);
|
shortCycleDevices.remove(deviceId);
|
||||||
logger.info(deviceId + " switch to long cycle");
|
logger.info(deviceId + " switch to long cycle");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (Math.abs(duration.toHours()) >= shortCycleHour) {
|
if (Math.abs(duration.toHours()) >= groupCalc.getFilter_hour()) {
|
||||||
filterData.filterCycleHour = (int) duration.toHours();
|
filterData.filterCycleHour = (int) duration.toHours();
|
||||||
}
|
}
|
||||||
filterCycle = filterData.filterCycleHour;
|
filterCycle = filterData.filterCycleHour;
|
||||||
@ -223,8 +203,12 @@ public class GNSSDeviceLocationRecordServiceImpl implements GNSSDeviceLocationRe
|
|||||||
@Override
|
@Override
|
||||||
public void updateRb562(String deviceId, LocalDateTime afterTime){
|
public void updateRb562(String deviceId, LocalDateTime afterTime){
|
||||||
// 获取平滑参数
|
// 获取平滑参数
|
||||||
//refreshCalcParams(gnssDevice.getCalc_group_id());
|
GnssDevice gnssDevice = gnssDeviceRepository.queryByDeviceId(deviceId);
|
||||||
LocalDateTime beforTime = afterTime.plusHours(shortCycleHour);
|
if(gnssDevice == null) return;
|
||||||
|
GnssGroupCalc groupCalc = getCalcParams(gnssDevice.getCalc_group_id());
|
||||||
|
|
||||||
|
// 平滑处理
|
||||||
|
LocalDateTime beforTime = afterTime.plusHours(groupCalc.getFilter_hour());
|
||||||
QueryWrapper<GnssCalcData> query = new QueryWrapper<>();
|
QueryWrapper<GnssCalcData> query = new QueryWrapper<>();
|
||||||
query.eq("deviceid", deviceId);
|
query.eq("deviceid", deviceId);
|
||||||
query.ge("createtime", beforTime.format(dateFormatter));
|
query.ge("createtime", beforTime.format(dateFormatter));
|
||||||
@ -232,8 +216,9 @@ public class GNSSDeviceLocationRecordServiceImpl implements GNSSDeviceLocationRe
|
|||||||
|
|
||||||
List<GnssCalcData> calcDataListToUpdate = repository.selectList(query);
|
List<GnssCalcData> calcDataListToUpdate = repository.selectList(query);
|
||||||
for(GnssCalcData calcData:calcDataListToUpdate){
|
for(GnssCalcData calcData:calcDataListToUpdate){
|
||||||
if(calcData.getEnabled() && calcData.getRb562e()==null) {
|
if(calcData.getEnabled()) {
|
||||||
calcFilterLocation(calcData, shortCycleHour);
|
calcFilterLocation(calcData, groupCalc.getFilter_hour(),
|
||||||
|
groupCalc.getXy_threshold(), groupCalc.getZ_threshold());
|
||||||
repository.updateById(calcData);
|
repository.updateById(calcData);
|
||||||
logger.info(deviceId + " update rb562");
|
logger.info(deviceId + " update rb562");
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user