From d5c2b069bb295be3a1e48e46bba87ac8bb811b25 Mon Sep 17 00:00:00 2001 From: yarnom Date: Wed, 29 Oct 2025 18:36:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9EgeoidSeparation?= =?UTF-8?q?=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rtkcluster/RtkrcvConfigService.java | 38 +++++++++++++++++-- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/rtkcluster/RtkrcvConfigService.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/rtkcluster/RtkrcvConfigService.java index b0d55885..25ffcc09 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/rtkcluster/RtkrcvConfigService.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/rtkcluster/RtkrcvConfigService.java @@ -3,6 +3,9 @@ package com.imdroid.sideslope.rtkcluster; import com.imdroid.secapi.dto.RtkrcvProfile; import com.imdroid.secapi.dto.RtkrcvGroup; import com.imdroid.secapi.dto.RtkrcvGroupMapper; +import com.imdroid.secapi.dto.RtkrcvProfileMapper; +import com.imdroid.sideslope.service.DeviceService; +import com.imdroid.sideslope.service.Device; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; @@ -34,6 +37,10 @@ public class RtkrcvConfigService { @Autowired(required = false) private RtkrcvGroupMapper groupMapper; + @Autowired + private DeviceService deviceService; + @Autowired + private RtkrcvProfileMapper profileMapper; /** * Generate an RTKLIB rtkrcv config file from template using profile values. @@ -58,6 +65,12 @@ public class RtkrcvConfigService { List rendered = new ArrayList<>(lines.size()); Map fromGroup = loadGroupConfig(profile); + // Determine out-height from device geoidSeparation and write back to profile + int computedOutHeight = computeOutHeightFromDevice(profile.getDeviceId()); + try { + profile.setOutHeight(computedOutHeight); + profileMapper.updateById(profile); + } catch (Exception ignore) {} for (String line : lines) { String replaced = line; if (!fromGroup.isEmpty()) { @@ -81,9 +94,7 @@ public class RtkrcvConfigService { replaced = replaceValueLine(replaced, "misc-timeout", "300000"); replaced = replaceValueLine(replaced, "misc-reconnect", "3000"); } - Integer outHeight = profile.getOutHeight(); - int heightValue = (outHeight == null) ? 1 : (outHeight == 0 ? 0 : 1); - replaced = replaceValueLine(replaced, "out-height", String.valueOf(heightValue)); + replaced = replaceValueLine(replaced, "out-height", String.valueOf(computedOutHeight)); rendered.add(replaced); } @@ -130,6 +141,27 @@ public class RtkrcvConfigService { if (value != null) map.put(key, value); } + private int computeOutHeightFromDevice(String deviceId) { + try { + Device device = deviceService.findByDeviceId(deviceId); + if (device != null) { + Double gsep = device.getGeoidSeparation(); + Double lat = device.getLatitude(); + Double lon = device.getLongitude(); + Double alt = device.getAltitude(); + LOGGER.info("[device:{}] lat={}, lon={}, alt={}, geoidSeparation={}", + deviceId, lat, lon, alt, gsep); + if (gsep != null) { + return (Math.abs(gsep) == 0.0) ? 0 : 1; + } + } + } catch (Exception e) { + LOGGER.warn("computeOutHeightFromDevice error for {}: {}", deviceId, e.getMessage()); + } + // default to 1 (geodetic) if unknown + return 1; + } + private List readTemplateLines() throws IOException { ClassPathResource resource = new ClassPathResource("rtkrcv_default.conf"); if (!resource.exists()) {