地理围栏算法解析

  地理围栏(Geo-fencing)是LBS的一种应用,就是用一个虚拟的栅栏围出一个虚拟地理边界,当手机进入、离开某个特定地理区域,或在该区域内活动时,手机可以接收自动通知和警告。如下图所示,假设地图上有三个商场,当用户进入某个商场的时候,手机自动收到相应商场发送的优惠券push消息。地理围栏应用非常广泛,当今移动互联网主要app如美团、大众点评、手淘等都可看到其应用身影。

图1 地理围栏示意图

 

       地理围栏的核心问题就是判断用户是否落在某多边形围栏内部。本文将介绍实际应用中常用的解决方法。

1 如何判断点在多边形内部

      地理围栏一般是多边形,如何判断点在多边形内部呢?可以通过射线法来判断点是否在多边形内部。如下图所示,从该点出发沿着X轴画一条射线,依次判断该射线与每条边的交点,并统计交点个数,如果交点数为奇数,则在多边形内部(如图3个交点),如果焦点数是偶数,则在外部,射线法对凸和非凸多边形都适用,复杂度为O(N),其它N是边数。源码可参考(http://alienryderflex.com/polygon/

图2 射线法判断点在多边形内外

     

       当地理围栏多边形数目较少时,我们可以依次遍历每一个多边形(暴力遍历法),然后用射线法进行判断,这样效率也很高。而当多边形数目较多时,比如有10万个多边形,这个时候需要执行10万次射线法,响应时间达到3.9秒,这在互联网应用几乎不可忍受。下表是本人的简单测试,多边形边数均为7。

表1 射线法性能测试

 

2 R树索引加速判断

       暴力遍历法效率低下的原因是与每一个多边形都进行了射线法判断,如果能减少射线法的调用次数性能就能提升。因此我们的优化思路很直接,首先通过粗筛的方法快速找到符合条件的少量多边形,然后对粗筛后的多边形使用射线法判断,这样射线法的执行次数大大降低,效率也能大大提高。怎么粗筛呢?对于一维数据我们常常使用索引的方法,比如通过B树索引找到某一个范围区间段,然后对此范围区间段进行遍历查找,对于二维空间数据常常使用空间索引的方法,比如通过R树找到范围区间内的多边形,然后对此范围内的多边形进行精确判断,下面介绍最常使用的空间索引R树的解决思路。

       1)外包矩形表示多边形

       由于多边形形状各异,我们需要以一种统一的方式来对多边形进行近似,最简单的方式就是用最小外包矩形来表示多边形。

图3 最小外包矩形(MBR)表达多边形

 

      2)对最小外包矩形建立R树索引

 

图4 对最小外包矩形进行R树索引

 

        3)查询

          a)首先通过R树迅速判断用户所在位置(粗红点)是否被外包矩形覆盖(图5,红色点代表用户所在位置;R树平均查询复杂度为O(Log(N)),N为多边形个数);

          b)如果不被任何外包矩形覆盖则返回不在地理围栏多边形内;

          c)如果被外包矩形覆盖则还需要进一步判断是否在此外包矩形的多边形内部,采用上文提到的射线法判断(图2)。

图5 R树查询示例

3 多边形边数较多怎么办

       大多数应用的地理围栏多边形都比较简单,但有时也会遇到一些特别复杂的多边形,比如单个多边形的边数就超过十几万条,这时候对此复杂多边形执行一次射线法也非常耗时(因为射线法时间复杂度为O(N),N为多边形边数)。

       如何提高对复杂多边形执行射线法的计算效率呢?同样使用R树索引!笔者在实际应用中对边数较多(如超过1万)的多边形的边再单独进行R树索引,具体如图6所示,首先对多边形的每条边构建最小外包矩形,然后在这些最小外包矩形基础上构建R树索引(R树索引上的外包矩形未画出),这样射线法求交点的时候首先通过R树判断射线是否与外包矩形相交,最后对R树粗筛后的边进行精确求交判断,时间复杂度从O(N)降到O(Log(N)),大大提高了计算效率。

图6 对多边形的边进行R树索引

4 实践

      某线上应用服务有30万个地理围栏多边形,通过在内存中构建R树索引,使得线上实时地理围栏查询平均响应时间在1ms以内,而暴力查询响应时间是9秒左右。

      

5 R树相关源码

https://pypi.python.org/pypi/Rtree/ (Python)

http://jsi.sourceforge.net/ (Java)

https://github.com/leaflet-extras/RTree (Javascript)

http://sourceforge.net/p/cspatialindexrt/code/HEAD/tree/ (C#)

空间索引相关博文:
GeoHash核心原理解析

时间: 2024-10-05 10:08:22

地理围栏算法解析的相关文章

大数据实例:高负载低延迟动态算法解析

本文讲的是大数据实例:高负载低延迟动态算法解析,这篇文章由Datasalt的创始人Ivan de Prado和Pere Ferrera提供,Datasalt是一家专注于大数据的公司,推出了Pangool和Spoilt SQL Big Data等开源项目.在这篇文章中,通过BBVA信用卡支付的例子详解了云计算中的低延时方案. 以下为文章全文: 使用信用卡进行支付的款项是巨大的,但是很明显,通过分析所有的交易,我们也可以从数据中得到内在的价值.比如客户忠诚度.人口统计数据.活动的受欢迎程度.商店的建

从地理围栏看物联网安防

物联网技术与智能化技术正在深度融合,加快行业的智能化发展,促使行业需求在应用层上落地.安防行业作为信息技术产业的重要组成部分,其发展备受关注.目前,现代安防和物联网在业务和技术上的融合正发生着剧烈的变化,更加智能化.一体化的安防系统使安防行业的核心价值日益彰显. 随着室内定位技术和近场感知技术的成熟,其催生出来的地理围栏系统正在革新着各大场景的安防业态.作为LBS的一种新应用,地理围栏(Geo-fencing)是用一个虚拟的栅栏封闭的地理边界,当手机或者嵌入定位模块的资产设备进入或者离开该边界时

地理围栏等物联网安防产品将改变过往模式

近年,物联网安防应用市场规模逐年攀升,细究其因发现:今时今日,云端连线的安防设备方案可以让安装及系统维护的成本降低,更多的组织单位陆续启用这类云端联网监控解决方案.根据Markets and markets调查机构的报告指出:物联网安防应用市场2016年预测有$79亿美元规模,并将以36.1%的CAGR(复合成长率)逐年成长到2021年达到$369.5亿美元. 物联网技术与智能化技术正在深度融合,加快行业的智能化发展,促使行业需求在应用层上落地.安防行业作为信息技术产业的重要组成部分,其发展备受

genfence-百度地图—地理围栏功能

问题描述 百度地图-地理围栏功能 导入的包是百度云平台下载的最新版的,但是在Activity中找不到GeofenceClient这个类~这是怎么回事?求大神指点~ 解决方案 //创建围栏对象 mGeofenceClient = new GeofenceClient(getApplicationContext()); //注册围栏监听并开始围栏扫描服务 mGeofenceClient.registerGeofenceTriggerListener(new GeofenceClient.OnGeof

谁用过百度地图 地理围栏啊 ,为什么我的围栏无效

问题描述 谁用过百度地图 地理围栏啊 ,为什么我的围栏无效 //创建围栏对象 mGeofenceClient = new GeofenceClient(getApplicationContext()); //注册围栏监听并开始围栏扫描服务 mGeofenceClient.registerGeofenceTriggerListener(new GeofenceClient.OnGeofenceTriggerListener() { @Override public void onGeofenceT

Java实现DES加解密算法解析_java

本文实例讲述了Java实现DES加解密算法解析.分享给大家供大家参考,具体如下:   简介: 数据加密算法(Data Encryption Algorithm,DEA)是一种对称加密算法,很可能是使用最广泛的密钥系统,特别是在保护金融数据的安全中,最初开发的DEA是嵌入硬件中的.通常,自动取款机(Automated Teller Machine,ATM)都使用DEA.它出自IBM的研究工作,IBM也曾对它拥有几年的专利权,但是在1983年已到期后,处于公有范围中,允许在特定条件下可以免除专利使用

《区块链开发指南》一一2.3 挖矿算法解析

2.3 挖矿算法解析 2.3.1 PoW挖矿算法及分析PoW(Proof of Work),即工作证明.也就是说,你获得多少货币,取决于你挖矿贡献的有效工作,比如,你的电脑性能越好,分给你的矿就会越多,即根据你的工作证明来执行货币的分配.大部分的虚拟货币,比如比特币.莱特币等,都是基于PoW模式的虚拟货币(算力越高.挖矿时间越长,你获得的货币就会越多).第1章已经说过挖矿算法其实就是通过一个Hash函数找到一个满足当前难度的Nonce(包含在区块头里面)的值,Hash函数输入数据的长度是任意的,

PageRank 算法解析

PageRank 算法解析    Jun 26, 2005 来源:未详         什么是PageRank? PageRank是Google衡量网页重要性的工具,测量值范围为从1至10分别表示某网页的重要性.在Google工具栏可以随时获得某网页的PageRank值.在这里我们将PageRank的一些特殊之处,从而对其能够获得较为深入的了解,使广大用户能够更好的使用和了解Googel. 网站 排名的历史渊源 上世纪90年代早期网络刚刚兴起之时,每天都有大量的含有特别行业内容的站点发布于网上.

还呗APP利息算法解析分享

给各位还呗软件的使用者们来详细的解析分享一下利息的算法. 解析分享:     还呗最低利率可打信用卡最低还款利率的5折,借款1万元分12期,对比信用卡最低还款利率,最多可省487.5元,你可以在还呗app中进行试算的哟~ 好了,以上的信息就是小编给各位还呗的这一款软件的使用者们带来的详细的利息的算法解析分享的全部内容了,各位看到这里的软件使用者们,小编相信你们现在那是非常的清楚算法了吧,希望小编上面给各位朋友们带来的利息算法信息能够给大家在软件的使用方面带去有用的帮助.