geo point 判断点是否在多边形内

public class Test {

    public static void main(String[] args) {
        GeoPoint[] geoPoints = new GeoPoint[4];

        geoPoints[0] = new GeoPoint();
        geoPoints[0].setLat((double) 0);
        geoPoints[0].setLon((double) 0);

        geoPoints[1] = new GeoPoint();
        geoPoints[1].setLat((double) 0);
        geoPoints[1].setLon((double) 1);

        geoPoints[2] = new GeoPoint();
        geoPoints[2].setLat((double) 1);
        geoPoints[2].setLon((double) 1);

        geoPoints[3] = new GeoPoint();
        geoPoints[3].setLat((double) 1);
        geoPoints[3].setLon((double) 0);

        GeoPoint testPoint = new GeoPoint();
        testPoint.setLat(0.0);
        testPoint.setLon(0.0);

        System.out.println(check(geoPoints,testPoint));
        System.out.println(pnpoly(geoPoints,testPoint));

    }

    //1.先粗略看是否在多边形矩形内
    public static boolean check(GeoPoint[] geoPoints, GeoPoint testPoint)
    {
        //找出最大值与最小值,范围
        Double lonMax=0.0,lonMin=0.0,latMax=0.0,latMin=0.0;
        for(GeoPoint one:geoPoints)
        {
            if(one.getLat()>latMax)
            {
                latMax=one.getLat();
            }
            if(one.getLat()<latMin)
            {
                latMin=one.getLat();
            }
            if(one.getLon()>lonMax)
            {
                lonMax=one.getLon();
            }
            if(one.getLon()<lonMin)
            {
                lonMin=one.getLon();
            }


        }
//        System.out.println(latMax);
//        System.out.println(latMin);
//        System.out.println(lonMax);
//        System.out.println(lonMin);
        if(testPoint.getLon()>lonMax || testPoint.getLon()<lonMin || testPoint.getLat()>latMax || testPoint.getLat()<latMin )
        {
            return false;
        }
        return true;
    }


    //2.pnpoly算法,testPoint点平行y轴(或x轴)的,以testPoint点为原点的射线,与多边形的交点数量,交点次数,奇数为真,偶数为假
    public static boolean pnpoly(GeoPoint[] geoPoints, GeoPoint testPoint)
    {
        int i, j;
        boolean c=false;
        int nvert = geoPoints.length;
        for (i = 0, j = nvert-1; i < nvert; j = i++) {
            //1.被测试点的纵坐标testy是否在本次循环所测试的两个相邻点纵坐标范围之内
            //2.待测点test是否在i,j两点之间的连线之下
            if ( ((geoPoints[i].getLon()>testPoint.getLon()) != (geoPoints[j].getLon()>testPoint.getLon())) &&
                    (testPoint.getLat()  < (geoPoints[j].getLat()-geoPoints[i].getLat()) * (testPoint.getLon()-geoPoints[i].getLon()) / (geoPoints[j].getLon()-geoPoints[i].getLon()) + geoPoints[i].getLat()) )
                //交点次数,奇数为真,偶数为假
                c= c==false?true:false;
        }
        return c;
    }
}

class GeoPoint{
    Double lat;
    Double lon;

    public Double getLat() {
        return lat;
    }

    public void setLat(Double lat) {
        this.lat = lat;
    }

    public Double getLon() {
        return lon;
    }

    public void setLon(Double lon) {
        this.lon = lon;
    }
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值