From 77337135d875cf3ee046e7ca2e3992924d3b6e79 Mon Sep 17 00:00:00 2001
From: ‘liusuyi’ <1951119284@qq.com>
Date: Tue, 22 Aug 2023 09:40:52 +0800
Subject: [PATCH] 一键调度增加按多边形获取人车相机

---
 ard-work/src/main/java/com/ruoyi/utils/tools/GisTool.java |  109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 109 insertions(+), 0 deletions(-)

diff --git a/ard-work/src/main/java/com/ruoyi/utils/tools/GisTool.java b/ard-work/src/main/java/com/ruoyi/utils/tools/GisTool.java
index 661fd91..bb36308 100644
--- a/ard-work/src/main/java/com/ruoyi/utils/tools/GisTool.java
+++ b/ard-work/src/main/java/com/ruoyi/utils/tools/GisTool.java
@@ -4,6 +4,10 @@
 import org.gavaghan.geodesy.GeodeticCalculator;
 import org.gavaghan.geodesy.GlobalCoordinates;
 
+import java.awt.geom.Point2D;
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * @Description:
  * @ClassName: GisTool
@@ -29,4 +33,109 @@
         GlobalCoordinates target = new GlobalCoordinates(latitudeTo, longitudeTo);
         return geodeticCalculator.calculateGeodeticCurve(Ellipsoid.WGS84, source, target).getEllipsoidalDistance();
     }
+
+    public static void main(String[] args) {
+        // 被检测的经纬度点
+        Point2D point2D= new Point2D.Double(126.649261,45.687377);
+        // 商业区域(百度多边形区域经纬度集合)
+        List<Point2D> partitionLocation = new ArrayList<>();
+        partitionLocation.add(new Point2D.Double(126.64459,45.688548));
+        partitionLocation.add(new Point2D.Double(126.653376,45.68938));
+        partitionLocation.add(new Point2D.Double(126.645776,45.685048));
+        partitionLocation.add(new Point2D.Double(126.654184,45.685778));
+        System.out.println(isInPolygon(point2D,partitionLocation));
+    }
+
+    /**
+     * 判断当前位置是否在多边形区域内
+     * @param orderLocation 当前点
+     * @param partitionLocation 区域顶点
+     * @return
+     */
+    public static boolean isInPolygon(Point2D orderLocation,List<Point2D> partitionLocation){
+
+        double p_x =orderLocation.getX();
+        double p_y =orderLocation.getY();
+        Point2D.Double point = new Point2D.Double(p_x, p_y);
+
+        List<Point2D.Double> pointList= new ArrayList<Point2D.Double>();
+
+        for (Point2D points : partitionLocation){
+            double polygonPoint_x=points.getX();
+            double polygonPoint_y=points.getY();
+            Point2D.Double polygonPoint = new Point2D.Double(polygonPoint_x,polygonPoint_y);
+            pointList.add(polygonPoint);
+        }
+        return IsPtInPoly(point,pointList);
+    }
+    /**
+     * 判断点是否在多边形内,如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true
+     * @param point 检测点
+     * @param pts   多边形的顶点
+     * @return      点在多边形内返回true,否则返回false
+     */
+    public static boolean IsPtInPoly(Point2D.Double point, List<Point2D.Double> pts){
+
+        int N = pts.size();
+        boolean boundOrVertex = true; //如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true
+        int intersectCount = 0;//cross points count of x
+        double precision = 2e-10; //浮点类型计算时候与0比较时候的容差
+        Point2D.Double p1, p2;//neighbour bound vertices
+        Point2D.Double p = point; //当前点
+
+        p1 = pts.get(0);//left vertex
+        for(int i = 1; i <= N; ++i){//check all rays
+            if(p.equals(p1)){
+                return boundOrVertex;//p is an vertex
+            }
+
+            p2 = pts.get(i % N);
+            if(p.x < Math.min(p1.x, p2.x) || p.x > Math.max(p1.x, p2.x)){
+                p1 = p2;
+                continue;
+            }
+
+            if(p.x > Math.min(p1.x, p2.x) && p.x < Math.max(p1.x, p2.x)){
+                if(p.y <= Math.max(p1.y, p2.y)){
+                    if(p1.x == p2.x && p.y >= Math.min(p1.y, p2.y)){
+                        return boundOrVertex;
+                    }
+
+                    if(p1.y == p2.y){
+                        if(p1.y == p.y){
+                            return boundOrVertex;
+                        }else{//before ray
+                            ++intersectCount;
+                        }
+                    }else{
+                        double xinters = (p.x - p1.x) * (p2.y - p1.y) / (p2.x - p1.x) + p1.y;
+                        if(Math.abs(p.y - xinters) < precision){
+                            return boundOrVertex;
+                        }
+
+                        if(p.y < xinters){
+                            ++intersectCount;
+                        }
+                    }
+                }
+            }else{
+                if(p.x == p2.x && p.y <= p2.y){
+                    Point2D.Double p3 = pts.get((i+1) % N);
+                    if(p.x >= Math.min(p1.x, p3.x) && p.x <= Math.max(p1.x, p3.x)){
+                        ++intersectCount;
+                    }else{
+                        intersectCount += 2;
+                    }
+                }
+            }
+            p1 = p2;
+        }
+
+        if(intersectCount % 2 == 0){//偶数在多边形外
+            return false;
+        } else { //奇数在多边形内
+            return true;
+        }
+    }
+
 }

--
Gitblit v1.9.3