GeoMesa时空索引概述

GeoMesa是一个分布式地理大数据存储框架,它通过与许多分布式数据库整合,并提供标准化的接口,使得用户能方便、高效地在这些分布式数据库中查询、检索、处理时空大数据。类似于常用的ArcSDE,geomesa并不能直接存储数据,我们只需调用Geomesa提供的接口,而无需关心数据在底层数据库中的存储方式。

GeoMesa提供多种索引以满足不同类型数据的检索需要:

索引标识描述
Z2使用Z-ordering编码,将二维空间点编码到一维空间。具有几何类型Point的对象可创建Z2索引。
Z3将二维空间点和时间点编码到一维空间。具有几何类型Point和时间属性的对象可以创建Z3索引。
XZ2XZ2索引使用XZ-Ordering来索引非点空间对象。XZ-Ordering是Z-Ordering的一种扩展,用于索引空间扩展的对象(即非点空间对象,如线串或多边形)。如果具有非点几何形状的对象,则可创建此索引。
XZ3XZ3索引使用XZ-Ordering的三维实现来索引非点空间数据的空间位置和时间。
Record/ID使用要素ID为主键,通过ID的等于、小于、大于等条件进行检索。
Attribute索引非时空属性,在不使用时空条件的情况下进行检索查询。

Z-Ordering基于数据空间的递归分解,该算法将单位正方形划分为4个大小相等的象限,这些象限被规范地编号为0到3,递归地重复这一过程,直到达到某个基本分辨率g。然后我们停止并使用所获得的g的序列数字(称为象限序列)作为点的排序键(我们按字典顺序排序)。每个象限序列代表数据空间的一个区域,称为元素。

在点数据库中,仅使用基本分辨率的单元。因此,所有象限层序都具有相同的长度,我们可以将象限层序解释为以四元系(即以4为基数)表示的数字。将序列解释为数字有助于在索引中管理它们,并且不会改变点的顺序,因为字典顺序对应于数字的不相等关系。

假设一个具有指定窗口的窗口查询。数据空间被分解为四个象限。测试每个象限与查询窗口的交集。

  • 如果象限不与查询窗口相交,则不需要做任何操作。
  • 如果象限完全包含在查询窗口中,则必须从数据库中检索将该元素的象限序列作为其键的前缀的所有点。
  • 所有被窗口相交但没有完全封闭在窗口中的剩余象限被递归分解,直到达到基本分辨率为止。

对于点(Point)类型空间数据的存储,使用Z曲线能够实现高效的索引。但是对于复杂的空间数据(要素),如折线(Line)、多边形(Polygon)等,需要对Z-Ordering方法进行扩展。

细节请参考原始论文:https://www.dbs.ifi.lmu.de/Publikationen/Boehm/Ordering_99.pdf

(1)A Naive Approach for Polygon Databases

为了扩展z-ordering的概念来管理具有空间扩展的对象(例如矩形或多边形),我们面临一个给定的多边形与许多单元相交的问题。一种简单的方法是将对象覆盖的每个单元信息保存在数据库中。显然,这种方法会导致巨大的存储开销,除非基本网格非常粗糙。

(2)One-Value-Approximation

面对象由包含该完整对象的最小element近似。在这种情况下,我们确定象限序列的递归算法修改如下:将当前数据空间划分为四个象限。如果恰好有一个象限与该对象相交,则递归处理该象限。如果超过一个象限相交,则停止。使用到此点为止的象限序列作为键值。

该方法有一个明显的优点,即每个对象都由单个键表示,而不是像Naive Approach那样由一组键表示。

但这种方法也有一些缺点。

第一个缺点是该方法中的象限序列具有不同的长度,这取决于最小封闭象限的分辨率。因此,作为数值的简单解释是不可能的。键必须存储为可变长度的字符串,并按字典顺序进行比较,这比数值比较效率低。

第二个问题是对象可能表示得很差。例如,与数据空间中间的一条轴平行线(线X=0.5和线y=0.5)相交的任何多边形只能通过空象限序列来近似。如果要近似的多边形非常大,则通过空序列或非常短的序列进行近似似乎是合理的。对于小多边形,相对逼近误差太大。因此,对象近似的相对空间开销是无限的。

(3)XZ-Ordering

与之前的方法相比,XZ-Ordering避免了对象重复和变长象限序列的缺点,采用了三个方法实现它的鲁棒性:

  • 第一个将重叠纳入元素的概念中。我们将定义元素,使相同分辨率级别的相邻元素相互重叠高达50%。(这种方法使我们能够存储没有冗余和没有失控的近似误差的对象。特别地,一个非常小的物体不可能用一个非常短的序列甚至是空序列来表示)。
  • 第二个是利用一种复杂的四象限序列编码方案,将变长四象限序列以保持距离的方式映射到整数域。
  • 第三个方法是查询处理中区间生成的有效算法。该算法的目标是,如果处理额外区间的开销大于过度读取区间间隙的成本,则关闭相邻区间之间的小间隙。
引自互联网

事实上,如果一个对象位于大元素之间的边界上,那么任何将空间分解为离散单元格的技术都会遇到麻烦。因此,我们修改元素的定义,使相同分辨率级别上的元素之间允许重叠。

设想重叠元素定义的最简单方法是将Z-ordering生成原始单元格,向上和向右将高度和宽度扩大2倍。然后,两个相邻的cell相互重叠50%。其特殊的优点是,该定义还包含了与中轴相交的对象的小元素。如图(c)中,o1由“303”表示,o2由“033”表示。

引自互联网

XZ-Ordering同样会用一个整数来表示索引空间,并且尽量满足空间相近的索引空间具有相近的整数值。它的数值化思路可以理解为一种深度优先编码,如下图所示,为XZ-Ordering最大分辨率为2时的编码。先从第0层开始编码为0,然后再按照深度优先访问的顺序编码,如先编码第1层中子空间序号为“0”的空间为1,再编码“00”子空间为2。当编码完“0”开头的所有索引空间后,回退到上一层,再开始编码上一层为“1”的空间为6,再深度编码“1”下面所有的索引空间。

XZ-Ordering最大分辨率为2时的编码

对于查询处理,可以采用类似于之前介绍的算法的递归方式进行,确定查询与哪些象限相交。

那些不相交的象限直接被忽略。

如果一个象限完全包含在查询窗口中,那么所有以对应象限序列作为前缀的元素都完全包含在查询中。因此,将生成相应的xz值的区间(查询范围),并标记为以后从数据库中检索。

如果一个象限相交,首先该象限相应的xz值被确定并标记(将其作为单值区间处理)。然后递归调用算法的所有子象限。如果基本网格的分辨率选择得太细,则会出现问题,因为在这种情况下,通常许多元素是部分相交的,传输和编译如此复杂的查询开销是非常大的。为了缓解这一问题,提出一种算法以闭合间隙的方式直接生成间隔(没看懂,有时间再研究)。


已发布

分类

作者:

标签

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注