阅读完需:约 2 分钟
创建一个实体类:Point
public class Point {
private Double x;
private Double y;
public Point (Double x , Double y) {
this.x = x;
this.y = y;
}
public Double getX() {
return x;
}
public void setX(Double x) {
this.x = x;
}
public Double getY() {
return y;
}
public void setY(Double y) {
this.y = y;
}
}
判断坐标的工具类:
public class GPSjudgment {
public static void main(String[] args) {
//114.331951,30.64091#114.341049,30.610185#114.331436,30.588058#114.312038,30.56393#114.293498,30.558609#114.267922,30.563784#114.231185,30.57945#114.212303,30.601616#114.235649,30.626878#114.280624,30.646818#
Map[] map=new Map[]{};
Long s=System.currentTimeMillis();
Point[] ps = new Point[] { new Point(111.283365,40.099701),
new Point(111.277957,40.099659),
new Point(111.277589,40.098224),
new Point(111.278083,40.097183),
new Point(111.27917,40.097038),
new Point(111.27917,40.097038),
new Point(111.279997,40.098086),
new Point(111.281317,40.0981),
new Point(111.281371,40.097755),
new Point(111.28218,40.096989),
new Point(111.28218,40.096989),
new Point(111.28341,40.099715)};
Point n1 = new Point(111.280652,40.098169);
System.out.println( "n1:" + isPtInPoly(n1.getX() , n1.getY() , ps));
Long e=System.currentTimeMillis();
System.out.println(e-s);
}
public static boolean isPtInPoly (double ALon , double ALat , Point[] ps) {
int iSum, iCount, iIndex;
double dLon1 = 0, dLon2 = 0, dLat1 = 0, dLat2 = 0, dLon;
if (ps.length < 3) {
return false;
}
iSum = 0;
iCount = ps.length;
for (iIndex = 0; iIndex<iCount;iIndex++) {
if (iIndex == iCount - 1) {
dLon1 = ps[iIndex].getX();
dLat1 = ps[iIndex].getY();
dLon2 = ps[0].getX();
dLat2 = ps[0].getY();
} else {
dLon1 = ps[iIndex].getX();
dLat1 = ps[iIndex].getY();
dLon2 = ps[iIndex + 1].getX();
dLat2 = ps[iIndex + 1].getY();
}
// 以下语句判断A点是否在边的两端点的水平平行线之间,在则可能有交点,开始判断交点是否在左射线上
if (((ALat >= dLat1) && (ALat < dLat2)) || ((ALat >= dLat2) && (ALat < dLat1))) {
if (Math.abs(dLat1 - dLat2) > 0) {
//得到 A点向左射线与边的交点的x坐标:
dLon = dLon1 - ((dLon1 - dLon2) * (dLat1 - ALat) ) / (dLat1 - dLat2);
// 如果交点在A点左侧(说明是做射线与 边的交点),则射线与边的全部交点数加一:
if (dLon < ALon) {
iSum++;
}
}
}
}
if ((iSum % 2) != 0) {
return true;
}
return false;
}
}
原理:
采取的一个方法就是,从这个点『往右水平出发』判断经过了多少条『多边形的边』:

如果是奇数条边,则这个点在多边形内,如果是偶数条,则在多边形外。