From ef32f6913325bb593d537b4ff433545f73ecb79a Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期三, 11 三月 2026 10:00:32 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpElectronicFenceServiceImpl.java |   53 +++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 49 insertions(+), 4 deletions(-)

diff --git a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpElectronicFenceServiceImpl.java b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpElectronicFenceServiceImpl.java
index 5f49af6..de03958 100644
--- a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpElectronicFenceServiceImpl.java
+++ b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpElectronicFenceServiceImpl.java
@@ -31,6 +31,10 @@
 import com.xiaopeng.map.utils.PolygonOverlapService;
 import lombok.extern.slf4j.Slf4j;
 import net.sourceforge.pinyin4j.PinyinHelper;
+import org.locationtech.jts.geom.Coordinate;
+import org.locationtech.jts.geom.GeometryFactory;
+import org.locationtech.jts.geom.LinearRing;
+import org.locationtech.jts.geom.Polygon;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.geo.Point;
 import org.springframework.data.mongodb.core.MongoTemplate;
@@ -40,6 +44,7 @@
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.awt.geom.Point2D;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.List;
@@ -126,6 +131,11 @@
 
         // 检查新区域与现有运营区域是否有重叠
         for (XpElectronicFenceArea newArea : newElectronicFenceAreas) {
+            //处理围栏闭合
+            String[] split = newArea.getFencePoints().split(",");
+            if(!split[0].equals(split[split.length - 1])){
+                newArea.setFencePoints(newArea.getFencePoints() + "," + split[0]);
+            }
             if (newArea.getAreaType() == 1) { // 只检查运营区域
                 for (XpElectronicFenceArea existingArea : existingOperationAreas) {
                     if (polygonOverlapService.checkPolygonOverlap(
@@ -165,8 +175,14 @@
 
         //根据经纬度获取当前城市code
         XpElectronicFenceArea xpElectronicFenceArea = dto.getElectronicFenceAreas().get(0);
-        String[] split = xpElectronicFenceArea.getFencePoints().split(",")[0].split("_");
-        Map<String, String> geocode = gdMapGeocodingUtil.geocode(split[0], split[1]);
+        String[] split = xpElectronicFenceArea.getFencePoints().split(",");
+        Coordinate[] coordinates = new Coordinate[split.length + 1];
+        for (int i = 0; i < split.length; i++) {
+            String[] split1 = split[i].split("_");
+            coordinates[i] = new Coordinate(Double.parseDouble(split1[0]), Double.parseDouble(split1[1]));
+        }
+        org.locationtech.jts.geom.Point point = calculateCentroid(coordinates);
+        Map<String, String> geocode = gdMapGeocodingUtil.geocode(point.getX() + "", point.getY() + "");
         if(null == geocode){
             return R.fail("经纬度转换城市code失败");
         }
@@ -304,6 +320,11 @@
 
             // 检查更新后的区域与现有运营区域是否有重叠
             for (XpElectronicFenceArea updatedArea : updatedElectronicFenceAreas) {
+                //处理围栏闭合
+                String[] split = updatedArea.getFencePoints().split(",");
+                if(!split[0].equals(split[split.length - 1])){
+                    updatedArea.setFencePoints(updatedArea.getFencePoints() + "," + split[0]);
+                }
                 if (updatedArea.getAreaType() == 1) { // 只检查运营区域
                     for (XpElectronicFenceArea existingArea : existingOperationAreas) {
                         if (polygonOverlapService.checkPolygonOverlap(
@@ -382,8 +403,14 @@
             }
             //根据经纬度获取当前城市code
             XpElectronicFenceArea electronicFenceArea = dto.getElectronicFenceAreas().get(0);
-            String[] split = electronicFenceArea.getFencePoints().split(",")[0].split("_");
-            Map<String, String> geocode = gdMapGeocodingUtil.geocode(split[0], split[1]);
+            String[] split = electronicFenceArea.getFencePoints().split(",");
+            Coordinate[] coordinates = new Coordinate[split.length];
+            for (int i = 0; i < split.length; i++) {
+                String[] split1 = split[i].split("_");
+                coordinates[i] = new Coordinate(Double.parseDouble(split1[0]), Double.parseDouble(split1[1]));
+            }
+            org.locationtech.jts.geom.Point point = calculateCentroid(coordinates);
+            Map<String, String> geocode = gdMapGeocodingUtil.geocode(point.getX() + "", point.getY() + "");
             if(null == geocode){
                 return R.fail("经纬度转换城市code失败");
             }
@@ -696,4 +723,22 @@
     }
 
 
+    /**
+     * 计算围栏中心点
+     * @param coordinates
+     * @return
+     */
+    private org.locationtech.jts.geom.Point calculateCentroid(Coordinate[] coordinates) {
+        GeometryFactory factory = new GeometryFactory();
+        // 创建线性环 (LinearRing)
+        LinearRing ring = factory.createLinearRing(coordinates);
+        // 创建多边形 (Polygon)
+        Polygon polygon = factory.createPolygon(ring);
+        // 计算质心 (Centroid)
+        org.locationtech.jts.geom.Point centroid = polygon.getCentroid();
+
+        System.out.println("中心点经度: " + centroid.getX());
+        System.out.println("中心点纬度: " + centroid.getY());
+        return centroid;
+    }
 }

--
Gitblit v1.7.1