作者:网信科技智慧旅游产品部——王东风
前不久,我们智慧旅游产品部开发了一款产品《运维管理信息系统》,在此软件的演示会议上,被老总独到的眼光发现了一些问题,并提出了一些升级改进的宝贵意见:
1. 片区全是圆形区域,做不到真正片区不规则化的全覆盖。
2. 在片区中添加一些维护部件,却需要手动选择片区,无法自动识别。
针对以上2个问题,要解决的话,就不可避免地要涉及到地理围栏的技术范畴,经过一番的查询资料并研究,终于得以解决。
原来的解决方案:

现在的解决方案

片区自动识别,仅仅只需拖动目标点,片区自动切换

效果图已放出,现在说说这背后的技术实现核心:
简单来说就是需要判断一个点是否在区域内的问题,如果这个区域是圆形的话,仅仅需要比较目标点与圆心的地理距离与圆的半径大小,小在内,大则在外。
如果这个区域是不规则的多边形呢,怎么判断一个点在区域内?
如以下一些典型的不规则区域:

现在,我们采用目前流行的算法:射线法

从目标点延横坐标向一个方向引出一条直线,这条直线会与这个多边形的一些边进行相交,如果所有的相交点为奇数量,则判断点在多边形区域内,反之为偶数的话,则在区域外。
算法解析:
1. 遍历此多边形的所有边。
2. 确定当前边的2个端点的纬度点一个在目标点纬度的上或上边,一个在下边。
3. 确定交叉点在左侧(需要用到直线斜率的变形公式计算交叉点的值)。
那么,同时满足以上3个条件,则判断这个交叉点有效。累加全部交叉点数量,若是奇数则为在区域内,反之在区域外部。
程序实现:

以上是核心代码的实现,但是具体地理围栏处理要涉及的也许非常多的区域,且每个区域若边很多的情况下,就要考虑另一种算法:R树,关于这个算法的实现不在此文讨论范围,其实它的核心思想就是计算每个区域的最小矩形,判断每个矩形的话就简单多了,这一步称之为粗筛,直白地说就是先确定大范围。

IT综合服务商
智慧旅游解决方案专家

