判断给定的GPS坐标点(point)是否在一个给定的多边形(polygon)内。
步骤可以分为以下几个部分:
1. 首先,我们定义一个布尔类型的变量 isInside ,让其初始值为 false,这个变量用于存储结果,表示点是否在多边形内。
2. 然后通过一个循环来遍历多边形的每条边。对于多边形中的每一条边,都看这条边是否与点和正无穷远点的连线相交,我们创建两个变量 i 和 j,一个表示当前顶点,一个表示顶点的上一个顶点。
3. 在循环中,首先检查当前顶点和上一个顶点的纬度是否在给定点的纬度的两侧(也就是给定点是否在这条边的水平方向的投影范围内)。
4. 如果符合上述条件,然后检查给定点的经度是否在这条边在同一纬度下的投影点的左边,这通过计算相对于当前边在同一纬度下的投影点的经度进行判断。
5. 如果上述两个条件都满足,则说明点和正无穷远点的连线与当前边交点,此时,更新 isInside 的值。
6. 循环结束后, isInside 的值即为结果,true 表示点在多边形内,false 表示点不在多边形内。
根据射线法的原理,如果点在多边形内,射线会和多边形交点为奇数次,如果点在多边形外,射线会和多边形交点为偶数次(或 0次)。所以通过这种方式可以准确地判断点是否在多边形内。
代码部分:
public boolean isPointInsidePolygon(Gps point, Gps[] polygon) {
int polygonLength = polygon.length;
boolean isInside = false;
for (int i = 0, j = polygonLength - 1; i < polygonLength; j = i++) {
if ((polygon[i].getLat() > point.getLat()) != (polygon[j].getLat() > point.getLat()) &&
point.getLon() < (polygon[j].getLon() - polygon[i].getLon()) * (point.getLat() - polygon[i].getLat()) / (polygon[j].getLat() - polygon[i].getLat()) + polygon[i].getLon()) {
isInside = !isInside;
}
}
return isInside;
}
Gps类:
public class Gps {
private double lon;
private double lat;
public Gps(double lon, double lat) {
this.setLon(lon);
this.setLat(lat);
}
}