一种融合编码和多版本数据的海量空间对象存储方法与流程

文档序号:11654393阅读:440来源:国知局

本发明涉及空间对象数据的分布式存储和访问技术领域,具体涉及一种融合编码和多版本数据的海量空间对象存储方法。



背景技术:

位置服务需要频繁地对海量空间对象进行查询并获取实时响应,这需要高效的存储模型和访问优化技术支撑。以现有的关系模型数据库管理海量空间对象,首先由于需要采用固定模式来组织空间对象,不能很好地满足不同空间对象不同属性的存储需求,会导致大量的数据冗余;其次在处理诸如范围查询时,由于地理位置相近的空间对象并不需要满足存储位置临近性,在数据i/o上没有优势;同时,在面对大规模数据时扩展性上也存在不足。现有的分布式模型能够提供海量空间对象管理的可扩展性,但缺少面向空间对象数据的有效访问优化技术;同时,没有建立存储精度和访问性能之间的有效理论关系。



技术实现要素:

本发明针对现有技术所存在的问题,提供一种融合编码和多版本数据的海量空间对象存储方法,其能够有效提升范围查询性能。

为解决上述问题,本发明是通过以下技术方案实现的:

一种融合编码和多版本数据的海量空间对象存储方法,包括如下步骤:

步骤1.将空间区域划分成等面积大小的网格单元,为每一个网格单元设计一个唯一的编码,并让每个空间对象位于且仅位于一个网格单元中;

步骤2.对各个网格单元中的空间对象进行编码,若同一网格单元的多个空间对象编码相同,则采用序号进行区分,并用三元组<网格单元编码,内部对象编码,对象序号>唯一地标识一个空间对象;

步骤3.基于key-value结构和列存储设计存储模式,每个网格单元及其所有空间对象存储为一个或若干个独立的物理存储单元,在每个物理存储单元中采用字典序组织空间对象顺序存储;

步骤4.基于网格单元编码的字典序为所有网格单元的物理存储单元建立字典序索引结构;按照字典序来组织网格单元编码,并采用顺序存储模式实现该组织结构,存储结构中的每一个元素项包含两项内容,第一项内容是网格单元编码,第二项内容是对应该编码的网格单元的物理存储位置;

步骤5.基于输入请求开展空间对象查询;输入表示形式为(<x,y>,r),其中<x,y>表示查询坐标起点,r表示查询半径,即查询以<x,y>为圆心,半径为r米范围内的所有空间对象。

上述步骤1中,网格单元的大小取决于网格单元编码精度p,该编码精度p根据空间对象的密度进行调整。

上述步骤2中,采用内部对象编码精度q对各个网格单元中的空间对象进行编码,其中内部对象编码精度q>网格单元编码精度p。

上述步骤2中,若网格单元中只有1个空间对象,则该空间对象编码的三元组结构为<p位网格单元编码,q-p位内部对象编码,0>;若区域中有2个以上空间对象,则用<p位网格单元编码,q-p位内部对象编码,x>;上述p表示网格单元编码精度;q表示内部对象编码精度;x表示对象的唯一编码,为从0开始的顺序整数值。

上述步骤3中,采用<key,timestamp,value>结构来组织空间对象;其中,key对应空间对象所在的网格单元编码,timestamp对应空间对象的<内部对象编码,对象序号>二元组,即将网格单元内的对象视为该网格单元的一个多版本数据对象,value对应空间对象的所有属性。

上述步骤3中,value采用列簇形式组织,若干个属性存储为一个列簇。

上述步骤3中,将每个网格单元或者独立地存储为一个物理单元,或者基于属性集合的列簇划分存储为若干个独立的物理单元。

上述步骤3中,让网格单元内的所有对象基于timestamp的字典序进行顺序存储。

与现有技术相比,本发明采用“低精度网格编码,高精度空间对象编码”将多维空间数据转换到一维空间,然后采用“字典序定位数据块,低冗余度数据查询”策略来实现查询过程涉及到的冗余数据修剪,有效提升了范围查询性能。在编码精度为8个base-32字符时,一个网格单元的覆盖面积约为725m2,查询半径在1000m时,查询响应时间不超过1秒,能有效满足诸如智慧旅游中基于游客位置的旅游资源推荐等数据查询需求。

附图说明

图1为面向海量空间对象的编码策略与分布式存储模型原理图。

具体实施方式

一种融合编码和多版本数据的海量空间对象存储方法,参见图1,具体包括如下步骤:

步骤1.将空间区域划分成等面积大小的网格单元,为每一个网格单元设计一个唯一的编码,并让每个空间对象位于且仅位于一个网格单元中。

(1)以base-32字符为最小编码单位,设定一个编码精度p,网格单元的大小取决于编码精度p,精度p可以根据空间对象的密度进行调整。以地球为例,将其展开成平面结构后,若编码精度为p,则每一个网格单元的长和宽可以表示为:

其中,clat表示赤道周长,clng表示极地周长。

(2)基于p值对空间区域进行均匀划分,并对每一个区域进行编码。例如p取值5个base-32字符,即25个bits,则可用13个bits来表示空间区域的长,12个bit表示空间区域的宽。第一次划分,将空间区域的长和宽分别等分得到四个面积大小相等的区域,对每个区域在长度维度上按照左0右1,宽度维度上按照上0下1的模式进行编码,每个区域都会得到自己唯一的编码。按照上述策略,分别对四个区域采取上述模式进行划分和编码,并依次划分下去。最后得到的每个网格单元都不重叠,且有一个精度为p的唯一编码。

步骤2.采用q(q>p)精度对各个单元格中的空间对象进行编码,若同一网格的多个空间对象编码相同,则采用序号进行区分,用三元组<网格单元编码,内部对象编码,对象序号>唯一地标识一个对象。

(1)设置一个编码精度q(q>p),采用第1步第2点的编码策略对网格单元继续划分编码,直至达到精度q,精度q表示的区域比精度p表示的区域面积更小。q位编码的前p位对应网格单元编码,称为编码前缀;后(q-p)位对应对象在网格单元内部的编码,称为编码后缀。

(2)用三元组结构对精度q表示区域中的对象进行编码处理。若区域中只有一个对象,则该对象编码的三元组结构为<p位网格单元编码,q-p位内部对象编码,0>;若区域中有2个以上空间对象,则用<p位网格单元编码,q-p位内部对象编码,x>,其中x表示从0开始的顺序整数值,表示对象的唯一编码。

步骤3.基于key-value结构和列存储设计存储模式,每个网格单元及其所有空间对象存储为一个或若干个独立的物理存储单元,在每个物理存储单元中采用字典序组织空间对象顺序存储。

(1)采用<key,timestamp,value>结构来组织空间对象。其中,key对应空间对象所在的网格单元编码,空间对象的<内部对象编码,对象序号>二元组作为timestamp,即将网格单元内的对象视为该网格单元的一个多版本数据对象,value对应空间对象的所有属性,例如经度、维度、名称等。value采用列簇形式组织,若干个属性存储为一个列簇,从而保证空间对象的不同属性可以按照类别和用途分布存储。

(2)将每个网格单元或者独立地存储为一个物理单元,或者基于属性集合的列簇划分存储为若干个独立的物理单元,同时让网格单元内的所有对象基于timestamp的字典序进行顺序存储。

步骤4.基于网格单元编码的字典序为所有网格的物理存储单元建立字典序索引结构。按照字典序来组织网格单元编码,并采用顺序存储模式实现该组织结构,存储结构中的每一个元素项包含两项内容,第一项内容是网格单元编码,第二项内容是对应该编码的网格单元的物理存储位置。

步骤5.基于输入请求开展空间对象查询。输入表示形式为(<x,y>,r),其中<x,y>表示查询坐标起点,r表示查询半径,即查询以<x,y>为圆心,半径为r米范围内的所有空间对象。

(1)基于<x,y>和r计算出与该查询范围具有重叠区域的所有网格单元,以第1步第(1)点的长度a和宽度b,涉及到的网格单元数目n表示如下:

(2)以<x,y>为输入,按照第1步第(2)点得到该对象对应的q位编码,获取该编码的p位前缀。基于第3步第(2)点构建的网格单元字典序索引查找到该网格单元对应的物理存储单元,将其读入内存。依次处理其余的n-1位网格单元。

(3)依次顺序扫描读入内存的网格单元,对其内部的每一个空间对象,计算其与<x,y>的空间距离,如果少于等于r,则输出该对象。

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