空间索引
问题一 为什么需要空间索引
- 如果要根据自己所在的位置查询附近50米的POI(商家、景点等点信息)
- 解决方案:
- 计算所有POI与所在位置的距离(计算N次再比较N次) 4.6s
- 矩形的过滤方法(范围框起来,经纬度在矩形过滤函数规定的范围内,在求出距离小于50米的POI。)0.36s
- 方法二虽然强于方法一但是的执行时间仍然比较耗时,其原因在于遍历过程,因此我们想到了索引。对维度进行B树的索引后,查询分为三个步骤。
首先根据纬度范围找到符合条件的POI,在筛选出指定经度范围的数据,最后计算距离。0.01s。
1)但是B树只能对经度或纬度索引(一维索引),与期望的不符
我们期待的是快速找出落在某一空间范围的POI(如矩形),而不是快速找出落在某纬度或经度范围的POI,想象一下,我要查询北京某区的POI,但是B树索引不仅给我找出了北京的,还有与北京同一维度的天津、大同、甚至国外城市的POI,当数据量很大时,效率很低。
既然传统的索引不能很好的索引空间数据,我们自然需要一种方法能对空间数据进行索引,即空间索引。
空间索引四叉树经典论文
Quad Trees A Data Structure for Retrieval on Composite Keys
- 一种用于多key值组合检索的数据结构
总纲
- 四叉树是用于存储那些便于组合key键检索的信息的数据结构。
- 这种结构可以推广到任意维度,本文只讨论二维。
- 论文给出了前向插入和平衡插入四叉树的算法。
- 提出了区域检索算法
- 删除和合并显得很难
摘要
- 解决多键组合搜索问题的有效方式是将记录映射到多维空间中去,每一个属性当成一个维度。
- 一个查询考虑结果存在与否的记录满足给定的标准。该标准是,该记录是否为给定空间维度中的子集。
- 满足即返回
- 单键检索目前研究的已经很好了,经验告诉我们二叉树对表示线性有序数据是一个很好的数据结构。而平衡二叉树提供了一个有保证的快速结构。
- 这篇论文将会推广二叉树来处理固有的二维结构的数据。例如:找出所有距离芝加哥或者西雅图300里的城市
- 提出用于解决上述问题的结构称为四叉树。
- 这些基本概念很容易被推广到任意维度
定义和符号
- 拥有两维键的数据记录将会存储到一个树中,该树每个节点的出度都是四。每个节点都存储一条记录,同时拥有四个孩子节点。树的根节点将其领域划分为四个象限,分别为NE(东北)NW(东西),SW(西南),SE(西北)与地图类似。
- 下图表示了一棵简单的树与它代表的记录之间的相应关系
- 如果节点位于象限线上,依照惯例一三象限是闭合的,在哪个象限的线上就划分到哪个象限中去,能够快速定位节点在根的哪个象限。
总结
- 四叉树的树枝就是一个索引,叶子结点存的才是实际的信息,相当于不断向下划分再划分。可以倒过来看,一张大网格里边有上万个小格,对每个小格的定位是通过这张大网的不断划分得到的。
- 四叉树的结构比较简单,并且当空间数据对象分布比较均匀时,具有比较高的空间数据插入和查询效率