用四叉树和希尔伯特曲线做空间索引

用四叉树和希尔伯特曲线做空间索引
用四叉树和希尔伯特曲线做空间索引

超酷算法:用四叉树和希尔伯特曲线做空间索引

阅读·四叉树, 希尔伯特曲线, 空间索引, 算法

?Avalon探索之旅基础教程---- 简单绑定

?Gopher China 2015 上海大会

?Android必学-异步加载

?Android必学-BaseAdapter的使用与优化

本文由伯乐在线 - demoZ翻译,黄利民校稿。未经许可,禁止转载!

英文出处:https://www.360docs.net/doc/2c8658219.html,。欢迎加入翻译组。

随着越来越多的数据和应用和地理空间相关,空间索引变得愈加重要。然而,有效地查询地理空间数据是相当大的挑战,因为数据是二维的(有时候更高),不能用标准的索引技术来查询位置。空间索引通过各种各样的技术来解决这个问题。在这篇博文中,我将介绍几种:四叉树,geohash(不要和geohashing混淆)以及空间填充曲线,并揭示它们是怎样相互关联的。

四叉树

四叉树是种很直接的空间索引技术。在四叉树中,每个节点表示覆盖了部分进行索引的空间的边界框,根节点覆盖了整个区域。每个节点要么是叶节点,有包含一个或多个索引点的列表,没有孩子。要么是内部节点,有四个孩子,每个孩子对应将区域沿两根轴对半分得到的四个象限中的一个,四叉树也因此得名。

图1 展示四叉树是怎样划分索引区域的来源:维基百科

将数据插入四叉树很简单:从根节点开始,判断你的数据点属于哪个象限。递归到相应的节点,重复步骤,直到到达叶节点,然后将该点加入节点的索引点列表中。如果列表中的元素个数超出了预设的最大数目,则将节点分裂,将其中的索引点移动到相应的子节点中去。

图2 四叉树的内部结构

查询四叉树时从根节点开始,检查每个子节点看是否与查询的区域相交。如果是,则递归进入该子节点。当到达叶节点时,检查点列表中的每一个项看是否与查询区域相交,如果是则返回此项。

注意四叉树是非常规则的,事实上它是一种字典树,因为树节点的值不依赖于插入的数据。因此我们可以用直接的方式给节点编号:用二进制给每个象限编号(左上是00,右上是10等等译者注:第一个比特位为0表示在左半平面,为1在右半平面。第二个比特位为0表示在上半平面,为1在下半平面),任一节点的编号是由从根开始,它的各祖先的象限号码串接而成的。在这个编号系统中,图2中右下角节点的编号是1101。

如果我们定义了树的最大深度,不需通过树就可以计算数据点所在节点的编号:只要把节点的坐标标准化到适当的整数区间中(比如32位整数),然后把转化后x, y坐标的比特位交错组合。每对比特指定了假想的四叉树中的一个象限。(译者注:不了解的读者可看看Z-order,它和下文的希尔伯特曲线都是将二维的点映射到一维的方法)

Geohash

上述编号系统可能看起来有些熟悉,没错,就是geohash!此刻,你可以把四叉树扔掉了。节点编号,或者说geohash,包含了对于节点在树中位置我们需要的全部信息。全高树中的每个叶节点是个完整的geohash,每个内部节点代表从它最小的叶节点到最大的叶节点的区间。因此,通过查询所需的节点覆盖的数值区间中的一切(在geohash上索引),你可以有效地定位任意内部节点下的所有数据点。

一旦我们丢掉了四叉树,查询就变得复杂一点了。我们需要事先构建搜索集合而不是在树中递归地精炼搜索集合。首先,找到完全覆盖查询区域的最小前缀(或者说

四叉树节点译者注:注意在我们的编号系统中节点由比特串表示)。在最坏情况下,这可能远大于实际的查询区域,比如对于在索引区域中心、和四个象限都相交的小块地方,查询将要从根节点开始。

现在的目标是构建一组完全包含查询区域的前缀,并且尽可能少包含区域外的部分。如果没有其他约束,我们可以简单地选择与查询区域相交的叶节点,但这会造成大量的查询。所以要加一个约束:使得要查询的不同区间最少。

一种达到这个目的的方法是先设置我们愿意承受的查询区间的最大数目。构建一组区间,最开始都设为我们之前指定的前缀。从中选择可以再分裂而不超出最大区间数并将从查询区域删除最不受欢迎区域的节点。重复这个过程直到集合中再没有区间可以细分。最后,检查得到的集合,如果可能的话合并相邻的区间。下面的图说明了这对于查询一个圆形区域且限制最大5个查询区间是如何工作的。

图3 一个对区域的查询是怎样分解成一连串geohash前缀/区间的

这个方法工作地很好,它使我们避免了递归查找。我们执行的一整套区间查找都可以并行完成。由于每次查找都预期要一次硬盘搜索,将查询并行化大大减少了返回结果需要的时间。

然而,我们还可以做得更好。你可能注意到上图中我们要查询的所有区域都是相邻的,但我们却只能将其中两个合并(选择区域的右下角的两个)成一个单独的查询,进而只要4次单独查询。(译者注:这两个区域可以合并是因为它们在geohash 以Z字形遍历区域的路径上是相邻的)这个后果部分是由于geohash访问子区域的顺序,在每个象限中从左到右,从上到下。从右上角象限到左下角象限的不连续性使得我们不得不将本可以使之连续的区间分裂。如果以不同的顺序访问区域,可能我们就可以最小化或者消除这些不连续性,使得更多的区域可以被看做是相邻的,一次查询就可得到结果。通过这样效率上的提升,对于同样的覆盖区域,我们可以做更少的查询,或者相反地,同样的查询次数的情况下包含更少的无关区域。

图4 geohash访问象限的顺序

希尔伯特曲线

现在假设我们以U字形来访问区域。在每个象限中,我们同样以U字形来访问子象限,但是要调整好U字形的朝向使得和相邻的象限衔接起来。如果我们正确地组织了这些U字形的朝向,我们就能完全消除不连续性,不管我们选择了什么分辨率,都能连续地访问整个区域,可以在完全地探访了一个区域后才移动到下一个。这个方案不仅消除了不连续性,而且提高了总体的局域性。按照这个方案得到的图案看起来有些熟悉,没错,就是希尔伯特曲线。

希尔伯特曲线属于一类被称为空间填充曲线的一维分形,因为它们虽然是一维的线,却可以填充固定区域的所有空间。它们相当有名,部分是由于XKCD把它们用于互联网地图。如你所见,对于空间索引它们也是有用的,因为它们展现的正是我们需要的局域性和连续性。再看看之前用一组查询来覆盖圆的例子,我们发现(应用希尔伯特曲线)还可以减少一次查询:左下方的小区域现在和它右边的区域连起来了(减少一次),虽然底部的两块区域不再连续了(增加一次),右下角的区域现在却和它上方的连续了(减少一次)。

图5 希尔伯特曲线访问象限的顺序

到目前为止,我们优雅的系统还缺一样东西:将(x,y)坐标转换为希尔伯特曲线上相应位置的方法。对于geohash,这是简单而明显的–只需将x, y坐标交错,但没有明显的方法修改这个方案使之对希尔伯特曲线也适用。在网上搜索,你很可能遇到很多关于希尔伯特曲线是怎样画出来的描述,但很少有关于找到任意点(在曲线上)位置的。为了搞定它,我们需要更仔细看看希尔伯特曲线是怎么递归构建的。

首先要注意到虽然大多数关于希尔伯特曲线的文献都关注曲线是怎么画出来的,却容易让我们忽略曲线的本质属性以及其重要性:曲线规定了平面上点的顺序。如果

我们用这顺序来表达希尔伯特曲线,画曲线就不值一提了:仅仅是把点连起来。忘记怎么把子曲线连起来吧,把注意力集中在怎么递归地列举点上。

图6 希尔伯特曲线规定了二维平面上的点的顺序

在根这一层,列举点很简单:选定一个方向和一个起始点,环绕四个象限,用0到3给他们编号。当我们要确定访问子象限的顺序同时维护总体的邻接属性,困难就来了。通过检查我们发现,子象限的曲线是原曲线的简单变换,而且只有四种变换。自然地,这个结论也适用于子子象限,等等。对于一个给定的象限,我们在其中画出的曲线是由象限所在大的方形的曲线以及该象限的位置决定的。只需要费一点力,我们就能构建出如下概况所有情况的表。

图7

假设我们想用这个表来确定某个点在第三层希尔伯特曲线上的位置。在这个例子中,假设点的坐标是(5,2)。(译者注:请参照图8)从上图的第一个方形开始,找到你

的点所在的象限。在这个例子中,是在右上方的象限。那么点在希尔伯特曲线上的

位置的第一部分是3(二进制是11)。接着我们进入象限3里面的方块,在这个例

子中,它是(图7中的)第二个方块。重复刚才的过程:我们的点落在哪个子象限?

这次是左下角,意味着位置的下一部分是1(二进制01),我们将进入的小方块又

是第二个。最后一次重复这个过程,发现点落在右上角的子子象限,因此位置的最

后部分是3(二进制11)。把这些位置连接起来,我们得到点在曲线上的位置是二

进制的110111,或者十进制的55。

图8 三阶希尔伯特曲线

让我们更系统一些,写出从x, y 坐标到希尔伯特曲线位置转换的方法。首先,我们

要以计算机看得懂的形式表达图7:

1 2 3 hilbert_map = {

'a': {(0, 0): (0, 'd'), (0, 1): (1, 'a'), (1, 0): (3, 'b'), (1, 1): (2, 'a')}, 'b': {(0, 0): (2, 'b'), (0, 1): (1, 'b'), (1, 0): (3, 'a'), (1, 1): (0, 'c')},

4 5 'c': {(0, 0): (2, 'c'), (0, 1): (3, 'd'), (1, 0): (1, 'c'), (1, 1): (0, 'b')}, 'd': {(0, 0): (0, 'a'), (0, 1): (3, 'c'), (1, 0): (1, 'd'), (1, 1): (2, 'd')}}

上面的代码中,每个hilbert_map的元素对应图7四个方形中的一个。为了容易区分,我用一个字母来标识每个方块:’a'是第一个方块,’b'是第二个,等等。每个方块的值是个字典,将(子)象限的x, y坐标映射到曲线上的位置(元组值的第一部分)以及下一个用到的方块(元组值的第二部分)。下面的代码展示了怎么用这个来将x, y坐标转换成希尔伯特曲线上的位置:

1 2 3 4 5 6 7 8 9 10 def point_to_hilbert(x, y, order=16):

current_square = 'a'

position = 0

for i in range(order - 1, -1, -1):

position <<= 2

quad_x = 1 if x & (1 << i) else 0

quad_y = 1 if y & (1 << i) else 0

quad_position, current_square = hilbert_map[current_square][(quad_x, quad_y)] position |= quad_position

return position

函数的输入是为整数的x, y坐标和曲线的阶。一阶曲线填充2×2的格子,二阶曲线填充4×4的格子,等等。我们的x, y坐标应该先标准化到0到2order-1的区间。这个函数从最高位开始,逐步处理x, y坐标的每个比特位。在每个阶段中,通过测试对应的比特位,可以确定坐标处于哪个(子)象限,还可以从我们之前定义的hi lbert_map中取得在曲线上的位置以及下一个要用的方块。在这阶段取得的位置,加入到目前总的位置的最低两位。在下一次循环的开头,总的位置左移两位以便给下一个位置腾出地方。

让我们运行一下之前的例子来检验一下函数写对了没有:

1 2 >>> point_to_hilbert(5,2,3) 55

对了!为了进一步测试,我们可以用这个函数生成一条希尔伯特曲线的有序点的完整列表,然后用电子制表软件把它们画出来看我们是否真的得到了一条希尔伯特曲线。在Python交互解释器中输入如下代码:

1 2 3 >>> points = [(x, y) for x in range(8) for y in range(8)]

>>> sorted_points = sorted(points, key=lambda k: point_to_hilbert(k[0], k[1], 3))

>>> print 'n'.join('%s,%s' % x for x in sorted_points)

将输出的文本粘贴到文件中,保存为hilbert.csv,用你最喜欢的电子制表软件打开,将数据画成一个散点图。结果当然是一条漂亮的希尔伯特曲线!

将hilbert_map做简单的反转就能实现point_to_hilbert的逆向功能(将希尔伯特曲线上的位置转换为x, y坐标),把这个留给读者作为练习吧。

结论

空间索引,从四叉树到geohash到希尔伯特曲线,到这就结束了。最后一点说明:如果你将一条希尔伯特曲线上的x, y坐标的有序序列写成二进制形式,对于顺序你注意到什么有趣的东西吗?你想到了什么?

结束前的一点警告:我在这里描述的全部索引方法都只适用于索引点。如果你想索引线、折线或者多边形,这些方法可能就不管用了。据我所知,已知的唯一能有效索引形体的算法是R-tree,这是一种完全不同且更复杂的方法。

基于四叉树的空间索引

基于四叉树的空间索引 四叉树是建立在对E域循环分解原则上的一种层次数据结构,在计算机图形处理、图像处理及地理信息系统中有着广泛的应用,它也可以应用于对空间点的表示于索引。 分为点四叉树,区域四叉树,CIF四叉树等。 1、点四叉树主要针对空间点的存储表达和索引,对于k维数据空间,点四叉树的每个结点存储了一个空间点得信息及2^k个孩子节点的指针,且隐式地与一索引空间相对应。以该空间点为划分点,将其对应索引空间分为两两不相交的2^k个子空间,依次与它的2^k 个孩子结点相对应。对于某一个子空间的点,则分配给对应的子树。如图1是二维空间的一棵点四叉树的例子。 其点四叉树的构造过程如下。 (1)输入空间点A,由于四叉树为空,因此A作为四叉树的根节点,其隐式对应的索引空间是整个数据空间,以A为划分原点,将对应的索引空间划分成四个子空间,NE,NW,EW,SE依次为其孩子结点隐式对应的子空间。 (2)输入空间点B,B落入A的NW象限且A的NW孩子结点为空,因此B作为A的NW孩子结点;同样,C作为F,C,E分别作为A的NE,SW,SE孩子结点。 (3)输入空间D,D落入A的NW象限,继续往下查找,D落入B的NE象限且B的NE孩子结点为空,因此D作为B的NE孩子结点 优点:结构简单,对于精确匹配的点查找性能较高。 缺点:树的动态性差,删除结点处理复杂;树的结构由点的插入顺序决定,难以保证树深度的平衡;区域查找性能较差;对于非点状空间目标,必须采用目标近似与空间映射技术,效率低;不利于树的外部存储设备存储与页面调度。 2、区域四叉树 采用区域四叉树索引多维空间的点,常用方法有MX四叉树PR四叉树,避免了点四叉树动态性差,结构完全由点得插入顺序决定等缺点 2.1、MX四叉树 MX四叉树将每个空间点看成区域四叉树中得一个黑像素,或当做一方阵中的非零元素。它与区域四叉树的组织方式很相似,区别是叶结点为黑结点或空结点,且分别表示数据空间某一个位置空间点得存在与否。如图2是二维空间的一棵MX四叉树的例子。 优点:所有的点都位于叶节点,树的深度是平衡的;空间划分是等分,划分成的每个象限具有相同大小;可以采用线性四叉树的存储结构,避免指针域的存储,提高空间利用率。 缺点:插入(删除)一个点可能导致树的深度增加(减少)一层或多层,所有叶结点必须重新定位;树的深度往往很大,影响查找效率。 2.2、PR四叉树 PR四叉树叶节点或者为空,或者包含一个数据点。与MX四叉树构造过程类似,区别在于当分解到一个象限只包含一个点时,不需要继续分解使该点位于某一个子象限的最左下角。 特点:插入或删除一个点不会影响其他分支,操作简单;叶结点树及树的深度都小于MX四叉树,检索效率较高。 如图3是二维空间的一棵RP四叉树的例子。

希尔伯特空间

一百年前的数学界有两位泰斗:庞加莱和希尔伯特,而尤以后者更加出名,我想主要原因是他曾经在1900 年的世界数学家大会上提出了二十三个著名的希尔伯特问题,指引了本世纪前五十年数学的主攻方向,不过还有一个原因呢,我想就是著名的希尔伯特空间了。 希尔伯特空间是希尔伯特在解决无穷维线性方程组时提出的概念,原来的线性代数理论都是基于有限维欧几里得空间的,无法适用,这迫使希尔伯特去思考无穷维欧几里得空间,也就是无穷序列空间的性质。 大家知道,在一个欧几里得空间R^n 上,所有的点可以写成为:X= (x1,x2,x3,..., xn )。那么类似的,在一个无穷维欧几里得空间上点就是:X= (x1,x2,x3 ,xn,.................................................................... ),一个 点的序列。 欧氏空间上有两个重要的性质,一是每个点都有一个范数(绝对值,或者说是一个点到原点的距离),||X||^2= ∑xn^2,可是这一重要性质在无穷维时被破坏了:对于无穷多个xn,∑xn^2 可以不存在(为无穷大)。于是希尔伯特将所有∑ xn^2 为有限的点做成一个子空间,并赋以X*X'= ∑ xn*xn' 作为两点的内积。这个空间我们现在叫做l^2 ,平方和数列空间,这是最早 的希尔伯特空间了。 注意到我只提了内积没有提范数,这是因为范数可以由点与自身的内积推出,所以内积是一个更加强的条件,有内积必有范数,反之不然。只有范数的空间叫做Banach 空间,(以后有时间再慢慢讲:- )。 如果光是用来解决无穷维线性方程组的话,泛函就不会被称为现代数学的支柱了。 Hilbert 空间中我只提到了一个很自然的泛函空间:在无穷维欧氏空间上∑ xn^2 为有限的点。这个最早的Hilbert space 叫做l^2 (小写的l 上标2,又叫小l2 空间),非常类似于有限维的欧氏空间。

空间索引使用的意义及网格索引和四叉树索引简单介绍 转

空间索引使用的意义及网格索引和四叉树索引简单介绍转空间索引使用的意义及网格索引和四叉 树索引简单介绍转 空间索引使用的意义及网格索引和四叉树索引简单介绍[转载]2010-09-27 07:40在介绍空间索引之前,先谈谈什么叫"索引"。对一个数据集做"索引",是为了提高对这个数据集检索的效率。书的"目录"就是这本书内容的"索引",当我们拿到一本新书,想查看感兴趣内容的时候,我们会先查看目录,确定感兴趣的内容会在哪些页里,直接翻到那些页,就OK了,而不是从第一章节开始翻,一个字一个字地找我们感兴趣的内容,直到找到为止,这种检索内容的效率也太低了,如果一本书没有目录,可以想象有多么不方便…可见书的目录有多重要,索引有多重要啊~ 现在大家对索引有了感性认识,那什么是"空间索引"呢?"空间索引"也是"索引",是对空间图形集合做的一个"目录",提高在这个图形集合中查找某个图形对象的效率。比如说,我们在一个地图图层上进行矩形选择,确定这个图层上哪些图元被这个矩形所完全包含呢,在没有"空间索引"的情况下,我们会把这个图层上的所有图元,一一拿来与这个矩形进行几何上的包含判断,以确定到底哪些图元被完全包含在这个矩形内。您是不是觉得这样做很合理呢?其实不然,我们先看一个网格索引的例子: 我们对这个点图层作了网格索引,判断哪些点在这个矩形选择框内,是不需要把这个图层里所有的点都要与矩形进行几何包含运算的,只对a,b,c,d,e,f,g这七个点做了运算。可以推想一下,如果一个点图层有十万个点,不建立空间索引,任何地图操作都将对整个图层的所有图元遍历一次,也就是要For循环10万次;建立索引将使得For循环的次数下降很多很多,效率自然提高很多~

用四叉树和希尔伯特曲线做空间索引

超酷算法:用四叉树和希尔伯特曲线做空间索引 阅读·四叉树, 希尔伯特曲线, 空间索引, 算法 ?Avalon探索之旅基础教程---- 简单绑定 ?Gopher China 2015 上海大会 ?Android必学-异步加载 ?Android必学-BaseAdapter的使用与优化 本文由伯乐在线 - demoZ翻译,黄利民校稿。未经许可,禁止转载! 英文出处:https://www.360docs.net/doc/2c8658219.html,。欢迎加入翻译组。 随着越来越多的数据和应用和地理空间相关,空间索引变得愈加重要。然而,有效地查询地理空间数据是相当大的挑战,因为数据是二维的(有时候更高),不能用标准的索引技术来查询位置。空间索引通过各种各样的技术来解决这个问题。在这篇博文中,我将介绍几种:四叉树,geohash(不要和geohashing混淆)以及空间填充曲线,并揭示它们是怎样相互关联的。 四叉树 四叉树是种很直接的空间索引技术。在四叉树中,每个节点表示覆盖了部分进行索引的空间的边界框,根节点覆盖了整个区域。每个节点要么是叶节点,有包含一个或多个索引点的列表,没有孩子。要么是内部节点,有四个孩子,每个孩子对应将区域沿两根轴对半分得到的四个象限中的一个,四叉树也因此得名。

图1 展示四叉树是怎样划分索引区域的来源:维基百科 将数据插入四叉树很简单:从根节点开始,判断你的数据点属于哪个象限。递归到相应的节点,重复步骤,直到到达叶节点,然后将该点加入节点的索引点列表中。如果列表中的元素个数超出了预设的最大数目,则将节点分裂,将其中的索引点移动到相应的子节点中去。 图2 四叉树的内部结构

查询四叉树时从根节点开始,检查每个子节点看是否与查询的区域相交。如果是,则递归进入该子节点。当到达叶节点时,检查点列表中的每一个项看是否与查询区域相交,如果是则返回此项。 注意四叉树是非常规则的,事实上它是一种字典树,因为树节点的值不依赖于插入的数据。因此我们可以用直接的方式给节点编号:用二进制给每个象限编号(左上是00,右上是10等等译者注:第一个比特位为0表示在左半平面,为1在右半平面。第二个比特位为0表示在上半平面,为1在下半平面),任一节点的编号是由从根开始,它的各祖先的象限号码串接而成的。在这个编号系统中,图2中右下角节点的编号是1101。 如果我们定义了树的最大深度,不需通过树就可以计算数据点所在节点的编号:只要把节点的坐标标准化到适当的整数区间中(比如32位整数),然后把转化后x, y坐标的比特位交错组合。每对比特指定了假想的四叉树中的一个象限。(译者注:不了解的读者可看看Z-order,它和下文的希尔伯特曲线都是将二维的点映射到一维的方法) Geohash 上述编号系统可能看起来有些熟悉,没错,就是geohash!此刻,你可以把四叉树扔掉了。节点编号,或者说geohash,包含了对于节点在树中位置我们需要的全部信息。全高树中的每个叶节点是个完整的geohash,每个内部节点代表从它最小的叶节点到最大的叶节点的区间。因此,通过查询所需的节点覆盖的数值区间中的一切(在geohash上索引),你可以有效地定位任意内部节点下的所有数据点。 一旦我们丢掉了四叉树,查询就变得复杂一点了。我们需要事先构建搜索集合而不是在树中递归地精炼搜索集合。首先,找到完全覆盖查询区域的最小前缀(或者说

GIS空间索引

索引方法: 网格索引——点要素(图元),线、面要素,有冗余 四叉树索引——线、面要素,有冗余 改进的四叉树索引——线、面要素 R树——空间重叠 一、网格索引,四叉树索引 在介绍空间索引之前,先谈谈什么叫“索引“。对一个数据集做”索引“,是为了提高对这个数据集检索的效率。书的”目录“就是这本书内容的”索引“,当我们拿到一本新书,想查看感兴趣内容的时候,我们会先查看目录,确定感兴趣的内容会在哪些页里,直接翻到那些页,就OK了,而不是从第一章节开始翻,一个字一个字地找我们感兴趣的内容,直到找到为止,这种检索内容的效率也太低了,如果一本书没有目录,可以想象有多么不方便…可见书的目录有多重要,索引有多重要啊! 现在大家对索引有了感性认识,那什么是“空间索引“呢?”空间索引“也是”索引“,是对空间图形集合做的一个”目录“,提高在这个图形集合中查找某个图形对象的效率。比如说,我们在一个地图图层上进行矩形选择,确定这个图层上哪些图元被这个矩形所完全包含呢,在没有”空间索引“的情况下,我们会把这个图层上的所有图元,一一拿来与这个矩形进行几何上的包含判断,以确定到底哪些图元被完全包含在这个矩形内。您是不是觉得这样做很合理呢?其实不然,我们先看一个网格索引的例子:

我们对这个点图层作了网格索引,判断哪些点在这个矩形选择框内,是不需要把这个图层里所有的点都要与矩形进行几何包含运算的,只对 a,b,c,d,e,f,g这七个点做了运算。可以推想一下,如果一个点图层有十万个点,不建立空间索引,任何地图操作都将对整个图层的所有图元遍历一次,也就是要For循环10万次;建立索引将使得For循环的次数下降很多很多,效率自然提高很多! 呵呵…想必大家都知道空间索引的好处了,也不知不觉向大家介绍了点图层的网格索引,还有哪些常用的空间索引呢?这些空间索引又该如何实现呢?带着这样的问题,下面介绍几种常用的空间索引。 网格索引 网格索引就是在一个地图图层上,按每个小网格宽△w,高△h打上均匀的格网,计算每个图元所占据的网格或者所经过的网格单元集合,

四叉树算法

前序 四叉树或四元树也被称为Q树(Q-Tree)。四叉树广泛应用于图像处理、空间数据索引、2D中的快速碰撞检测、存储稀疏数据等,而八叉树(Octree)主要应用于3D图形处理。对游戏编程,这会很有用。本文着重于对四叉树与八叉树的原理与结构的介绍,帮助您在脑海中建立四叉树与八叉树的基本思想。本文并不对这两种数据结构同时进行详解,而只对四叉树进行详解,因为八叉树的建立可由四叉树的建立推得。 四叉树与八叉树的结构与原理 四叉树(Q-Tree)是一种树形数据结构。四叉树的定义是:它的每个节点下至多可以有四个子节点,通常把一部分二维空间细分为四个象限或区域并把该区域里的相关信息存入到四叉树节点中。这个区域可以是正方形、矩形或是任意形状。以下为四叉树的二维空间结构(左)和存储结构(右)示意图(注意节点颜色与网格边框颜色): 四叉树的每一个节点代表一个矩形区域(如上图黑色的根节点代表最外围黑色边框的矩形区域),每一个矩形区域又可划分为四个小矩形区域,这四个小矩形区域作为四个子节点所代表的矩形区域。 较之四叉树,八叉树将场景从二维空间延伸到了三维空间。八叉树(Octree)的定义是:若不为空树的话,树中任一节点的子节点恰好只会有八个,或零个,也就是子节点不会有0与8以外的数目。那么,这要用来做什么?想象一个立方体,我们最少可以切成多少个相同等分的小立方体?答案就是8个。如下八叉树的结构示意图所示:

四叉树存储结构的c语言描述:[cpp]view plaincopy 1./* 一个矩形区域的象限划分:: 2. 3. UL(1) | UR(0) 4. ----------|----------- 5. LL(2) | LR(3) 6.以下对该象限类型的枚举 7.*/ 8.typedef enum 9.{ 10. UR = 0, 11. UL = 1, 12. LL = 2, 13. LR = 3 14.}QuadrantEnum; 15. 16./* 矩形结构 */ 17.typedef struct quadrect_t 18.{ 19.double left, 20. top, 21. right, 22. bottom; 23.}quadrect_t;

基于四叉树算法的地理信息数据管理研究_张达

第29卷第5期2013年10月 哈尔滨商业大学学报(自然科学版) Journal of Harbin University of Commerce (Natural Sciences Edition ) Vol.29No.5Oct.2013 收稿日期:2013-06-19.作者简介:张 达(1987-),男,硕士,研究方向:信息管理与信息系统. 基于四叉树算法的地理信息数据管理研究 张 达 (天津大学管理与经济学部,天津300072) 摘 要:地理信息数据生产管理系统中采用Web 地图管理接合表.地图在浏览器中的显示受到浏览 器和网络的限制, 整幅地图加载速度慢,用户体验因此降低.为提高地图生成、发布、浏览的效率,可以在服务器端采用瓦片金字塔技术,提前生成并存储各级别的地图瓦片;瓦片金字塔技术的编码可以利用四叉树算法实现.能够在不同缩放比例请求下快速、准确地查找并显示瓦片.关键词:四叉树算法;地理信息数据生产;接合表;瓦片金字塔中图分类号:P208 文献标识码:A 文章编号:1672-0946(2013)05-0600-04 Study on quad -tree -algorithm -based geo -information data management ZHANG Da (School of Management ,Tianjin University ,Tianjin 300072,China ) Abstract :Web map is used in managing index diagram of geo -information data processing management system.Map displaying is limited by Web browser and network conditions.Loading entire map is such a time -consuming process that user experience is undermined.Tile pyramid ,a technology that pre -generates tiles in different levels ,can reduce server and network load and promote the efficiency of map -generating ,publishing ,displaying and browsing.Managing index diagram with quad -tree -algorithm -based tile pyramid technol-ogy can query and display tile promptly from multi -scaling requesting. Key words :quad -tree algorithm ;geo -information data processing ;index diagram ;tile pyramid 地理信息数据生产管理系统是测绘行业数据 生产管理的核心工具.在测绘行业中,作业员如同流水线上的工人一样,按照一定的工序和步骤,对地理影像数据进行加工、处理和编辑,这些工序和成果都在地理信息数据生产管理系统中管理.[1] 但是测绘行业的生产管理具有一定的特殊性,因此生产管理一般都以图幅为单位, 在地理信息数据生产管理系统中引进Web 地图管理接合表是地理信息数据生产行业发展的一种趋势.Web 地图的加载和显示往往受到浏览器和网络带宽的限制,因此为了提高系统的易用性,提升用户体验,地理信息数据生产管理系统中应用了瓦片式地图的加载方 式加载Web 地图,并应用四叉树算法对瓦片金字 塔建立索引 [2-6] .1瓦片式地图模型 图1展示了瓦片金字塔在地图数据生成、存储 与调用过程中的作用.图中所示模型可分为两个部分看待:服务器端的瓦片金字塔地图库以及客户端支持AJAX (Asynchronous JavaScript and XML ,异步JavaScript 与XML )技术的Web 浏览器.为了构建服务器端的瓦片金字塔地图库,首先需要对采集到的原始地理信息数据实施显示符号化,并分层切 割成 “瓦片”.瓦片(Tile )是一种特殊的图形文件,

四叉树索引 四叉树索引(Quadtree),类似于前面介绍的网格 …

四叉树索引 四叉树索引(Quadtree),类似于前面介绍的网格索引,也是对地理空间进行网格划分,对地理空间递归进行四分来构建四叉树,本文将在普通四叉树的基础上,介绍一种改进的四叉树索引结构。 首先,先介绍一个GIS(Geographic Information System)或者计算机图形学上非常重要的概念——最小外包矩形(MBR-Minimum Bounding Rectangle): 最小外包矩形MBR就是包围图元,且平行于X,Y轴的最小外接矩形。MBR到底有什么用处呢,为什么要引入这个概念呢?因为,图元的形状是不规则的,而MBR是平行于X,Y轴的规则图形,设想一下,如果所有的图元都是平行于X,Y轴的矩形,那针对这样的矩形进行几何上的任何判断,是不是要简单很多呢?不管我们人自己写公式算法或者编写程序运行,是不是都要比原本复杂的图形几何运算要简洁很多呢?答案很显然。 然后,我们再介绍一下GIS空间操作的步骤(这个步骤,在前面忘记向大家说明了,在这里补充一下)

可见,过滤阶段,通过空间索引可以排除掉一些明显不符合条件的图元,得到后选集合,然后对后选图元集合进行精确几何运算,得到最终结果。大家可能会有这样的疑问,这样有必要吗?是不是反而把问题复杂化了?合适的空间索引只会提高计算机的效率,没有空间索引,我们无疑要对集合中的每个图元进行精确几何运算,而这样的运算是复杂的,是非常占用CPU的,所以需要空间索引,采取少量的内存和简单的CUP运算,来尽量减少那种高耗CUP的精确运算的次数,这样做是完全值得的。至于精确的几何运算到底复杂在哪里,该如何进行精确的几何运算,将在下面的章节中详细描述,这里主要介绍过滤阶段的空间索引。 现在,让我们来具体了解一下“四叉树索引”。 四叉树索引就是递归地对地理空间进行四分,直到自行设定的终止条件(比如每个节点关联图元的个数不超过3个,超过3个,就再四分),最终形成一颗有层次的四叉树。图中有数字标识的矩形是每个图元的MBR,每个叶子节点存储了本区域所关联的图元标识列表和本区域地理范围,非叶子节点仅存储了区域的地理范围。大家可以发现,同样存在一个图元标识被多个区域所关联,相应地存储在多个叶子节点上,比如“6“所代表的图元,分别存储在四个分枝上。这样,就存在索引的冗余,与网格索引存在同样的弊端。下面我们介绍一种改进的四叉树索引,或者说是分层的网格索引。 改进的四叉树索引,就是为了避免这种空间索引的冗余,基本改进思路是:让每个图元的MBR被一个最小区域完全包含。 可以看出,3和13分别都跨越了两个区域,要被一个最小区域完全包含,就只能是根

内积空间与希尔伯特空间

2.3 内积空间与希尔伯特空间 通过前面的学习,知道n 维欧氏空间就是n 维线性赋范空间的“模型”,范数相当于向量的模,表明了线性赋范空间的代数结构.对于三维向量空间,我们知道向量不仅有模,而且两个向量有夹角,例如θ为向量α和β的夹角时有:cos αβ θαβ ?= 或者cos αβαβθ?=,其中αβ?表示两个向量的数量积(或点积或内积),α表示向量的模.于是便有了直交性、直交投影以及向量的分解等概念,这些均反映了空间的“几何结构”.通过在线性空间上定义内积,可得到内积空间,由内积可导出范数,若完备则为Hilbert 空间. 2.3.1 内积空间 定义1.1 设U 是数域K 上的线性空间,若存在映射( , )??:U U ?→K ,使得,,x y z U ?∈, α∈K ,它满足以下内积公理: (1) (,)0x x ≥;(,)00x x x =?=; 正定性(或非负性) (2) (,)(,)x y y x =; 共轭对称性 (3) (,)(,)(,)x z y x y z y αβαβ+=+, 线性性 则称在U 上定义了内积( , )??,称(,)x y 为x 与y 的内积,U 为K 上的内积空间(Inner product spaces ).当=K R 时,称U 为实内积空间;当=K C 时,称U 为复内积空间.称有限维的实内积空间为欧几里德(Euclid spaces )空间,即为欧氏空间;称有限维的复内积空间为酉(Unitary spaces )空间. 注1:关于复数:设z a bi =+∈C ,那么z oz =;(cos sin )z r i θθ=+其中θ为辐射角、r z =;2 z z z ?=;z z =;对于12,z z ∈C ,有1212z z z z ?=?. 注2:在实内积空间中,第二条内积公理共轭对称性变为对称性. 注3:在复内积空间中,第三条内积公理为第一变元是线性的,第二变元是共轭线性的. 因为(,)(,)(,)(,)(,)x y y x y x y x x y ααααα===?=,所以有 (,)(,)(,)x y z x y x z αβαβ+=+, 即对于第二变元是共轭线性的.在实内积空间中,第三条内积公理为第一变元、第二变元均为

空间索引使用的意义及网格索引和四叉树索引简单介绍

空间索引 在介绍空间索引之前,先谈谈什么叫“索引“。对一个数据集做”索引“,是为了提高对这个数据集检索的效率。书的”目录“就是这本书内容的”索引“,当我们拿到一本新书,想查看感兴趣内容的时候,我们会先查看目录,确定感兴趣的内容会在哪些页里,直接翻到那些页,就OK了,而不是从第一章节开始翻,一个字一个字地找我们感兴趣的内容,直到找到为止,这种检索内容的效率也太低了,如果一本书没有目录,可以想象有多么不方便…可见书的目录有多重要,索引有多重要啊! 现在大家对索引有了感性认识,那什么是“空间索引“呢?”空间索引“也是”索引“,是对空间图形集合做的一个”目录“,提高在这个图形集合中查找某个图形对象的效率。比如说,我们在一个地图图层上进行矩形选择,确定这个图层上哪些图元被这个矩形所完全包含呢,在没有”空间索引“的情况下,我们会把这个图层上的所有图元,一一拿来与这个矩形进行几何上的包含判断,以确定到底哪些图元被完全包含在这个矩形内。您是不是觉得这样做很合理呢?其实不然,我们先看一个网格索引的例子: 我们对这个点图层作了网格索引,判断哪些点在这个矩形选择框内,是不需要把这个图层里所有的点都要与矩形进行几何包含运算的,只对a,b,c,d,e,f,g这七个点做了运算。可以推想一下,如果一个点图层有十万个点,不建立空间索引,任何地图操作都将对整个图层的所有图元遍历一次,也就是要For循环10万次;建立索引将使得For循环的次数下降很多很多,效率自然提高很多! 呵呵…想必大家都知道空间索引的好处了,也不知不觉向大家介绍了点图层的网格索引,还有哪些常用的空间索引呢?这些空间索引又该如何实现呢?带着这样的问题,下面介绍几种常用的空间索引。

希尔伯特空间

希尔伯特空间 量子化学维基,人人都可编辑的量子化学百科全书。 Jump to: navigation, search Template:Zhwp 在数学领域,希尔伯特空间是欧几里德空间的一个推广,其不再局限于有限维的情形。与欧几里德空间相仿,希尔伯特空间也是一个内积空间,其上有距离和角的概念(及由此引伸而来的正交性与垂直性的概念)。此外,希尔伯特空间还是一个完备的空间,其上所有的柯西列等价于收敛列,从而微积分中的大部分概念都可以无障碍地推广到希尔伯特空间中。希尔伯特空间为基于任意正交系上的多项式表示的傅立叶级数和傅立叶变换提供了一种 有效的表述方式,而这也是泛函分析的核心概念之一。希尔伯特空间是公式化数学和量子力学的关键性概念之一。 简单介绍 希尔伯特空间以大卫·希尔伯特的名字命名,他在对积分方程的研究中研究了希尔伯特空间。冯·诺伊曼在其1929年出版的关于无界厄米算子的著作中,最早使用了“希尔伯特空间”这个名词。冯·诺伊曼可能是最早清楚地认识到希尔伯特空间的重要性的数学家之一,他在进行对量子力学的基础性和创造性地研究的时候认识到了这一点。此项研究由冯·诺伊曼与希尔伯特和朗道展开,随后由尤金·维格纳(Template:Lang)继续深入。“希尔伯特空

间”这个名字迅速被其他科学家所接受,例如在外尔1931年出版的著作《群与量子力学的理论》(Template:Lang)中就使用这一名词,此书的英文平装版ISBN编号为0486602699。 一个抽象的希尔伯特空间中的元素往往被称为向量。在实际应用中,它可能代表了一列复数或是一个函数。例如在量子力学中,一个物理系统可以被一个复希尔伯特空间所表示,其中的向量是描述系统可能状态的波函数。详细的资料可以参考量子力学的数学描述相关的内容。量子力学中由平面波和束缚态所构成的希尔伯特空间,一般被称为装备希尔伯特空间(rigged Hilbert space)。 在一个复向量空间H上的给定的内积< .,. > 可以按照如下的方式导出一个范数(norm): 此空间称为是一个希尔伯特空间,如果其对于这个范数来说是完备的。这里的完备性是指,任何一个柯西列都收敛到此空间中的某个元素,即它们与某个元素的范数差的极限为0。任何一个希尔伯特空间都是巴拿赫空间,但是反之未必。 任何有限维内积空间(如欧几里德空间及其上的点积)都是希尔伯特空间。但从实际应用角度来看,无穷维的希尔伯特空间更有价值,例如

一种基于四叉树的快速聚类算法

!!收稿日期! !""#$%"$%!"修订日期!!""&$"#$%’!!基金项目!江苏省重点实验室开放基金资助项目!q ,o "’"‘#"!!作者简介!栾丽华!%)1"$"#女#江苏盐城人#助教#硕士研究生#主要研究方向$数据挖掘%!吉根林! %)‘#$"#男#江苏海安人#教授#博士#主要研究方向$数据挖掘0 文章编号$%""%$)"1%!!""&""&$%""%$"’ 一种基于四叉树的快速聚类算法 栾丽华!吉根林 "南京师范大学计算机科学系!江苏南京!%"")( #8T 44: 8F %7$+#/%.#*,?*/73#%+"I 0%.I %5S $.P 0.2S *+/$A=.04%+:0#’5S $.P 0.2\0$.2:3!%"")(5?<0.$C +63)$/4)7K :N M 9/k ,-.F=>;534N M B A N 934:;=>;534N M <^=A 975:P B =7H N 399O =A 23525A 97R +N @M 5A 9N M 9254:N A 4:N M 9@43P B 9H A M =297:94;M ^53M 5575Q =@539254:N =A A 997A N 59f 2=:7N M 9@>B A N 93I O M 4@M79@39=A 97N M 99f 9@B N 45:Q 39P B 9:@T 5Q 39;45:P B 93T =:7397B @97N M 9+_K@5A N R +NB A 97=Q =A N H @39=N 97P B =7H N 399N 59f 9@B N 939;45:P B 93T I O M 4@M:5N 5:>T 4<235U 97N M 9P B 93T 9Q Q 4@49:@T I ^B N=>A 5A M 53N 9:97N M 9N 4<95Q@5:A N 3B @N 4:;=A 2=N 4=>4:79f RE f 2934<9:N39A B >N AA M 5ON M =NN M 9:9O=>;534N M <4A 9Q Q 9@N 4U 9R 8’9: %$.37@>B A N 934:;V /k ,-.FV P B =7H N 399"!引言 在众多的聚类算法中#/k ,-.F 算法&%’是一种典型的基 于密度的算法#几乎可以发现任意形状的类(一个类就是密度相连的点的最大集合#且可由其中任意一个核心点唯一确定(/k ,-.F 算法从数据集F 中的任意一个点7开始# 查找F 中所有关于邻域半径17 :和邻域内最少包含点数60.V #:的从7密度可达的点(若7是核心点#则其邻域内的所有点和7同属于一个类#这些点将作为下一轮的考察对象!即种子点"#并通过不断查找从种子点密度可达的点来扩展它们所在的类#直至找到一个完整的类%若7不是核心点#即没有对象从7密度可达#则7被暂时地标注为噪声(然后#算法对F 中的下一个对象重复上述过程))当所有种子点都被考察过#一个类就扩展完成了(此时#若F 中还有未处理的点#算法则进行另一个类的扩展%否则#F 中不属于任何类的点即为噪声( /k ,-.F 算法通过检查F 中每个点的17:邻域来判断它是否是核心点#进而决定如何扩展类(因此#该算法的主要工作就是执行区域查询#即查询某个点的17:邻域中的所有点(它使用W * 树 &!’ 实现区域查询#使得算法效率比顺序查 询时的效率提高许多( /k ,-.F 算法将区域查询得到的所有未被处理过的点 都作为种子点#留待进一步扩展(但这种策略在处理大规模数据集中的较大类时#会使种子点的数目不断膨胀#导致内存需求量急速增长(另外#/k ,-.F 在进行聚类之前#必须建立针对所有数据的W * 树(然而#构造W * 树相当耗费时空资 源#并且W * 树在高维空间中可伸缩性很差(上述因素制约 了/k ,-.F 算法的性能#对此#本文提出了一种使用快速构造的四叉树进行区域查询的快速聚类算法l 6-/k ,-.F !l B =76399H ^=A 97-43P B 9H 9f 2 =:797/k ,-.F "(%!基于四叉树的快速聚类算法l 6-/k ,-.F %0%!算法思想 定义!核心点2的中空球形邻域是S 17:!7">S W Z *17:!7"(如图%中的灰色圆环 ( 图%!种子点的选取范围示意图 l 6-/k ,-.F 算法主 要对/k ,-.F 算法进行如下两点改进$ !%"l 6-/k ,-.F 算法选择核心点的中空球形邻域中的点作为种子点(这样# 种子点数减少#对应的区域查询次数也随之减少#+ +K 开销随之降低# 类得到快速扩展(注意到#同一个邻域内的点的邻域会相互覆盖(当一个点的邻域完全被其他点的邻域所覆盖时#其邻域可以通过对覆盖它的其他点进行区域查询得到#这意味着该点不必作为种子点(而这样的点基本处于邻域的内圈# 因此本文选取邻域的外圈!即中空球形邻域"中的点作为种子点#如图%所示(W Z 取值越大# 种子点的选取范围就越小#种子点数也越少#类扩展得就越不充分#错误划分的现象就越严重#从而聚类的错误率就越高%W Z 取值越小#种子点的选取范围就越大#种子点数也越多#区域查询的次数就越多#聚类的速度就越慢(实验表明#当W Z 取‘"Z 时# 聚类的质量与速度可以达到最第!&卷第&期 !""&年&月 ! 计算机应用 -5<2B N 93.22 >4@=N 45:A ! a 5>R !&F 5R & b =T ! ""&万方数据

基于空间数据库的几种常用空间索引技术研究

Geomatics Square NO.6 2011 (Total 113) 科技交流 基于空间数据库的几种常用空间索引技术研究 白航 (广东省国土资源测绘院,广州510500) 摘要:空间数据库是地理信息系统(GIS)的基础和核心,空间索引技术通过对存储介质上数据位置信息的描述来提高数据查询、检索及获取效率;其好坏直接影响空间数据库系统的可用性和可扩展性。本文介绍了几种常见的空间数据库索引技术:简单格网空间索引、K-D 树空间索引、R 树空间索引、四叉树空间索引等;系统总结了空间数据库索引技术的研究进展,探讨了其发展前景和存在问题。 关键词:空间数据库;空间索引;GIS 1.引言 空间数据库技术是随着GIS (地理信息系统)的发展而兴起的一门新技术,复杂的地理环境和海量、多维、结构复杂的空间数据导致了基于空间数据库查询、检索及空间计算的开销一般要比关系数据库大的多,特别是查询语句中条件谓词包含一些对空间数据操作或连接的一些函数,这些函数的计算开销远比数值计算或字符串比较等要大。若使用传统的关系型数据库管理系统(DBMS)来管理空间数据,其存在固有缺陷,用顺序扫描的方法查询的效率非常低。因此为了提高查询效率,采用空间索引技术十分必要。 2.空间数据库索引技术 空间数据用来表示空间物体的位置、形状、大小和分布特征等方面信息,适用于描述二维、三维或多维分布的区域现象。空间数据库是计算机物理存储介质上存储的地理空间数据的总和。数据库的索引机制可以用来快速访问某条特定查询所请求的数据,而无需遍历整个数据库。传统的关系数据库为了提高检索效率,一般都会建立一系列的索引机制,如B 树等,但这些都是一维索引,无法处理空间数据库中的二维和多维的 空间数据。 空间数据库索引技术是通过对存储在介质上的数据位置信息的描述,来提高空间数据库的查询性能和数据获取效率,索引技术的好坏直接影响到空间数据库系统的成败。空间数据索引作为一种辅助性的空间数据结构,介于空间操作算法和地理对象之间,通过筛选、排除大量与特定空间操作无关的地理对象,缩小了空间数据的操作范围,从而提高空间操作的速度和效率。 3.几种常见的空间索引技术 3.1简单格网空间索引 格网空间索引的原理简单,即把目标空间实体集合所在的空间范围划分成一系列大小相同的格。如图3-1所示,每一个格相当于一个桶(bucket ),记录落入该格内的空间实体的编号。基于格网索引的查找思路也较简单,在数据分布较均匀的情况下,查询效率较高。但格网的大小直接影响了索引表的大小,格网太小,索引表会急剧膨胀,维护索引表本身的花费增加,查询效率随之下降;反之,落在一个格内的空间实体可能会过多;因此格的大小严重制约着查询效率的提高。 8

HILBERT空间

Hilbert 空间 定义:完备的内积空间称为Hilbert 空间 (1)内积 线性空间K 上的一个共轭双线性函数(,):v K K K ??→ 称为一个内积,如果它满足 a: (,)(,)x y y x = (,)x y K ?∈ (共轭对称性) b: (,)0x x ≥ ()x K ?∈ (,)0x x x θ=?= (正定性) (2)具有内积的线性空间称为内积空间 (3)完备 空间中所有基本列都是收敛列就称该空间是完备的 Hilbert 空间能将更多的集合概念,如角度、垂直性等成功地引入 中线公式 2 2 22 2()x y x y x y ++-=+ 证明:,,,x y x y x y x y x y y x +=++=+++ 同理有,,,x y x y x y x y x y y x -=--=+-- 故等式显然成立 定义:(1)设,x y X ∈若(,)0x y =,则说x 与y 正交,记作x y ⊥ (2)设{:}i x i I X ∈?,若当i j ≠时i j x x ⊥,则称{}i x 为正交系(或正交集、正交组),若{}i x 是正交系且1i x =(i I ?∈)则称{}i x 为标准正交基。 (3)设,A B X ?,约定A B ⊥ ,:;{}a A b B a b x A x A ??∈∈⊥⊥?⊥ {:}A x X x A ⊥=∈⊥称A ⊥为集A 的正交补 ★定理: 设{:}i e i N ∈是Hilbert 空间X 中的标准正交系,则以下条件互相等价 (1)对每个x X ∈有以下Fourier 展开式1 i i i x x e ∞ ∧ ==∑, 其中,(1,2,)i i x x e i ∧?=<>=???称为x 关于{}i e 的Fourier 系数 (2){}i e 是X 的基本集 (3){}i e 是极大正交系,即若i x e ⊥ (1,2,)i =???,则必有0x =

四叉树编码的原理

四叉树结构的基本思想是将一幅栅格地图或图像等分为四部分,逐块检查其格网属性值(或灰度),如果某个子区的所有格网值都具有 相同的值,则这个子区就不再继续分割,否则还要把这个子区再分割成四个子区。这样依次地分割,直到每个子块都只含有相同的属性值或灰度为止。 从下而上的合并算法:如果每相邻四个网格值相同则进行合并,逐次往上递归合并,直到符合四叉树的原则为止。这种方法重复计算 较少,运算速度较快。 从上而下的分割算法:需要大量的运算,因为大量数据需要重复检查才能确定划分。当矩阵比较大,且区域内容要素又比较复杂时, 建立这种四叉树的速度比较慢。 ②阵列各部分的分辨率是可变的,边界复杂部分四叉树较高即分级多,分辨率也高,而不需表示许多细节的部分则分级少,分辨率 低,因而既可精确表示图形结构又可减少存贮量; ②结点之间借助指针联系,每个结点需要用六个量表达:四个叶结点指针,一个父结点指针和一个结点的属性或灰度值。 ②线性四叉树叶结点的编号需要遵循一定的规则,这种编号称为地址码,它隐含了叶结点的位置和深度信息。最常用的地址码是四进 制或十进制的Morton 码。 ①常规四叉树除了记录叶结点之外,还要记录中间结点。 ③这些指针不仅增加了数据贮存量,而且增加了操作的复杂性。常规四叉树主要在数据索引和图幅索引等方面应用。 ③栅格到四叉树及四叉树到简单栅格结构的转换比其它压缩方法容易; ①容易而有效地计算多边形的数量特征; 为了保证四叉树能不断的分解下去,要求图像必须为2n*2n 的栅格阵列,n 为极限分割次数,n+1是四叉树的最大高度或最大层数。 ①线性四叉树则只存贮最后叶结点的信息。包括叶结点的位置、深度和本结点的属性或灰度值。 (1)常规四叉树 (2)线性四叉树 ④多边形中嵌套异类小多边形的表示较方便。 四叉树的生成算法: 四叉树结构分类: 四叉树编码的特点: 基于十进制的Morton 码及四叉树的建立 : 2.2.4 四叉树编码 (quad-tree code)[四叉树分割演示]

空间数据多级索引结构的算法实现和分析

《空间数据组织与分析》 结课论文 题目:多级空间索引算法分析 学院:研究生学院 专业:大地测量学与测量工程 班级:硕研12级3班 姓名:张鼎凯 学号:2012020344 日期:2012年12月05日

摘要:空间数据库的索引是提高空间数据库存储效率和空间检索性能的关键技术。介绍了空间数据库中建立索引的常用技术,给出了一种多级空间索引,详细讨论了该索引的建立算法以及应用该索引的检索算法,并进行了算法分析。 关键词:计算机软件;间数据库;空间索引;空间检索;算法分析 1 空间索引技术简介 空间索引是指依据空间对象的位置和形状或空间对象之间的某种空间关系按一定的顺序排列的一种数据结构,其中包含空间对象的概要信息,如对象的标识、外接矩形及指向空间对象实体的指针。作为一种辅助性的空间数据结构,空间索引介于空间操作算法和空间对象之间,它通过筛选作用,大量与特定空间操作无关的空间对象被排除,从而提高空间操作的速度和效率。空间数据一般是是多维的,在此主要介绍二维空间数据的索引。近年来,国外学者提出应用空间基数分区对空间数据进行管理,已得出了几种空间数据索引结构。例如Robinson提出的K-D-B 树[2],Guttman 提出R 树结构[3],Freeston 提出的BANG 文件[4],Beckmann 提出的R*树结构[5]等。国内则学者提出了QR-树[6],网格索引[7][8]等索引结构,并进行了有关索引结构的性能分析和查询优化研究[8][9]。众多的索引结构可以说各有优缺点。总的来说,可分为以四叉树为代表的网格文件结构和以R 树及其变种为代表的动态索引技术。 1.1四叉树结构 四叉树索引是栅格文件索引技术的代表。栅格文件索引技术的基本思想是将一张地图规则地划分成多个互不相交的栅格,且要求所有栅格覆盖全地图,然后再利用栅格对地图上的空间对象进行索引。如K-D树、K-D-B 树、四叉树、八叉树等均基于此思想。我们在此主要介绍一下四叉树空间索引技术。四叉树空间索引是将一张地图逐步四等分,且依次编号,如图1(a)所示,其层次由用户依需要而定。划分的结果可生成如图1(b)的四叉树结构。从此结构中可确定被索引类中每个对象实例的被索引属性值属于那一个最小范围块,并将其ID 加到该最小范围块所带的链表中。查询时根据用户关心的区域,选中区域所在最小范围块中的对象。四叉树的查询在最坏情况下效率较低,而且四叉树的动态性较差。建立索引后,如果又扩大地图范围增加新对象时,必须重新建立四叉树索引,因而缺乏灵活性。

相关文档
最新文档