From 67d4d5baacbeeea06cf3245ca50c2d14aa6cab36 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期五, 20 三月 2026 01:32:04 +0800
Subject: [PATCH] 修改计算剩余轨迹导航逻辑

---
 xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/utils/MapMatchingUtil.java |   85 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 85 insertions(+), 0 deletions(-)

diff --git a/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/utils/MapMatchingUtil.java b/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/utils/MapMatchingUtil.java
index 5784d42..f621649 100644
--- a/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/utils/MapMatchingUtil.java
+++ b/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/utils/MapMatchingUtil.java
@@ -2,14 +2,99 @@
 
 import com.xiaopeng.api.dto.operation.LonLatDto;
 import lombok.extern.slf4j.Slf4j;
+import org.gavaghan.geodesy.Ellipsoid;
+import org.gavaghan.geodesy.GeodeticCalculator;
+import org.gavaghan.geodesy.GeodeticCurve;
+import org.gavaghan.geodesy.GlobalCoordinates;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.concurrent.*;
+
 
 @Slf4j
 public class MapMatchingUtil {
 
+
+
+
+    /**
+     * 获取剩余导航数据
+     * @param polyline
+     * @param longitude
+     * @param latitude
+     * @return
+     */
+    public static List<LonLatDto> getRemainingNavigation(List<LonLatDto> polyline, Double longitude, Double latitude){
+        //导航数据只有一个点的情况
+        if(polyline.size() == 1){
+            LonLatDto lonLatDto = polyline.get(0);
+            GlobalCoordinates source1 = new GlobalCoordinates(lonLatDto.getLatitude(), lonLatDto.getLongitude());
+            GlobalCoordinates target1 = new GlobalCoordinates(latitude, longitude);
+            GeodeticCurve geoCurve1 = new GeodeticCalculator().calculateGeodeticCurve(Ellipsoid.WGS84, source1, target1);
+            double distance =geoCurve1.getEllipsoidalDistance();
+            //判断距离小于5米,则可以返回空数据
+            if(5 >= distance){
+                return Collections.emptyList();
+            }
+            //大于5米的情况,将车子当前位置添加进结果中
+            lonLatDto = new LonLatDto(longitude, latitude);
+            polyline.add(0, lonLatDto);
+            return polyline;
+        }
+        //多个点位的情况,需要找出当前点位处于那两个点位之间,然后截取掉超出的部分轨迹
+        return getRecentlyPoint(polyline, longitude, latitude);
+    }
+
+
+    /**
+     * 判断点位在轨迹线路中的点位之间
+     * 返回截取后的剩余轨迹
+     * @param polyline
+     * @param longitude
+     * @param latitude
+     * @return
+     */
+    public static List<LonLatDto> getRecentlyPoint(List<LonLatDto> polyline, Double longitude, Double latitude){
+        for (int i = 0; i < polyline.size(); i++) {
+            LonLatDto lonLatDto1 = polyline.get(i);
+
+            GlobalCoordinates source1 = new GlobalCoordinates(lonLatDto1.getLatitude(), lonLatDto1.getLongitude());
+            GlobalCoordinates target1 = new GlobalCoordinates(latitude, longitude);
+            GeodeticCurve geoCurve1 = new GeodeticCalculator().calculateGeodeticCurve(Ellipsoid.WGS84, source1, target1);
+            double distance1 =geoCurve1.getEllipsoidalDistance();
+
+            LonLatDto lonLatDto2 = polyline.get(i + 1);
+            GlobalCoordinates source2 = new GlobalCoordinates(lonLatDto2.getLatitude(), lonLatDto2.getLongitude());
+            GlobalCoordinates target2 = new GlobalCoordinates(latitude, longitude);
+            GeodeticCurve geoCurve2 = new GeodeticCalculator().calculateGeodeticCurve(Ellipsoid.WGS84, source2, target2);
+            double distance2 =geoCurve2.getEllipsoidalDistance();
+
+
+            GlobalCoordinates source3 = new GlobalCoordinates(lonLatDto1.getLatitude(), lonLatDto1.getLongitude());
+            GlobalCoordinates target3 = new GlobalCoordinates(lonLatDto2.getLatitude(), lonLatDto2.getLongitude());
+            GeodeticCurve geoCurve3 = new GeodeticCalculator().calculateGeodeticCurve(Ellipsoid.WGS84, source3, target3);
+            double distance3 =geoCurve3.getEllipsoidalDistance();
+
+            //判断当前位置是否处于两个点位之间
+            if((distance1 + distance2) == distance3 || (distance1 + distance2) <= distance3 + 5){
+                //取距离最近的点位数据
+                if(distance1 < distance2){
+                    return polyline.subList(i, polyline.size() - 1);
+                }
+                return polyline.subList(i + 1, polyline.size() - 1);
+            }
+        }
+        return Collections.emptyList();
+    }
+
+
+
+
+
+
+
     /**
      * 轨迹裁剪(线段版本)
      * @param polyline

--
Gitblit v1.7.1