package com.nari.visualization.Utils;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.List;
/**
* @description : 根据经纬度判断某个点是否在某个区域内
* @author : wjg
* @Date : 2024/4/12 8:45
*/
public class LocationUtils {
public static void main(String[] args) {
// 被检测的经纬度点
String X = "44.969819";
String Y = "77.337736";
// 商业区域(百度多边形区域经纬度集合)
String partitionLocation = "116.377679_39.911113,116.378052_39.911085,116.378047_39.910933,116.377679_39.910937";
System.out.println(isInPolygon(X, Y, partitionLocation));
}
/**
* 判断当前位置是否在多边形区域内
*
* @param
* @param partitionLocation 区域顶点
* @return
*/
public static boolean isInPolygon(String X, String Y, String partitionLocation) {
double p_x = Double.parseDouble(X);
double p_y = Double.parseDouble(Y);
Point2D.Double point = new Point2D.Double(p_x, p_y);
List<Point2D.Double> pointList = new ArrayList<Point2D.Double>();
String[] strList = partitionLocation.split(",");
for (String str : strList) {
String[] points = str.split("_");
double polygonPoint_x = Double.parseDouble(points[0]);
double polygonPoint_y = Double.parseDouble(points[1]);
Point2D.Double polygonPoint = new Point2D.Double(polygonPoint_x, polygonPoint_y);
pointList.add(polygonPoint);
}
return IsPtInPoly(point, pointList);
}
/**
* 返回一个点是否在一个多边形区域内, 如果点位于多边形的顶点或边上,不算做点在多边形内,返回false
*
* @param point
* @param polygon
* @return
*/
public static boolean checkWithJdkGeneralPath(Point2D.Double point, List<Point2D.Double> polygon) {
java.awt.geom.GeneralPath p = new java.awt.geom.GeneralPath();
Point2D.Double first = polygon.get(0);
p.moveTo(first.x, first.y);
polygon.remove(0);
for (Point2D.Double d : polygon) {
p.lineTo(d.x, d.y);
}
p.lineTo(first.x, first.y);
p.closePath();
return p.contains(point);
}
/**
* 判断点是否在多边形内,如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true
*
* @param point 检测点
* @param pts 多边形的顶点
* @return 点在多边形内返回true, 否则返回false
*/
public static boolean IsPtInPoly(Point2D.Double point, List<Point2D.Double> pts) {
int N = pts.size();
int intersectCount = 0;
double precision = 2e-10;
Point2D.Double p1, p2;
Point2D.Double p = point;
p1 = pts.get(0);
for (int i = 1; i <= N; ++i) {
if (p.equals(p1)) {
return true;
}
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 true;
}
if (p1.y == p2.y) {
if (p1.y == p.y) {
return true;
} else {
++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 true;
}
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;
}
//偶数在多边形外
//奇数在多边形内
return intersectCount % 2 != 0;
}
}
根据经纬度判断某个点是否在某个区域内(方法二)
最新推荐文章于 2024-06-17 17:32:07 发布