R树及其应用场景

article/2025/9/29 17:16:26

地理围栏(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#)


http://chatgpt.dhexx.cn/article/UKHdHqaK.shtml

相关文章

R树与空间索引

B树或者B树可以非常好的处理一维空间存储的问题。B树是一棵平衡树,它是把一维直线分为若干段线段,当我们查找满足某个要求的点的时候,只要去查找它所属的线段即可。依我看来,这种思想其实就是先找一个大的空间,再逐步缩…

R语言学习(三)——决策树分类

分类 分类(Classification)任务就是通过学习获得一个目标函数(Target Function)f, 将每个属性集x映射到一个预先定义好的类标号y。 分类任务的输入数据是记录的集合,每条记录也称为实例或者样例。用元组(X,y)表示&am…

空间数据索引RTree(R树)完全解析及Java实现

本文是在https://www.cnblogs.com/cmi-sh-love/p/kong-jian-shud-ju-suo-yinRTree-wan-quan-jie-xi-jiJa.html?share_tokene5b096d7-6dbf-4839-9992-b29913335ba9基础上进行修改和补充的。 第一部分 空间数据的背景介绍 空间数据的建模 基于实体的模型(基于对象…

最小生成树:kruskal算法的R语言实现

以如下图为例 library(hash)#需要用到hash包 Nodes<-c("A","B","C","D","E","F","G") #创建存放顶点的向量 edges<- data.frame(startcharacter(),endcharacter(),lengthnumeric(),stringsAsFa…

【转】R树

R树在数据库等领域做出的功绩是非常显著的。它很好的解决了在高维空间搜索等问题。举个R树在现实领域中能够解决的例子吧&#xff1a;查找20英里以内所有的餐厅。如果没有R树你会怎么解决&#xff1f;一般情况下我们会把餐厅的坐标(x,y)分为两个字段存放在数据库中&#xff0c;…

R语言实现决策树

R语言实现决策树 提示&#xff1a;本文使用R语言实现决策树&#xff0c;并对决策树结构图进行美化 文章目录 R语言实现决策树数据介绍一、相关R包的下载二、实现过程1.数据读取2.训练集与验证集划分3.构建决策树并绘制图形4.测试模型 总结 数据介绍 group就是分类结果&#x…

决策树与R语言(RPART)

关于决策树理论方面的介绍&#xff0c;李航的《统计机器学习》第五章有很好的讲解。 传统的ID3和C4.5一般用于分类问题&#xff0c;其中ID3使用信息增益进行特征选择&#xff0c;即递归的选择分类能力最强的特征对数据进行分割&#xff0c;C4.5唯一不同的是使用信息增益比进行…

经典查找算法 --- R树

R树&#xff1a;处理空间存储问题 -->是引用别人的文章 相信经过上面第一节的介绍&#xff0c;你已经对B树或者B树有所了解。这种树可以非常好的处理一维空间存储的问题。B树是一棵平衡树&#xff0c;它是把一维直线分为若干段线段&#xff0c;当我们查找满足某个要求的点的…

R语言︱决策树族——随机森林算法

每每以为攀得众山小&#xff0c;可、每每又切实来到起点&#xff0c;大牛们&#xff0c;缓缓脚步来俺笔记葩分享一下吧&#xff0c;please~ ——————————————————————————— 笔者寄语&#xff1a;有一篇《有监督学习选择深度学习还是随机森林或支持向…

R语言:画树图

原始数据长这样&#xff1a; “iyear”表示年份&#xff1b;“nkill”表示死亡人数&#xff1b;“region”表示地区&#xff1b;“总计”表示某年份死亡总人数&#xff1b;nkii里的缺失数据自动按“0”运算。 数据存储在名为“ljs”的csv格式里。 应提前下载好treemap包&#…

图解R树的内部结构及操作

本文是在https://blog.csdn.net/baimafujinji/article/details/89810217基础上增加了自己的理解和解释形成的。 R树的基本情况 R树&#xff08;R-tree&#xff09;是一种将&#xff22;树&#xff08;B树和B树统称B树&#xff09;扩展到多维情况下得到的数据结构&#xff0c;…

R树

先搞明白R树搜索、插入、删除过程。 R树是平衡树&#xff0c;可以理解为B树在N维空间上的扩展。 R树一定要满足一下要求&#xff1a; 1&#xff0e;根节点若非叶子节点&#xff0c;则至少有两个子节点&#xff1b; 2&#xff0e;每个非根叶节点和非叶节点包含的实体个数均介…

R tree

R树在数据库等领域做出的功绩是非常显著的。它很好的解决了在高维空间搜索等问题。举个R树在现实领域中能够解决的例子吧&#xff1a;查找20英里以内所有的餐厅。如果没有R树你会怎么解决&#xff1f;一般情况下我们会把餐厅的坐标(x,y)分为两个字段存放在数据库中&#xff0c;…

R树空间索引

R树在数据库等领域做出的功绩是非常显著的。它很好的解决了在高维空间搜索等问题。举个R树在现实领域中能够解决的例子吧&#xff1a;查找20英里以内所有的餐厅。如果没有R树你会怎么解决&#xff1f;一般情况下我们会把餐厅的坐标(x,y)分为两个字段存放在数据库中&#xff0c;…

搜索树之R树

产生背景 地理空间数据涉及各种海量且复杂的数据&#xff0c;找到合适的索引对空间数据的处理至关重要。 传统的B树索引针对字符、数字等一维属性数据的主关键字而设计&#xff0c;不适用于具有多维性的地理空间数据。 在GIS和CAD系统对空间索引需求的推动下&#xff0c;为满足…

R-Tree

R-Tree ​ R-Tree是一颗用来存储高维数据的平衡树&#xff0c;它把B树的思想扩展到了多维空间&#xff0c;采用了B树分割空间思想&#xff0c;并在添加、删除操作时采用合并、分解节点的方法&#xff0c;保证树的平衡性。 数据结构 ​ 每个R树的叶子节点包含了多个指向不同数…

R-tree总结

R-tree R-tree是用来做空间数据存储的树状数据结构。R-tree是B-tree向多维空间发展的另一种形式&#xff0c;并且R树也是平衡树。 R树的核心思想是聚合距离相近的节点并在树结构的上一层将其表示为这些节点的最小外接矩形&#xff0c;这个最小外接矩形就成为上一层的一个节点…

从B树、B+树、B*树谈到R 树

从B 树、B 树、B* 树谈到R 树 作者&#xff1a;July、weedge、Frankie。编程艺术室出品。 说明&#xff1a;本文从B树开始谈起&#xff0c;然后论述B树、B*树&#xff0c;最后谈到R 树。其中B树、B树及B*树部分由weedge完成&#xff0c;R 树部分由Frankie完成&#xff0c;全文…

R树简介

B树与R树 计算机磁盘的文件管理常使用B树和B树。B树和B树能良好地处理一维空间存储的问题。实际上&#xff0c;B树是一棵平衡树&#xff0c;它是把一维直线分为若干段线段&#xff0c;当我们查找满足某个要求的点的时候&#xff0c;只要去查找它所属的线段即可。这种思想其实是…

高级数据结构之R树(R-tree)

R树(R-tree)是一种将B树扩展到多维情况下得到的数据结构,它最初由Antonin Guttman于1984年提出。B树的结点中会存储一个键的集合,这些键把线分成片段,沿着那条线的点仅属于一个片段。因此,B树使得我们可以很容易地找到点。如果把沿线各处的点表示成B树结点,我们就能…