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