java 将指定的经纬度是否落在多边形内

该算法通过检查点向左的射线与多边形边界交点的奇偶性来确定点是否位于多边形内部。当交点数为奇数时,点在多边形内;否则,点在多边形外。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个算法就是判断一个点向左的射线跟一个多边形的交叉点有几个

如果结果为奇数的话那么说明这个点落在多边形中

反之则不在。直接贴代码吧

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 RunWayLonLatTest {

public static void main(String[] args) { 
//跑道经纬度[]
Point[] ps = new Point[] { new Point(118.26763298804507,29.727463756843807), new Point(118.26623051693838,29.725847852307695), new Point(118.24472520887039,29.73991959541906), new Point(120.1798 , 30.2781), new Point(118.24612753025814,29.741535726649143) };  
//航班经纬度
        Point  n1=new Point(119.56083333333333,28.36916666666667);
   
        System.out.println( "n1:" + isPtInPoly(n1.getX() , n1.getY() , ps));  
    }


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

转自:https://blog.youkuaiyun.com/qq_22929803/article/details/46818009

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值