/**
* @author yaoxin
* @date 2018/7/30上午11:04
*/
public class CoordinateTest {
public static void main(String[] args) {
// 多边形经度数组
double[] lon = {113.314882,113.355845,113.370289,113.356779,113.338238,113.330979,113.313588,113.323865,113.314882};
// 多边形纬度数组
double[] lat = {23.163055,23.167042,23.149564,23.129758,23.13913,23.124706,23.140858,23.158204,23.163055};
// 测试在多边形内的点
boolean inAccurateArea = isInAccurateArea(113.330908, 23.155678, lon, lat);
System.out.println(inAccurateArea);
// 测试不在多边形内的点
boolean outAccurateArea = isInAccurateArea(113.33831, 23.137335, lon, lat);
System.out.println(outAccurateArea);
}
/**
* 从已知坐标向多边形划线,如果为偶数说明点在多边形外,奇数说明在多边形内
*
* @param pointLon
* @param pointLat
* @param lon
* @param lat
* @return
*/
private static boolean isInAccurateArea(double pointLon, double pointLat, double[] lon,
double[] lat) {
// 代表有几个交点
int vertexNum = lon.length;
boolean result = false;
for (int i = 0, j = vertexNum - 1; i < vertexNum; j = i++) {
// 满足条件,与多边形相交一次,result布尔值取反一次,奇数个则在区域内
if ((lon[i] > pointLon) != (lon[j] > pointLon)
&& (pointLat < (lat[j] - lat[i]) * (pointLon - lon[i]) / (lon[j] - lon[i])
+ lat[i])) {
result = !result;
}
}
return result;
}
}
数学问题,从已知坐标画射线,如果穿过多边形是奇数说明在多边形内,如果为偶数说明在多边形外