【三维数域】空间索引结构大比拼:优劣势全解析

日常生活中,我们经常会遇到需要从海量信息中快速定位到符合特定空间条件的场景。比如计划和朋友周末自驾游时,可能希望找到100公里内的旅游去处。一个简单暴力的方法是,先获取所有目的地的位置信息,通过计算出发位置与每个目的之间的距离,筛选出距离在100公里以内的目的地。然而,这种方法效率较低,特别是在数据量庞大的情况下。

多点对单点的暴力查询,图源:Esri

为了提高查询效率,数据库系统通常依赖索引来优化查询过程。传统的关系型数据库如MySQL,常采用B树或B+树索引来加速一维数据的检索。但面对空间数据,如三维的地理坐标,这些基于排序的索引结构就显得力不从心,因为空间数据无法直接进行一维排序,所以想为空间信息添加索引是比较困难的。

接下来本文将介绍一些比较常用的空间索引,详尽列举出这些索引结构的优劣势,旨在帮助你理解并选择合适的空间索引技术以优化空间数据的查询效率。

一、范围索引

在记录每个空间实体的坐标时,记录包围每个空间实体的外接矩形的最大和最小坐标。这样,在检索空间实体时,根据空间实体的最大最小范围,预先排除那些没有落入检索窗口内的空间实体,仅对那些外接矩形落在检索窗口的空间实体作进一步的判断,最后检索出那些真正落入窗口内的空间实体。

范围索引 图源:地理信息系统教程

#优势

  • 查询效率高:范围索引通过索引结构快速定位到符合查询条件的数据,提高查询效率。
  • 具备高灵活性:范围索引可以适应不同类型的数据和查询需求,支持多种查询操作。
  • 具备高可扩展性:范围索引可以处理大规模数据集,支持水平扩展和分布式部署。

#劣势

  • 索引维护成本高:范围索引需要定期维护和优化,以确保其性能和可靠性。
  • 占用空间大:随着数据量的增长,范围索引所占用的空间也会相应增加。

二、网格索引

网格索引,就是在地图图层上,按一定的宽和高划分为均匀的小网格,使图层中的所有对象都落入小网格内,每个网格对应着一块存储空间,索引项登记上落入该网格的空间对象。

如下图中,将空间进行划分并编码。该空间范围内有三个空间对象,分别是A的面状对象,B和C的线状对象。这时候我们可以按照哈希的数据结构存储,每个网格对应着一段储存空间,负责记录落入网格内的对象,比如对1号网格,里面存储着C的空间对象,对35号网格,里放着A和C的空间对象。

网格索引,来源:慧图大讲堂

网格索引,来源:慧图大讲堂

网格索引的查询操作就是对原空间数据利用网格索引进行检索的过程,它可以分成两步进行:通过对查询区域进行分化,检索出所有被查询区域覆盖且包含实体的网格,实现首次粗略查询;在粗略查询的结果集合基础之上通过精确比较,剔除不满足查询要求的记录。

假如我们要查询某一空间范围内有哪些空间对象,比如下面的红框就表示空间范围,我们可以很快根据红框的空间范围算出它与35号和36号网格相交,然后分别到35号和36号网格中精确查找空间对象,最终找出A和C的空间对象。

网格索引,来源:慧图大讲堂

#优势

网格索引思路简单,容易理解和实现。可以根据网格编码直接定位到相应的空间实体上,因此提高了索引速度。同时针对不同的数据分布特征、不同的数据量可以灵活地调整索引。

#劣势

  • 划分网格的大小难以确定:进行网格索引的第一步就是找到合适的网格大小进行划分,网格划分的越密集,需要的储存空间就越多,网格划分的越粗糙,查找的效率就会降低。
  • 储存空间的浪费:在实际应用中,空间数据往往具有很强的密集性,也就是说,划分的成的很多网格往往是没有数据的,但同样也需要分配储存空间,这就体现了一刀切的网格索引的不合理性。
  • 索引数据冗余:网格与对象之间多对多关系在空间对象数量多、大小不均时造成索引数据冗余。比如A这个空间对象在34,66,67,98,99这5个网格都有存储,浪费了大量空间。

三、四叉树索引

四叉树索引是一种递归的划分结构,它将整个地理空间划分为四个象限(或称为子树),每个象限再进一步划分为更小的象限,直到满足某种停止条件(如每个象限内的对象数量达到一定阈值)。查询时,从根节点开始,根据查询对象的位置递归地遍历四叉树,直到找到匹配的地理对象。

如下图左半所示,初始的空间中有9个点,假如阈值为1。由于此时空间的数据量为9>1,故将该空间划分成四个子空间,即橙色部分。之后发现左上角的子空间的数据量为2>1,故再进行一次划分,重复这样的过程后,得到的四叉树如下图右半所示。

四叉树结构,来源:developer.apple

#优势

  • 由于四叉树的生成和维护比较简单,且当空间数据对象分布比较均匀时,基于四叉树的空间索引可以获得比较高的空间数据插入和查询效率

#劣势

  • 对象分布不均:地理空间对象可能分布不均衡,这样会导致常规四叉树变得极其不平衡,如果空间对象分布不均匀,并且随着地理空间对象的不断插入,四叉树的层次会不断地加深,将形成一棵严重不平衡的四叉树,那么每次查询的深度将大大的增多,从而导致查询效率的急剧下降。
  • 存储数据冗余:当图元跨越多个区域存在时,一个图元被多个区域都进行了关联,储存在了多个叶子节点上。比如在下面图片中, “6”所代表的图元,分别存储在四个分枝上。这样,就存在索引的冗余,与网格索引存在同样的弊端。

四叉树索引,来源:慧图大讲堂

  • 中间节点的浪费:空间实体只能存储在叶子节点中,中间节点以及根节点不能存储空间实体信息,随着空间对象的不断插入,最终会导致四叉树树的层次比较深,在进行空间数据窗口查询的时候效率会比较低下。

四、R树及其变种(R+树)

【R树】

R树是一种用于存储多维空间数据的树形索引结构。R 树中的字母“R”代表“Rectangle”。R树的核心思想是聚合距离相近的节点,并在树的上一层将这些点表示为它们的最小外接矩形。R树是平衡树。

R树结构示意图,图源:pyblog

通过将空间对象表示为矩形框(MBR,最小边界矩形)来组织数据。R树的每个节点都包含一组MBR和指向子节点的指针。查询时,从根节点开始,根据查询对象的MBR与节点MBR的交集情况来决定是否继续遍历子节点。

#优势

  • 高度平衡:R树是一种高度平衡树,允许节点相互覆盖,提高了空间利用率和树的平衡性。
  • 动态索引:R树是一种完全动态的索引结构,不需要周期性的索引重组。

#劣势

  • 查询效率较低:在某些情况下,R树可能需要检索整个树,导致查询效率降低。
  • 插入和删除操作影响性能:R树的插入和删除操作可能涉及复杂的节点分裂和合并,影响性能。

【R+树】

R+树是R树的一种改进版本,它通过消除兄弟节点对应的空间区域重叠来减少无效查询次数。R+树还采用了强制重新插入算法来优化树的整体结构,提高空间利用率和减少节点分裂次数。

R+树结构示意图 图源:地理信息系统教程

#优势

  • 无重叠区域:R+树通过消除兄弟节点对应的空间区域重叠,减少了无效查询次数,提高了空间索引的效率。
  • 性能提升:R+树通过强制重新插入算法优化了R树的整体结构,提高了空间利用率和减少了节点分裂次数。

#劣势

  • 插入和删除成本高:R+树的插入和删除操作相对于R树来说可能更加复杂和耗时。


不同的空间索引结构各有其独特的优势和劣势,适用于不同的应用场景。在选择索引结构时,需要根据具体的数据特点、查询需求和性能要求进行综合评估。

比如本文提及的范围索引,其优势是借用自身包围盒的特点,加快查询效率。在Mapmost SDK for WebGL中,范围索引也被称为包围盒碰撞检测,它扮演了重要的角色,也是渲染性能的重要组成部分。比如在二维瓦片、三维模型渲染之前,需要对其是否可见性进行判断,判断的依据就是根据模型的外包围盒进行碰撞检测,以此只渲染屏幕看得到的模型。这样做,大大提升了渲染性能。

Mapmost中碰撞检测应用之一——模型视锥体裁剪,来源:Mapmost SDK for WebGL

碰撞检测在地图中的另一个重要运用是给标注添加避让效果。通过给定每个注记外包围盒,渲染时判断这些包围盒之间的距离是否小于某个阈值,小于了就只显示唯一一个,避免多个注记的重复叠加,影响用户的使用体验。

Mapmost中碰撞检测应用之一——注记避让效果,来源:Mapmost SDK for WebGL


关注 Mapmost,持续更新 GIS、三维美术、计算机技术干货

Mapmost 是一套以三维地图和时空计算为特色的数字孪生底座平台,包含了空间数据管理工具(Studio)、应用开发工具(SDK)、应用创作工具(Alpha)。平台能力已覆盖城市时空数据的集成、多源数据资源的发布管理,以及数字孪生应用开发工具链,满足企业开发者用户快速搭建数字孪生场景的切实需求,助力实现行业领先。

更多应用场景,点击此处前往Mapmost官网体验!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值