一种顾及空间邻近性的矢量空间数据编码方法与流程

文档序号:11155173阅读:573来源:国知局
一种顾及空间邻近性的矢量空间数据编码方法与制造工艺

本申请涉及地理领域,尤其涉及一种顾及空间邻近性的矢量空间数据编码方法。



背景技术:

随着大数据时代的到来,数据不仅具有数据量大、实时性要求高、价值大等特点,还具有复杂的空间位置关系,同时与空间位置相关的服务需求越来越大,如LBS(基于位置的服务)、GPS(全球定位系统)导航等相关服务。此外,由于栅格空间数据结构简单,易于组织,云环境下的栅格空间数据存储管理研究已有较好的成果,而矢量空间数据本身具有结构复杂、关系复杂等特点,云环境下,对于矢量空间大数据的研究还比较欠缺,因此如何对矢量空间大数据进行存储管理是当前云环境下GIS(地理信息系统)研究的热点。传统的关系型数据库在数据I/O(输入/输出)、扩展性、容错性以及存取性能方面表现出极大的局限性,已经不能适用于当前矢量空间大数据的存储、分析及处理要求。当前NoSQL(非关系型数据库)已经成为大数据存储与管理的重要解决方案,其弱关系性以及稀松存储等特点,使得NoSQL具有更好的并行读写性能。

作为NoSQL的代表——HBase(开源数据库)不仅具有NoSQL的优势,而且还具有高可靠性、容错性等特点。此外,HBase通过采用“列族”的方式将经常需要一起访问的数据存储在一起以提高数据的查询分析效率。然而,当前研究主要集中于对属性以及几何信息的存储,在对矢量空间数据的存储方面, 对空间对象的空间邻近性考虑不够,使得空间上相距很远的对象有可能会被存储到相同的节点上,或者相距很近的对象被存储到不同的节点上,目标对象将从多个计算节点进行访问和获取,极大地影响了数据存取及查询效率。

另一方面,在HBase数据库中,数据按照Rowkey(行标识符)的字典顺序进行存储,并提供了2种访问数据的方式:根据单个Rowkey值,调用Get(获取)对象实现查询;根据Rowkey起始范围,调用Scan(扫描)对象实现查询。总结来看,在HBase中对数据的检索访问必须通过Rowkey进行,其中Rowkey(行标识符)是列数据库下空间对象的唯一标识。在列数据库中,所有的数据都按照Rowkey的字典顺序进行组织存储。列数据库查询只能依靠Rowkey,然而在Rowkey编码方面,传统的Rowkey编码只是一个唯一的ID顺序或者是时间戳,没有任何空间信息,不具备空间索引的能力,并且所有的空间对象将会根据序列的顺序分开存储到多个存储节点上,进而在处理数据时会降低空间查询性能,增加数据库维护代价。



技术实现要素:

为了解决空间查询性能低下的问题,本发明了提供了一种顾及空间邻近性的矢量空间数据编码方法,以适应列数据库下矢量空间数据均衡存储,进而优化矢量空间数据存储,并提高查询性能。

本发明提供了一种顾及空间邻近性的矢量空间数据编码方法,所述方法包括:

判断给定的空间对象P是否为点对象;

若所述空间对象P不是点对象,计算能够完全包含所述空间对象P的最小外包超矩的网格所在最大阶数k;

计算0阶到k阶的k+1个ZG(P)j*,ZG(P)j*表示所述空间对象P在第j*阶层上的编码值,j*∈【0,k】,0≤k≤m,m为初始最大阶数,在【0,m】阶下的所有网格中,第k阶下的网格是能够完全包含所述空间对象P的的最小网格;即该网格是能够完全包含所述空间对象P的所有网格中的最小网格。

对k+1个ZG(P)j*按照空间填充曲线的编码规则进行编码,获得Geocode(f.geometry)*;其中,Geocode(f.geometry)*表示所述空间对象P基于空间填充曲线所形成的分层设计的编码值;

根据公式Rowkey(f)*=Geocode(f.geometry)*+FID(f)*进行编码;

其中,Rowkey(f)*为所述空间对象P的行标识符Rowkey编码值,FID(f)*为数据库中唯一的顺序标识ID。

优选的,所述若所述空间对象P不是点对象,计算能够完全包含所述空间对象P的最小外包超矩形的网格所在最大阶数k,包括:

若所述空间对象P为非点对象,从第0阶到第m阶中,通过公式找到能够包含或者等于所述空间对象P的最小外包超矩形Mingrid(P)的最大阶数k,所述公式为:

f(k)=Max{k|0≤k≤m,SZGrud(k)≤SMingrid,TZGrid(k)≥TMingrid};

其中,f(k)表示取出满足条件的最大k值;SZGrid(k)表示在第k阶下网格的左下点坐标值;SMingrid表示所述空间对象P的最大外包超矩形左下点坐标值;TZGrid(k)表示在第K阶下网格的右上点坐标值;TMingrid表示所述空间对象P的最大外包超矩形右上点坐标值。

优选的,所述计算0阶到k阶的k+1个ZG(P)j*,包括:

ZG(P)j*=(zg1*,...zgi*...,zgd*);

其中,zg1*表示所述空间对象P在第1维上经过j*阶划分后的的二进制 字符串;

zgd*表示所述空间对象P在第d*维上经过j*阶划分后的的二进制字符串,d*表示维度值;

其中,zgi*=pi*/((Ui*-Li*)/2k),1<i*<d*,其中,zgi*表示所述空间对象P在每一维度上经过j*阶划分后的二进制字符串;pi*表示所述空间对象P在维度i*上的具体坐标值,Ui*表示第i*维度坐标上的最大值,Li*表示第i*维度坐标上的最小值,j*表示所述空间对象P当前所处的阶数。

优选的,所述对k+1个ZG(P)j*按照空间填充曲线的编码规则进行编码,获得Geocode(f.geometry)*,包括:

Geocode(f.geometry)*=ZG(P)0*+ZG(P)1*+ZG(P)2*+...+ZG(P)k*;

其中,ZG(P)0*,ZG(P)1*,ZG(P)2*,...,ZG(P)k*是所述空间对象P在对应的每一阶下的空间填充曲线编码值,公式中的“+”表示将每个编码值拼接起来。

优选的,所述判断给定的空间对象P是否为点对象之后,包括:

若所述空间对象P是点对象,计算从0阶到m阶的m+1个ZG(P)j,j∈【0,m】,ZG(P)j是所述空间对象P在第j阶下的空间填充曲线编码值;

对m+1个ZG(P)j按照空间填充曲线的编码规则进行分层编码,获得Geocode(f.geometry);Geocode(f.geometry)表示所述空间对象P基于空间填充曲线所形成的分层设计的编码值;

根据公式Rowkey(f)=Geocode(f.geometry)+FID(f)进行编码,其中,Rowkey(f)为所述空间对象P的Rowkey编码值,FID(f)为数据库中唯一的顺序ID。

优选的,所述若所述空间对象P是点对象,计算从0阶到m阶的m+1个ZG(P)j,包括:

ZG(P)j=(zg1,...zgi...,zgd);

其中,zg1表示所述空间对象P在第1维上经过j阶划分后的的二进制字符串;

zgd表示空间对象P在第d个维度上经过j阶划分后的二进制字符串,d表示所述空间对象P所处的维度;

其中,zgi=pi/((Ui-Li)/2m),1<i<d,其中,zgi表示所述空间对象P在第i维度上经过j阶划分后的二进制字符串;pi表示所述空间对象P在维度i上的具体坐标值,Ui表示第i个维度坐标上的最大值,Li表示第i个维度坐标上的最小值,j表示所述空间对象P当前所处的阶数。

优选的,所述对m+1个ZG(P)j按照空间填充曲线的编码规则进行分层编码,获得Geocode(f.geometry),包括:

Geocode(f.geometry)=ZG(P)0+ZG(P)1+ZG(P)2+...+ZG(P)m

其中,ZG(P)0,ZG(P)1,ZG(P)2,...,ZG(P)m是所述空间对象P在对应的每一阶下的空间填充曲线编码值,公式符号“+”表示将每个编码值拼接起来。

通过本发明的一个或者多个技术方案,本发明具有以下有益效果或者优点:

本发明公开了一种顾及空间邻近性的矢量空间数据编码方法,通过判断给定对象P是否为点对象;若所述空间对象P为非点对象,先计获得能够完全包含最小外包超矩的网格所在最大阶数k,再计算从0阶到k阶的k+1个ZG(P)j*;ZG(P)j*表示所述空间对象P在第j*阶层上的编码值;再对k+1个ZG(P)j按照空间填充曲线的编码规则进行编码,获得Geocode(f.geometry)*;再根据公式Rowkey(f)*=Geocode(f.geometry)*+FID(f)*进行编码,通过基于空间填充曲线的分层编码,使得在同一空间划分中,不同的空间对象具有相同的前缀编码, 再加上唯一的顺序ID值作为后缀编码,不仅顾及矢量空间对象的空间邻近性,而且避免Rowkey的重复,克服Rowkey仅能通过唯一的顺序ID进行编码的缺点,进而使得空间上邻近的数据可以被集中存储,考虑了矢量空间对象的空间邻近性,Rowkey具备空间索引的基本特征,使在数据库中直接进行空间查询成为可能。

附图说明

图1A-图1B为本发明实施例中二维空间中,对区域R2=[0,1]2进行不同的分割,得到不同的Z曲线网格;

图2A-图2C为本发明实施例非点对象P包括线(图2A)、面(图2B)、体(图2C)的最小网格Mingrid(P);

图3A-图3B为本发明实施例包含非点对象最小网格Mingrid的最大阶数的确定;

图4为本发明实施例一种顾及空间邻近性的矢量空间数据编码方法。

具体实施方式

为了使本申请所属技术领域中的技术人员更清楚地理解本申请,下面结合附图,通过具体实施例对本申请技术方案作详细描述。

Rowkey是列数据库下空间对象的唯一标识。在列数据库中,所有的数据都按照Rowkey的字典顺序进行组织存储。列数据库查询只能依靠Rowkey,传统的Rowkey只是一个唯一的ID顺序或者是时间戳,没有任何空间信息,不具备空间索引的能力,并且所有的空间对象将会根据序列的顺序分开存储到多个存储节点上,这在处理大规模数据时,会降低空间查询性能,增加数据库维护代价。

因此,本发明的Rowkey编码设计将充分考虑以下两个问题:

1,将二维空间信息转换成一维的行标识符Rowkey编码;

2,考虑空间对象的空间邻近性,并将其整合到编码算法中。

为此,我们选择空间填充曲线的方法进行Rowkey的设计,它不仅能够顾及空间邻近性,并且已经作为从n维到1维的映射机制被广泛应用。在设计Rowkey时,不仅需要顾及空间数据的空间位置特性,还需要保持空间数据的唯一性。本专利的Rowkey设计方法结合传统的Rowkey模式以及空间填充曲线,设计如下编码方法:

Rowkey(f)=Geocode(f.geometry)+FID(f) 公式1

Geocode(f.geometry)表示基于空间填充曲线所形成的分层设计的编码值,这里的参数是空间对象的几何坐标;函数FID(f)产生数据库中唯一的顺序ID。

通过基于空间填充曲线的分层编码,使得在同一空间划分中,不同的空间对象具有相同的前缀编码,再加上唯一的顺序ID值作为后缀编码,不仅顾及矢量空间对象的空间邻近性,而且避免Rowkey的重复,克服Rowkey仅能通过唯一的顺序ID进行编码的缺点。通过公式1可知,空间上邻近的数据可以被集中存储,考虑了空间邻近性,Rowkey具备空间索引的基本特征,使在数据库中直接进行空间查询成为可能。

常用的空间填充曲线主要有Hilbert曲线、Z曲线、Gray曲线,其中Hilbert曲线皮亚若曲线中的一员,由希尔伯特发明;Z曲线采用简单的二进制位相交进行编码,且编码后形成的形状类似于字母Z而得名Z曲线;Gray曲线因为在编码的过程中使用到格雷码而得名Gray曲线。各个曲线的映射特点各不相同,Hilbert空间填充曲线的数据聚类特性最优秀,但映射算法的执行过程最复杂;Z空间填充曲线的数据聚类特性最差,但映射算法的执行过程最简单,执 行效率更高。可根据不同的需要,选择不同的空间填充曲线进行编码设计。为了顾及算法的效率,本发明主要采用Z空间填充曲线来说明此编码设计思想。

下面具体介绍与Z空间填充曲线相关的定义及设计思想。

定义1:

在d维空间D1×…Di×…×Dd中,其中,给定一个空间对象P(p1,p2,…,pd),每个维度上的划分数量为2m(m∈N),则空间对象P的Z空间填充曲线分层编码值为:

Geocode(f.geometry)=ZG(P)0+ZG(P)1+ZG(P)2+...+ZG(P)m 公式2

其中,空间对象P在第j阶层上的编码值为:

ZG(P)j=(zg1,...zgi...,zgd);

其中zgi=pi/((Ui-Li)/2m) 公式3

其中,j∈【0,m】,zgi表示所述空间对象P在第i维度上经过j阶划分后的二进制字符串;pi表示所述空间对象P在维度i上的具体坐标值,Ui表示第i个维度坐标上的最大值,Li表示第i个维度坐标上的最小值,j表示所述空间对象P当前所处的阶数。

定义2:

Z曲线网格的定义是d维空间经过k(0≤k≤m)次分割空间Rd=[0,1]d形成的d维网格,可以由对角线上的两个端点:左下角点Sk=(s1,...,sd)和右上角点Tk=(t1,...,td)表示,即:

ZGrid(k)=<Sk,Tk> 公式4

网格边长r=(ti-si)×2-k

在二维空间中,Z曲线k次分割封闭正方形区域R2=[0,1]2形成22k(0≤k≤m)个大小相同的网格,如图1A-图1B所示,每个网格的边长是r=2-k,在 相同网格中的任一空间对象都具有相同的Z空间填充曲线编码。图1A-图1B表示为二维空间中,对区域R2=[0,1]2进行不同的分割,得到不同的Z曲线网格:图1A表示对区域R2=[0,1]2进行1次分割,得到边长为1/21的22×1个Z曲线网格。图1B表示对区域R2=[0,1]2进行2次分割,得到边长为1/22的22×2个Z曲线网格。

定义3:

空间对象G的最小网格即为包含对象所有点的最小网格,表示为MingridG=<SMingrid,TMingrid>,图2A-图2C。

根据以上的定义,给定一个空间数据对象P,Z空间填充曲线的最高阶为m。

该空间对象P的Z空间填充曲线编码方式请参看下列描述:

S1,给定空间对象P,初始最大阶数m。

S2,判断P是否是点对象。

S3,计算0阶到m阶的m+1个ZG(P)j

S4,对m+1个ZG(P)j依规则拼接。

S5,计算包含Mingrid(P)的最大阶数k。

S6,计算0阶到k阶的k+1个ZG(P)j*。

S7,对k+1个ZG(P)j*依规则拼接。

S8,形成Z曲线编码。

下面进行具体的分析说明。

步骤1,获得一空间对象P。

步骤2,判断所述空间对象P是否为点对象。

在本发明的实施例中,若空间对象P是点对象,则进行如下处理:

步骤3,若所述空间对象P是点对象,计算从0阶到m阶的m+1个ZG(P)j,j∈【0,m】;ZG(P)j是所述空间对象P在第j阶下的空间填充曲线编码值。

在具体的实施过程中,利用以下公式5计算获得0阶到m阶的m+1个ZG(P)j

ZG(P)j=(zg1,...zgi...,zgd) 公式5

其中,zg1表示所述空间对象P在第1维上经过j阶划分后的的二进制字符串;

zgd表示空间对象P在第d个维度上经过j阶划分后的二进制字符串,d表示所述空间对象P所处的维度编号。

zg1和zgd的计算公式和zgi的计算公式类似,例如计算zg1时,可将i取值为1。而计算zgd时,可将i取值为d,但是公式都是一样的,进而本申请在此不再赘述。

其中,zgi=pi/((Ui-Li)/2m),1<i<d,其中,zgi表示所述空间对象P在第i维度上经过j阶划分后的二进制字符串;pi表示所述空间对象P在维度i上的具体坐标值,Ui表示第i个维度坐标上的最大值,Li表示第i个维度坐标上的最小值,j表示所述空间对象P当前所处的阶数。

步骤4,对m+1个ZG(P)j按照规则进行分层编码,获得Geocode(f.geometry)。

Geocode(f.geometry)表示所述空间对象P基于空间填充曲线所形成的分层设计的编码值。

在具体的实施过程中,基于公式6获得Geocode(f.geometry)。

Geocode(f.geometry)=ZG(P)0+ZG(P)1+ZG(P)2+...+ZG(P)m 公式6

其中,ZG(P)0,ZG(P)1,ZG(P)2,...,ZG(P)m是所述空间对象P在对应的每一阶下 的空间填充曲线编码值。

步骤5,根据公式Rowkey(f)=Geocode(f.geometry)+FID(f)进行编码,其中,Rowkey(f)为所述空间对象P的行标识符Rowkey编码值,FID(f)为数据库中唯一的顺序ID。

在另一个实施例中,若空间对象P不是点对象则进行如下处理:

请注意,在本实施例中的处理公式和上述实施例中的处理公式类似,因此本实施例中的增加上标“*”加以区分。

若所述空间对象P不是点对象(即:所述空间对象P为非点对象),先计算该空间对象的最小外包超矩形,然后比较每一阶下的网格与最小外包超矩形的关系,获得能够完全包含(完全包含的意思是:包含或者等于)所述空间对象P的最小外包超矩形Mingrid(P)的最大阶数k,即:

f(k)=Max{k|0≤k≤m,SZGrud(k)≤SMingrid,TZGrid(k)≥TMingrid} 公式7

其中,f(k)表示取出满足条件的最大k值;SZGrid(k)表示在第k阶下网格的左下点坐标值;SMingrid表示该空间对象的最大外包超矩形左下点坐标值;TZGrid(k)表示在第K阶下网格的右上点坐标值;TMingrid表示该空间对象的最大外包超矩形右上点坐标值。

图2A-图2C表示的是:非点对象P包括线(图2A)、面(图2B)、体(图2C)的最小网格Mingrid(P),以黑色虚线边框表示。

图3A-图3B表示包含非点对象最小网格Mingrid的最大阶数的确定,正如公式7进行判断,图3A中两个非点对象的Mingrid已由黑色虚线边框表示,k阶时,SZGrid(k)≤SMingrid&&TZGrid(k)≥TMingrid说明在第K阶时,该网格完全包含空间对象;k+1阶时,SZGrid(k+1)≥SMingrid||TZGrid(k+1)≤TMingrid,已经不存在某个网格完全包含空间对象。由此可知,图3A-图3B中,包含两个非点对象最小网格Mingrid 的最大阶数为k。

计算0阶到k阶的k+1个ZG(P)j*,ZG(P)j*表示所述空间对象P在第j*阶层上的编码值,j*∈【0,k】,0≤k≤m,m为初始最大阶数,在第k阶下的网格恰好能够包含所述空间对象P。即:在【0,m】阶下的所有网格中,第k阶下的网格是能够完全包含所述空间对象P的所有阶层网格中的最小网格。

具体的实施方式为:

ZG(P)j*=(zg1*,...zgi*...,zgd*) 公式8

其中,zg1*表示所述空间对象P在第1维上经过j*阶划分后的的二进制字符串;

zgd*表示所述空间对象P在第d*维上经过j*阶划分后的的二进制字符串,d*表示维度值;

zg1*和zgd*的计算公式和zgi*的计算公式类似,例如计算zg1*时,可将i取值为1。而计算zgd*时,可将i取值为d,但是公式都是一样的,进而本申请在此不再赘述。

其中,zgi*=pi*/((Ui*-Li*)/2k),1<i*<d*,其中,zgi*表示所述空间对象P在每一维度上经过j*阶划分后的二进制字符串;pi*表示所述空间对象P在维度i*上的具体坐标值,Ui*表示第i*维度坐标上的最大值,Li*表示第i*维度坐标上的最小值,j*表示所述空间对象P当前所处的阶数。

对k+1个ZG(P)j*按照空间填充曲线的编码规则进行编码,获得Geocode(f.geometry)*;其中,Geocode(f.geometry)*表示所述空间对象P基于空间填充曲线所形成的分层设计的编码值。

具体为:

Geocode(f.geometry)*=ZG(P)0*+ZG(P)1*+ZG(P)2*+...+ZG(P)k*

其中,ZG(P)0*,ZG(P)1*,ZG(P)2*,...,ZG(P)k*是所述空间对象P在对应的每一阶下的空间填充曲线编码值,公式中的“+”表示将每个编码值拼接起来。

根据公式Rowkey(f)*=Geocode(f.geometry)*+FID(f)*进行编码;

其中,Rowkey(f)*为所述空间对象P的行标识符Rowkey编码值,FID(f)*为数据库中唯一的顺序标识ID。

通过本发明的一个或者多个实施例,本发明具有以下有益效果或者优点:

本发明公开了一种顾及空间邻近性的矢量空间数据编码方法,通过判断给定对象P是否为点对象;若所述空间对象P为非点对象,先计获得能够完全包含最小外包超矩的网格所在最大阶数k,再计算从0阶到k阶的k+1个ZG(P)j*;ZG(P)j*表示所述空间对象P在第j*阶层上的编码值;再对k+1个ZG(P)j按照空间填充曲线的编码规则进行编码,获得Geocode(f.geometry)*;再根据公式Rowkey(f)*=Geocode(f.geometry)*+FID(f)*进行编码,通过基于空间填充曲线的分层编码,使得在同一空间划分中,不同的空间对象具有相同的前缀编码,再加上唯一的顺序ID值作为后缀编码,不仅顾及矢量空间对象的空间邻近性,而且避免Rowkey的重复,克服Rowkey仅能通过唯一的顺序ID进行编码的缺点,进而使得空间上邻近的数据可以被集中存储,考虑了空间邻近性,Rowkey具备空间索引的基本特征,使在数据库中直接进行空间查询成为可能。

尽管已描述了本申请的优选实施例,但本领域内的普通技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。

显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1