根据经纬度判断某个点是否在某个区域内(方法二)

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;
	}
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值