From 58d8355d6f03478a60219a3cf8ed7172b2086b05 Mon Sep 17 00:00:00 2001 From: weidong Date: Mon, 11 Dec 2023 06:53:27 +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 --- .../calc/MultiLineGNSSCalcService.java | 8 ++- .../GNSSDeviceLocationRecordService.java | 4 +- .../GNSSDeviceLocationRecordServiceImpl.java | 64 ++++++++++++------- 3 files changed, 50 insertions(+), 26 deletions(-) diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/MultiLineGNSSCalcService.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/MultiLineGNSSCalcService.java index 0c7583cd..f062b11c 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/MultiLineGNSSCalcService.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/MultiLineGNSSCalcService.java @@ -31,7 +31,13 @@ public class MultiLineGNSSCalcService { if(msgTime!=null) logger.info("proc D342: "+msgTime+" D341 num: "+d341Count); if(lastDate != null){ - if(d341Count == 0 || (msgTime!=null && msgTime.isAfter(lastDate.plusMinutes(1)))){ + if(d341Count == 0){ + // 计算上轮结果 + calcService.calSingleDone(deviceId, d342Message.getTenantId(),lastDate); + // 重算最近的 + dataPersistService.updateRb562(deviceId,lastDate); + } + else if(msgTime!=null && msgTime.isAfter(lastDate.plusMinutes(1))){ // 计算上轮结果 calcService.calSingleDone(deviceId, d342Message.getTenantId(),lastDate); } diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/GNSSDeviceLocationRecordService.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/GNSSDeviceLocationRecordService.java index fae93859..5b9f9851 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/GNSSDeviceLocationRecordService.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/GNSSDeviceLocationRecordService.java @@ -3,13 +3,15 @@ package com.imdroid.sideslope.service; import com.imdroid.secapi.dto.GnssCalcData; import com.imdroid.sideslope.message.D341LocationMessage; +import java.time.LocalDateTime; + /** * @author Layton * @date 2023/2/4 20:18 */ public interface GNSSDeviceLocationRecordService { - void save(GnssCalcData locationRecord, boolean isExceed) throws Exception; void saveRawData(D341LocationMessage message); + void updateRb562(String deviceId, LocalDateTime afterTime); } 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 517e06d0..1940ba12 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 @@ -36,13 +36,8 @@ public class GNSSDeviceLocationRecordServiceImpl implements GNSSDeviceLocationRe @Autowired private GnssGroupCalcMapper groupCalcMapper; - @Autowired - //private RabbitTemplate rabbitTemplate; - ThirdPartyClient thirdPartyClient; - public static final int FILTER_SHORT_CYCLE_HOUR = 4; public static final int FILTER_LONG_CYCLE_HOUR = 25; - static final int FILTER_MAX_RECORD_NUM = 50; static final int FILTER_MIN_RECORD_NUM = 10; static final double XY_THRESHOLD = 30; //水平异常点30mm static final double Z_THRESHOLD = 30; //高程异常点30mm @@ -73,7 +68,20 @@ public class GNSSDeviceLocationRecordServiceImpl implements GNSSDeviceLocationRe locationRecord.setEnabled(true); // 获取平滑参数 - GnssGroupCalc calcParam = groupCalcMapper.selectById(gnssDevice.getCalc_group_id()); + refreshCalcParams(gnssDevice.getCalc_group_id()); + + // 平滑处理 + int filterCycle = shortCycleHour; + if(enableAutoFilter) { + filterCycle = calcFilterCycle(locationRecord.getDeviceid(), isExceed); + } + calcFilterLocation(locationRecord, filterCycle); + + repository.insert(locationRecord); + } + + void refreshCalcParams(int calcGroupId){ + GnssGroupCalc calcParam = groupCalcMapper.selectById(calcGroupId); if(calcParam != null){ if(calcParam.getXy_threshold()!=null){ xyThreshold = calcParam.getXy_threshold(); @@ -98,27 +106,12 @@ public class GNSSDeviceLocationRecordServiceImpl implements GNSSDeviceLocationRe zThreshold = Z_THRESHOLD; //高程异常点50mm longCycleHour = FILTER_LONG_CYCLE_HOUR; } - - // 平滑处理 - int filterCycle = shortCycleHour; - if(enableAutoFilter) { - filterCycle = calcFilterCycle(locationRecord.getDeviceid(), isExceed); - } - double[] avgEND = calcFilterLocation(locationRecord, filterCycle); - if(avgEND!=null) { - locationRecord.setRb562e(NumberUtils.scaleTwo(avgEND[0])); - locationRecord.setRb562n(NumberUtils.scaleTwo(avgEND[1])); - locationRecord.setRb562d(NumberUtils.scaleTwo(avgEND[2])); - } - - repository.insert(locationRecord); - if(avgEND!=null) thirdPartyClient.send(locationRecord); } /** * 计算东北天的最近融合数据的加权平均, 刘畅20230725 copy 自 avgEND; id>20, 滤波参数6h 或 25h */ - public double[] calcFilterLocation(GnssCalcData newRecord, int filterCycleHour){ + public boolean calcFilterLocation(GnssCalcData newRecord, int filterCycleHour){ String deviceId = newRecord.getDeviceid(); // 选取[newRecordTime-filterCycleHour, newRcordTime]之间的记录做平滑 // 如果这个时间段的记录数少于FILTER_MIN_RECORD_NUM,本次不做平滑 @@ -160,12 +153,15 @@ public class GNSSDeviceLocationRecordServiceImpl implements GNSSDeviceLocationRe } logger.info(deviceId + " filter records num: " + count); if (count >= FILTER_MIN_RECORD_NUM) { - return new double[]{sumE / count, sumN / count, sumD / count}; + newRecord.setRb562e(NumberUtils.scaleTwo(sumE / count)); + newRecord.setRb562n(NumberUtils.scaleTwo(sumN / count)); + newRecord.setRb562d(NumberUtils.scaleTwo(sumD / count)); + return true; } } } - return null; + return false; } @Override @@ -223,4 +219,24 @@ public class GNSSDeviceLocationRecordServiceImpl implements GNSSDeviceLocationRe } return filterCycle; } + + @Override + public void updateRb562(String deviceId, LocalDateTime afterTime){ + // 获取平滑参数 + //refreshCalcParams(gnssDevice.getCalc_group_id()); + LocalDateTime beforTime = afterTime.plusHours(shortCycleHour); + QueryWrapper query = new QueryWrapper<>(); + query.eq("deviceid", deviceId); + query.ge("createtime", beforTime.format(dateFormatter)); + query.le("createtime", afterTime.format(dateFormatter)); + + List calcDataListToUpdate = repository.selectList(query); + for(GnssCalcData calcData:calcDataListToUpdate){ + if(calcData.getEnabled() && calcData.getRb562e()==null) { + calcFilterLocation(calcData, shortCycleHour); + repository.updateById(calcData); + logger.info(deviceId + " update rb562"); + } + } + } }