package com.xiaopeng.map.utils;
|
|
import lombok.extern.slf4j.Slf4j;
|
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.stereotype.Component;
|
|
@Component
|
@Slf4j
|
public class PolygonOverlapService {
|
|
/**
|
* 检查两个多边形是否重叠
|
* @param polygon1Points 多边形1的坐标点 "lng1_lat1,lng2_lat2,..."
|
* @param polygon2Points 多边形2的坐标点 "lng1_lat1,lng2_lat2,..."
|
* @return 是否重叠
|
*/
|
public boolean checkPolygonOverlap(String polygon1Points, String polygon2Points) {
|
try {
|
Polygon polygon1 = createPolygonFromPoints(polygon1Points);
|
Polygon polygon2 = createPolygonFromPoints(polygon2Points);
|
|
// 使用 JTS 库判断多边形是否相交
|
return polygon1.intersects(polygon2);
|
} catch (Exception e) {
|
log.error("多边形重叠检测失败", e);
|
return false; // 发生错误时默认不重叠,可根据业务需要调整
|
}
|
}
|
|
/**
|
* 从坐标点字符串创建多边形
|
* @param pointsStr 坐标点字符串 "lng1_lat1,lng2_lat2,lng3_lat3,..."
|
* @return JTS Polygon 对象
|
*/
|
private Polygon createPolygonFromPoints(String pointsStr) {
|
if (!pointsStr.contains(",")) {
|
throw new IllegalArgumentException("无效的坐标点格式");
|
}
|
|
String[] pointPairs = pointsStr.split(",");
|
Coordinate[] coordinates = new Coordinate[pointPairs.length + 1]; // +1 是为了闭合多边形
|
|
for (int i = 0; i < pointPairs.length; i++) {
|
String[] lngLat = pointPairs[i].trim().split("_");
|
if (lngLat.length != 2) {
|
throw new IllegalArgumentException("坐标点格式错误: " + pointPairs[i]);
|
}
|
|
double lng = Double.parseDouble(lngLat[0]);
|
double lat = Double.parseDouble(lngLat[1]);
|
coordinates[i] = new Coordinate(lng, lat);
|
}
|
|
// 闭合多边形,最后一个点与第一个点相同
|
coordinates[coordinates.length - 1] = coordinates[0];
|
|
GeometryFactory geometryFactory = new GeometryFactory();
|
LinearRing linearRing = geometryFactory.createLinearRing(coordinates);
|
return geometryFactory.createPolygon(linearRing);
|
}
|
}
|