射线法判断一个坐标点(经纬度)是否在一个多边形区域内部
一、问题在 GIS、无人机巡检、电子围栏、地图系统等场景中经常需要判断一个点是否位于某个多边形区域内关于这一问题可以使用射线法判断。二、射线法核心思想从待判断的点出发向右画一条水平射线统计这条射线与多边形边的交点个数如果交点数为奇数 → 点在多边形内部如果交点数为偶数 → 点在多边形外部。三、代码实现/** * 判断一个点是否在一个区域中 * param point * param polygon * return */ public static boolean isPointInPolygon(Point point, ListPoint polygon) { boolean inside false; int n polygon.size(); for (int i 0, j n - 1; i n; j i) { double xi polygon.get(i).getLongitude(); double yi polygon.get(i).getLatitude(); double xj polygon.get(j).getLongitude(); double yj polygon.get(j).getLatitude(); boolean intersect ((yi point.getLatitude()) ! (yj point.getLatitude())) (point.getLongitude() (xj - xi) * (point.getLatitude() - yi) / (yj - yi) xi); if (intersect) { inside !inside; } } return inside; }四、代码说明这段代码的核心在于判断射线是否与当前边产生一次有效交点。关键逻辑如下((yi point.getLatitude()) ! (yj point.getLatitude()))这一步用于判断边的两个端点是否一个在点的上方一个在点的下方。如果两个端点都在射线同一侧则一定不会相交。(xj - xi) * (point.getLatitude() - yi) / (yj - yi) xi这一公式用于计算射线与当前边的交点的 x 坐标。其推导来自线性插值公式x xi (xj - xi) * (y - yi) / (yj - yi)最后比较point.getLongitude() 交点x坐标表示交点是否在点的右侧。如果满足条件则说明发生了一次有效相交。每遇到一次相交