地图通过经纬度判断点否在多边形内(多边形在多边形内)

项目需求

在在线地图中判断一个图形是否在另一个图形内,好像很复杂的样子,其实的确有点复杂,我们可以这样想。这个问题其实可以拆分成两步,第一步实现判断点是否在多边形内,第二步判断第一个多边形所有的点是否在第二个多边形内。
在这里插入图片描述

实现方案

先直接上代码,这个方法就是关键的操作(用于js中),用来判断点是否在多边形内,先解释一下里面的变量及其含义

变量名内容
length多边形点的数量
lianx多边形内经度坐标数组
lianx多边形内纬度坐标数组
lianx点经度坐标
lianx点纬度坐标
judge(length, lianx, liany, testx, testy) {
      var i, j, c = false;
      length = parseInt(length);
      testx = parseFloat(testx);
      testy = parseFloat(testy);
      for (i = 0, j = length - 1; i < length; j = i++) {
        liany[i] = parseFloat(liany[i]);
        liany[j] = parseFloat(liany[j]);
        lianx[i] = parseFloat(lianx[i]);
        lianx[j] = parseFloat(lianx[j]);
        if (
          (liany[i] > testy) != (liany[j] > testy) &&
          (testx < (lianx[j] - lianx[i]) * (testy - liany[i]) /(liany[j] - liany[i]) + lianx[i])
        )
          c = !c;
      }
      return c;
    },

如果想知道原理的小伙伴可以接着往下看

这个方法其实每次都是在计算多边形中相邻的两个点和测试点之间是否满足以下两个关系
1.测试点纬度是否在两点纬度之间 (liany[i] > testy) != (liany[j] > testy)
2.如果在两点之间了,接下就得判断待测点test是否在i,j两点之间的连线之下** (testx < (lianx[j] - lianx[i]) * (testy - liany[i]) /(liany[j] - liany[i]) + lianx[i])**
然后每次这两个条件同时满足的时候我们把返回的布尔量取反。

可这到底是啥意思啊?
这个表达式的意思是说,随便画个多边形,随便定一个点,然后通过这个点水平划一条射线,先数数看这条
射线和多边形的边相交几次,(或者说先排除那些不相交的边,第一个判断条件),然后再数这条射线穿越多边形的次数是否为奇数,如果是奇数,那么该点在多边形内,如果是偶数,则在多边形外。该部分转载百度百科。

将这步完成后,就实现了判断点是否在多边形,而想要实现多边形在多边形内,就按上述所说即可。

如果存在问题请大家批评指正!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值