补传数据后,更新补传最后时间的后一个平滑周期内的Rb562值

This commit is contained in:
weidong 2023-12-11 07:48:22 +08:00
parent 58d8355d6f
commit b5946d0f03

View File

@ -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");
} }