From b5946d0f03eaa0b94554840fb477308983204fdb Mon Sep 17 00:00:00 2001 From: weidong Date: Mon, 11 Dec 2023 07:48:22 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E4=BC=A0=E6=95=B0=E6=8D=AE=E5=90=8E?= =?UTF-8?q?=EF=BC=8C=E6=9B=B4=E6=96=B0=E8=A1=A5=E4=BC=A0=E6=9C=80=E5=90=8E?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E7=9A=84=E5=90=8E=E4=B8=80=E4=B8=AA=E5=B9=B3?= =?UTF-8?q?=E6=BB=91=E5=91=A8=E6=9C=9F=E5=86=85=E7=9A=84Rb562=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GNSSDeviceLocationRecordServiceImpl.java | 85 ++++++++----------- 1 file changed, 35 insertions(+), 50 deletions(-) diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/GNSSDeviceLocationRecordServiceImpl.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/GNSSDeviceLocationRecordServiceImpl.java index 1940ba12..2af31351 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/GNSSDeviceLocationRecordServiceImpl.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/GNSSDeviceLocationRecordServiceImpl.java @@ -39,22 +39,16 @@ public class GNSSDeviceLocationRecordServiceImpl implements GNSSDeviceLocationRe public static final int FILTER_SHORT_CYCLE_HOUR = 4; public static final int FILTER_LONG_CYCLE_HOUR = 25; static final int FILTER_MIN_RECORD_NUM = 10; - static final double XY_THRESHOLD = 30; //水平异常点30mm - static final double Z_THRESHOLD = 30; //高程异常点30mm + static final float XY_THRESHOLD = 30; //水平异常点30mm + static final float Z_THRESHOLD = 30; //高程异常点30mm - int shortCycleHour; //hour - int longCycleHour; - boolean enableAutoFilter = false; - double xyThreshold = XY_THRESHOLD; //水平异常点30mm - double zThreshold = Z_THRESHOLD; //高程异常点30mm - - class FilterSetting{ + static class FilterSetting{ public LocalDateTime startTime; public int filterCycleHour; } - private ConcurrentHashMap shortCycleDevices = new ConcurrentHashMap<>(); + final private ConcurrentHashMap 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 getClazz() { return GnssCalcData.class; } @@ -68,50 +62,36 @@ public class GNSSDeviceLocationRecordServiceImpl implements GNSSDeviceLocationRe locationRecord.setEnabled(true); // 获取平滑参数 - refreshCalcParams(gnssDevice.getCalc_group_id()); + GnssGroupCalc groupCalc = getCalcParams(gnssDevice.getCalc_group_id()); // 平滑处理 - int filterCycle = shortCycleHour; - if(enableAutoFilter) { - filterCycle = calcFilterCycle(locationRecord.getDeviceid(), isExceed); + int filterCycle = groupCalc.getFilter_hour(); + if(groupCalc.getAuto_filter()) { + filterCycle = calcFilterCycle(locationRecord.getDeviceid(), isExceed, groupCalc); } - calcFilterLocation(locationRecord, filterCycle); + calcFilterLocation(locationRecord, filterCycle, + groupCalc.getXy_threshold(), groupCalc.getZ_threshold()); repository.insert(locationRecord); } - void refreshCalcParams(int calcGroupId){ + GnssGroupCalc getCalcParams(int calcGroupId){ GnssGroupCalc calcParam = groupCalcMapper.selectById(calcGroupId); - if(calcParam != null){ - if(calcParam.getXy_threshold()!=null){ - xyThreshold = calcParam.getXy_threshold(); - } - if(calcParam.getZ_threshold()!=null){ - zThreshold = calcParam.getZ_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; + if(calcParam == null){ + calcParam = new GnssGroupCalc(); + calcParam.setAuto_filter(false); + calcParam.setFilter_hour(FILTER_SHORT_CYCLE_HOUR); + calcParam.setFilter_max_hour(FILTER_LONG_CYCLE_HOUR); + calcParam.setXy_threshold(XY_THRESHOLD); + calcParam.setZ_threshold(Z_THRESHOLD); } + return calcParam; } /** * 计算东北天的最近融合数据的加权平均, 刘畅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(); // 选取[newRecordTime-filterCycleHour, newRcordTime]之间的记录做平滑 // 如果这个时间段的记录数少于FILTER_MIN_RECORD_NUM,本次不做平滑 @@ -191,13 +171,13 @@ public class GNSSDeviceLocationRecordServiceImpl implements GNSSDeviceLocationRe * 2)固定:平滑窗口大小始终固定 * 3)自适应:当isExceed为true时,平滑窗口为SHORT_CYCLE,过了SHORT_CYCLE后,逐渐增长到LONG_CYCLE */ - int calcFilterCycle(String deviceId, boolean isExceed){ - int filterCycle = longCycleHour; + int calcFilterCycle(String deviceId, boolean isExceed, GnssGroupCalc groupCalc){ + int filterCycle = groupCalc.getFilter_max_hour(); LocalDateTime now = LocalDateTime.now(); if (isExceed) { FilterSetting filterData = new FilterSetting(); filterData.startTime = now; - filterData.filterCycleHour = shortCycleHour; + filterData.filterCycleHour = groupCalc.getFilter_hour(); shortCycleDevices.put(deviceId, filterData); filterCycle = filterData.filterCycleHour; logger.info(deviceId + " switch to short cycle"); @@ -205,12 +185,12 @@ public class GNSSDeviceLocationRecordServiceImpl implements GNSSDeviceLocationRe FilterSetting filterData = shortCycleDevices.get(deviceId); if (filterData != null) { 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); logger.info(deviceId + " switch to long cycle"); } else { - if (Math.abs(duration.toHours()) >= shortCycleHour) { + if (Math.abs(duration.toHours()) >= groupCalc.getFilter_hour()) { filterData.filterCycleHour = (int) duration.toHours(); } filterCycle = filterData.filterCycleHour; @@ -223,8 +203,12 @@ public class GNSSDeviceLocationRecordServiceImpl implements GNSSDeviceLocationRe @Override public void updateRb562(String deviceId, LocalDateTime afterTime){ // 获取平滑参数 - //refreshCalcParams(gnssDevice.getCalc_group_id()); - LocalDateTime beforTime = afterTime.plusHours(shortCycleHour); + GnssDevice gnssDevice = gnssDeviceRepository.queryByDeviceId(deviceId); + if(gnssDevice == null) return; + GnssGroupCalc groupCalc = getCalcParams(gnssDevice.getCalc_group_id()); + + // 平滑处理 + LocalDateTime beforTime = afterTime.plusHours(groupCalc.getFilter_hour()); QueryWrapper query = new QueryWrapper<>(); query.eq("deviceid", deviceId); query.ge("createtime", beforTime.format(dateFormatter)); @@ -232,8 +216,9 @@ public class GNSSDeviceLocationRecordServiceImpl implements GNSSDeviceLocationRe List calcDataListToUpdate = repository.selectList(query); for(GnssCalcData calcData:calcDataListToUpdate){ - if(calcData.getEnabled() && calcData.getRb562e()==null) { - calcFilterLocation(calcData, shortCycleHour); + if(calcData.getEnabled()) { + calcFilterLocation(calcData, groupCalc.getFilter_hour(), + groupCalc.getXy_threshold(), groupCalc.getZ_threshold()); repository.updateById(calcData); logger.info(deviceId + " update rb562"); }