From 7c0d083f31217f84ecf4cb8009891a088a099624 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期一, 10 八月 2026 17:17:40 +0800
Subject: [PATCH] 修改bug

---
 UserFBTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/SiteServiceImpl.java |   90 +++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 82 insertions(+), 8 deletions(-)

diff --git a/UserFBTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/SiteServiceImpl.java b/UserFBTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/SiteServiceImpl.java
index 1bf87c0..ace894d 100644
--- a/UserFBTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/SiteServiceImpl.java
+++ b/UserFBTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/SiteServiceImpl.java
@@ -1,14 +1,11 @@
 package com.stylefeng.guns.modular.crossCity.server.impl;
 
-import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.service.impl.ServiceImpl;
 import com.stylefeng.guns.modular.crossCity.dao.LocationMapper;
 import com.stylefeng.guns.modular.crossCity.dao.SiteMapper;
 import com.stylefeng.guns.modular.crossCity.model.Site;
 import com.stylefeng.guns.modular.crossCity.server.ISiteService;
 import com.stylefeng.guns.modular.crossCity.warpper.SiteWarpper;
-import com.stylefeng.guns.modular.system.util.GDMapElectricFenceUtil;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -24,8 +21,7 @@
     @Resource
     private LocationMapper locationMapper;
 
-    @Autowired
-    private GDMapElectricFenceUtil gdMapElectricFenceUtil;
+    private static final double COORDINATE_EPSILON = 1E-10;
 
 
     /**
@@ -109,9 +105,8 @@
                 }
             }
             if(Integer.valueOf(map.get("type").toString()) == 2){//电子围栏
-                String gid = map.get("gid").toString();
-                List<String> list1 = gdMapElectricFenceUtil.monitorElectricFenc("", lonLat);
-                if(list1.contains(gid)){
+                Object coordinate = map.get("coordinate");
+                if(coordinate != null && isPointInElectronicFence(lonLat, coordinate.toString())){
                     return true;
                 }
                 continue;
@@ -120,6 +115,85 @@
         return false;
     }
 
+    static boolean isPointInElectronicFence(String lonLat, String coordinate) {
+        double[] point = parseCoordinate(lonLat);
+        if (point == null || coordinate == null || coordinate.trim().isEmpty()) {
+            return false;
+        }
+        String[] fences = coordinate.split("_");
+        for (String fence : fences) {
+            String[] coordinatePoints = fence.split(";");
+            if (coordinatePoints.length < 3) {
+                continue;
+            }
+            List<double[]> polygon = new ArrayList<>();
+            boolean validPolygon = true;
+            for (String coordinatePoint : coordinatePoints) {
+                double[] vertex = parseCoordinate(coordinatePoint);
+                if (vertex == null) {
+                    validPolygon = false;
+                    break;
+                }
+                polygon.add(vertex);
+            }
+            if (validPolygon && isPointInPolygon(point, polygon)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private static double[] parseCoordinate(String coordinate) {
+        if (coordinate == null || coordinate.trim().isEmpty()) {
+            return null;
+        }
+        String[] values = coordinate.trim().split(",");
+        if (values.length != 2) {
+            return null;
+        }
+        try {
+            double longitude = Double.parseDouble(values[0].trim());
+            double latitude = Double.parseDouble(values[1].trim());
+            if (Double.isNaN(longitude) || Double.isInfinite(longitude)
+                    || Double.isNaN(latitude) || Double.isInfinite(latitude)) {
+                return null;
+            }
+            return new double[]{longitude, latitude};
+        } catch (NumberFormatException e) {
+            return null;
+        }
+    }
+
+    private static boolean isPointInPolygon(double[] point, List<double[]> polygon) {
+        boolean inside = false;
+        for (int i = 0, j = polygon.size() - 1; i < polygon.size(); j = i++) {
+            double[] start = polygon.get(j);
+            double[] end = polygon.get(i);
+            if (isPointOnSegment(point, start, end)) {
+                return true;
+            }
+            boolean intersects = (start[1] > point[1]) != (end[1] > point[1])
+                    && point[0] < (end[0] - start[0]) * (point[1] - start[1])
+                    / (end[1] - start[1]) + start[0];
+            if (intersects) {
+                inside = !inside;
+            }
+        }
+        return inside;
+    }
+
+    private static boolean isPointOnSegment(double[] point, double[] start, double[] end) {
+        double crossProduct = (point[0] - start[0]) * (end[1] - start[1])
+                - (point[1] - start[1]) * (end[0] - start[0]);
+        if (Math.abs(crossProduct) > COORDINATE_EPSILON) {
+            return false;
+        }
+        return point[0] >= Math.min(start[0], end[0]) - COORDINATE_EPSILON
+                && point[0] <= Math.max(start[0], end[0]) + COORDINATE_EPSILON
+                && point[1] >= Math.min(start[1], end[1]) - COORDINATE_EPSILON
+                && point[1] <= Math.max(start[1], end[1]) + COORDINATE_EPSILON;
+    }
+
     /**
      * 根据站点id获取地点区域
      * @param siteId

--
Gitblit v1.7.1