ZTD出现两小时的周期,增加四小时的滤波

This commit is contained in:
zms 2025-05-21 10:54:40 +08:00
parent a652a0d272
commit 71412f5ac4
4 changed files with 127 additions and 0 deletions

View File

@ -0,0 +1,35 @@
package com.rtklib.entity;
import lombok.Data;
import jakarta.persistence.*;
import java.time.LocalDateTime;
@Data
@Entity
@Table(name = "rtk_data_average")
public class RtkDataAverage {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "start_time")
private LocalDateTime startTime;
@Column(name = "end_time")
private LocalDateTime endTime;
@Column(name = "average_latitude")
private Double averageLatitude;
@Column(name = "average_longitude")
private Double averageLongitude;
@Column(name = "average_height")
private Double averageHeight;
@Column(name = "average_ztd")
private Double averageZtd;
@Column(name = "device_id")
private String deviceId;
}

View File

@ -0,0 +1,9 @@
package com.rtklib.repository;
import com.rtklib.entity.RtkDataAverage;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface RtkDataAverageRepository extends JpaRepository<RtkDataAverage, Long> {
}

View File

@ -3,7 +3,10 @@ package com.rtklib.repository;
import com.rtklib.entity.RtkData; import com.rtklib.entity.RtkData;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.time.LocalDateTime;
import java.util.List;
@Repository @Repository
public interface RtkDataRepository extends JpaRepository<RtkData, Long> { public interface RtkDataRepository extends JpaRepository<RtkData, Long> {
List<RtkData> findByTimestampBetween(LocalDateTime startTime, LocalDateTime endTime);
} }

View File

@ -0,0 +1,80 @@
package com.rtklib.service;
import com.rtklib.entity.RtkData;
import com.rtklib.entity.RtkDataAverage;
import com.rtklib.repository.RtkDataRepository;
import com.rtklib.repository.RtkDataAverageRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
@Service
public class RtkDataAverageService {
private static final Logger logger = LoggerFactory.getLogger(RtkDataAverageService.class);
@Autowired
private RtkDataRepository rtkDataRepository;
@Autowired
private RtkDataAverageRepository rtkDataAverageRepository;
@Scheduled(fixedRate = 600000) // 每10分钟执行一次
public void calculateAndSaveAverages() {
try {
LocalDateTime endTime = LocalDateTime.now();
LocalDateTime startTime = endTime.minusHours(4);
// 获取过去4小时内的所有数据
List<RtkData> dataList = rtkDataRepository.findByTimestampBetween(startTime, endTime);
if (dataList.isEmpty()) {
logger.warn("No data found for the period between {} and {}", startTime, endTime);
return;
}
// 计算平均值
double avgLatitude = dataList.stream()
.mapToDouble(RtkData::getLatitude)
.average()
.orElse(0.0);
double avgLongitude = dataList.stream()
.mapToDouble(RtkData::getLongitude)
.average()
.orElse(0.0);
double avgHeight = dataList.stream()
.mapToDouble(RtkData::getHeight)
.average()
.orElse(0.0);
double avgZtd = dataList.stream()
.mapToDouble(RtkData::getZtd)
.average()
.orElse(0.0);
// 获取设备ID使用第一个数据的设备ID
String deviceId = dataList.get(0).getDeviceId();
// 创建并保存平均值记录
RtkDataAverage average = new RtkDataAverage();
average.setStartTime(startTime);
average.setEndTime(endTime);
average.setAverageLatitude(avgLatitude);
average.setAverageLongitude(avgLongitude);
average.setAverageHeight(avgHeight);
average.setAverageZtd(avgZtd);
average.setDeviceId(deviceId);
rtkDataAverageRepository.save(average);
logger.info("Successfully saved 4-hour average data for period {} to {}", startTime, endTime);
} catch (Exception e) {
logger.error("Error calculating and saving averages: {}", e.getMessage(), e);
}
}
}