判断点是否在一个区域内

问题是给定一个经纬度坐标点A,以及坐标围成的区域坐标数组,判断该点在不在此区域。

思路是这样的:

将区域放入x-y坐标轴中,取A的x或者y坐标,向一个方向画射线,若是与区域的交点为奇数时,则A点在该区域(这个的前提A点的x或者y坐标就在区域的范围内,要排除A在区域的边界上或者顶点上

若是A点非要在顶点上或者边界上,为了避免问题就要在判断A点x或者y轴范围的时候取一个实点一个虚点,例如:[4,5)。然后利用直线公式获取交点的y或者x轴坐标,然后判断点是否在射线的那个方向(画的x轴射线现在就获取y坐标,画的用y轴射线现在就获取x坐标)这样如果交点的数量还是奇数就说明A点在区域内。

1.把区域放入x-y坐标轴中,就是这样:

手绘的不要太在意细节。

2.判断A点x或者y坐标就在区域的范围内

这样两边都比较一下是因为不能够确定点集合中的点位大小是不是按顺序排列的。

ALat >= dLat1) && (ALat < dLat2)) || ((ALat >= dLat2) && (ALat < dLat1)

3.利用公式获取A点的y或者x坐标

直线公式:(y-y1)/(y2-y1)=(x-x1)/(x2-x1)

4.判断是否在所选的一侧

这一步比较大小就好了,应该都明白。

付一下代码:

 /**
     * 判断某个点是否在一个经纬度围成的多边形中
     * @param ALon 经度
     * @param ALat 纬度
     * @param ps 点集合
     * @return
     */
public boolean isPtInPoly (double ALon , double ALat , Ponits[] 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++;
                    }
                }
            }
        }


        //判断能否被2 整除,是否为奇数
        if ((iSum % 2) != 0) {
            return true;
        }

        return false;
    }

要在Redis中判断一个是否在坐标区域内,可以使用Redis的地理空间数据类型和相关命令。Redis支持存储和查询地理空间数据,使其成为一个强大的地理信息系统。 首先,你需要使用Redis的地理空间数据类型,例如有序集合(Sorted Set),来存储多边形区域坐标点。你可以将每个坐标点作为一个成员,将其经度作为score。通过有序集合的score,可以快速对坐标点进行排序和范围查询。 接下来,你可以使用Redis的地理空间命令,如GEORADIUS,来判断一个是否在多边形区域内。GEORADIUS命令可以根据指定的经度、纬度和半径,返回在指定范围内的坐标点。将要判断作为参数传递给GEORADIUS命令,并设置一个适当的半径,如果返回的结果中包含了这个,那么就说明这个在多边形区域内。 需要注意的是,Redis的地理空间命令默认使用的是WGS84坐标系,即经度和纬度使用的是度数。因此,在使用这些命令时,需要将的经度和纬度转换为度数,并确保它们与多边形区域中的坐标点使用相同的坐标系。 总结来说,为了在Redis中判断一个是否在坐标区域内,你可以使用Redis的地理空间数据类型和地理空间命令。将多边形区域坐标点存储为有序集合,并使用GEORADIUS命令来查询指定范围内的坐标点,以判断一个是否在多边形区域内
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值