面向NoSQL数据库的将地理空间数据一维化的GeoHash编码方法与流程

文档序号:12666690阅读:395来源:国知局
面向NoSQL数据库的将地理空间数据一维化的GeoHash编码方法与流程

本发明属于空间数据存储与管理技术领域,尤其涉及一种面向NoSQL数据库的地理空间数据一维化GeoHash编码方法。



背景技术:

高分辨率对地观测、遥感、导航定位和移动互联网等技术的不断发展极大地丰富了地理空间数据的产生渠道、提高了地理空间数据的产生速度,因此给地理空间数据的存储、查询、处理和分析带来了挑战。以HBase为代表的分布式NoSQL数据库具有良好的可伸缩性和可扩展性,能够有效地存储大规模数据,并且支持数据的高速写入和基于键值的快速查询。因此NoSQL数据库在空间大数据存储和管理领域将具有良好的应用前景。但另一方面,HBase等NoSQL数据库都是基于一维的Key-Value对形式组织数据,因此只对一维数据的存储和查询提供了良好地支持;而地理空间数据是二维或三维数据,直接存储于NoSQL数据库并实现空间查询难度较大。

针对上述问题一种常用的解决方法是利用Gustavo Niemeyer发明的标准GeoHash编码技术将地理空间数据一维化,即将每个地理空间数据对应一个标准GeoHash编码,然后以该GeoHash编码为Key,将空间要素作为Value,存储到NoSQL数据库中。在实施空间查询时,将二维的区域查询转化为一维GeoHash编码空间上的多个一维区间查询。这种常用方法将全球地理范围划分为大小相等的矩形,并按照Morton编码为每个矩形指定一个二进制编码,称为标准GeoHash编码。由于实际的地理空间数据在全球范围内一般并非均匀分布,因此如果按照标准GeoHash编码规定的方法将全球划分为多个等大小矩形,则有的矩形包含的地理空间数据多,有的包含的少。结果导致有的一维Key区间对应的数据很多,有的区间对应的数据很少,执行查询任务时有的线程任务繁重,有的线程几乎空转。因此这种数据的不均匀性会大大降低上述常用地理空间数据存储方法的空间查询效率。

综上所述,现有的地理空间数据一维化GeoHash编码方法没有考虑数据的空间分布不均匀性,如果直接应用在NoSQL数据库中将会使空间查询效率较低。



技术实现要素:

本发明的目的在于提供一种面向NoSQL数据库的地理空间数据一维化GeoHash编码方法,旨在解决现有的数据的不均匀性会降低NoSQL数据库的空间查询效率的问题。

本发明是这样实现的,一种面向NoSQL数据库的地理空间数据一维化GeoHash编码方法,所述面向NoSQL数据库的地理空间数据一维化GeoHash编码方法包括以下步骤:

步骤一,依据地理空间点要素空间分布的历史统计数据将标准GeoHash编码转换成平衡GeoHash编码,并得到一张两者之间的映射表,称为编码映射表;

步骤二,需要入库的地理空间点要素通过查编码映射表绑定一个平衡GeoHash编码,然后以平衡GeoHash编码为关键字将空间点要素存储在HBase等NoSQL数据库中;

步骤三,当对NoSQL数据库中存储的空间点要素数据进行空间范围查询时,将作为查询条件的空间范围转化为平衡GeoHash编码一维空间上一系列取值区间,然后针对每个取值区间生成一个对应的区间Scan查询,再进行精细过滤获得最终查询结果。

进一步,所述将标准GeoHash编码转换成平衡GeoHash编码并生成编码映射表的方法具体包括:

步骤一,把全球地理范围均匀地划分成大小相等的n*n个矩形区域,并且按照标准GeoHash规则,即Morton编码规则,对这些区域进行标准GeoHash编码;

步骤二,根据点要素空间分布的历史统计数据获得各个矩形区域的相关统计值,并求得每个区域的理想期望值E,其中:

E=点要素总个数÷(n×n);

步骤三,遍历标准GeoHash编码的各个区域,根据各区域的相关统计值与理想期望值的大小关系,对标准GeoHash编码区域进行或对等、或拆分、或聚合的处理后得到一批新的矩形区域,使得新矩形区中包含的点要素个数最接近于理想期望值E;

步骤四,对新生成的矩形区域基于原标准GeoHash编码的先后顺序重新从小到大进行编码,得到平衡GeoHash编码,同时将从标准GeoHash编码到平衡GeoHash编码的映射关系也记录到编码映射表中。

进一步,所述将空间点要素通过查编码映射表绑定平衡GeoHash编码的方法具体包括:

第一步,根据待空间点要素的经纬度信息计算得到其所属的标准GeoHash编码区域;

第二步,查编码映射表,根据标准GeoHash编码得到其所对应的平衡GeoHash编码;

第三步,用第二步得到的平衡GeoHash编码作关键字把空间点要素插入到NoSQL数据库中。

进一步,所述对已入库的空间点要素进行空间范围查询的方法具体包括:

(1)根据查询矩形的经纬度范围,计算与查询矩形有交集的标准GeoHash编码区域,得到一个标准GeoHash编码列表;

(2)从标准GeoHash编码列表中依次取出各个标准GeoHash编码,然后通过查编码映射表,得到对应的平衡GeoHash编码列表;

(3)将平衡GeoHash编码列表中的编码从小到大排序,然后将相邻的编码尽量合并,生成多个平衡GeoHash编码区间;

(4)使用(3)生成的平衡GeoHash编码区间作为查询条件进行空间点要素的范围查询,一个平衡GeoHash编码区间对应NoSQL数据库的一个Scan查询;

(5)最后利用NoSQL数据库的Coprocessor机制或者用户自定义函数UDF机制对上述粗查询所得的空间点要素进行进一步的细筛选,最终得到被查询矩形所覆盖的空间点要素。

本发明的另一目的在于提供一种利用所述面向NoSQL数据库的地理空间数据一维化GeoHash编码方法的NoSQL数据库。

相较于现有技术,本发明具有以下有益效果:

本发明提供的面向NoSQL数据库的地理空间数据一维化GeoHash编码方法,根据地理空间数据空间分布的历史统计数据,将标准GeoHash编码转换成平衡GeoHash编码。平衡GeoHash编码中每个编码值对应的空间区域大小不等,但不同编码值对应空间区域内包含的空间要素个数更均匀。与标准GeoHash编码相比,以该平衡GeoHash编码为关键字将地理空间点要素存储在HBase等NoSQL数据库中,再利用本发明设计的空间范围查询方法,可以获得更高的空间查询效率和更短的查询响应时间。

附图说明

图1是本发明实施例提供的面向NoSQL数据库的地理空间数据一维化GeoHash编码方法流程图。

图2是本发明实施例提供的标准GeoHash编码转换为平衡GeoHash编码过程的示意图;

图中:(a)表示标准GeoHash编码;(b)表示点要素空间分布的历史统计数据;(c)表示平衡GeoHash编码。

图3是本发明实施例提供的标准GeoHash编码过程的示意图。

图4是本发明实施例提供的从标准GeoHash到平衡GeoHash的编码映射表结构示意图。

图5是本发明实施例提供的全球标准GeoHash编码后的结果示意图。

图6是本发明实施例提供的示例用的点要素空间分布历史统计数据示意图。

图7是本发明实施例提供的标准GeoHash和平衡GeoHash是一对一关系的示意图。

图8是本发明实施例提供的标准GeoHash和平衡GeoHash是多对一关系的示意图。

图9是本发明实施例提供的标准GeoHash和平衡GeoHash是一对多关系的示意图。

图10是本发明实施例提供的全球平衡GeoHash编码后的结果示意图。

图11是本发明实施例提供的编码映射表。

图12是本发明实施例提供的作为示例用的空间点要素。

图13是本发明实施例提供的入库键值对的结构示意图。

图14是本发明实施例提供的空间范围查询示意图。

图15是本发明实施例提供的和查询矩形有交集的标准GeoHash区间的示意图。

图16是本发明实施例提供的和查询矩形有交集的平衡GeoHash区间的示意图。

图17是本发明实施例提供的被查询矩形覆盖的一对多区域的示意图。

图18是本发明实施例提供的被查询矩形覆盖的多对一区域的示意图。

图19是本发明实施例提供的平衡GeoHash编码列表串连拼接前后结果对比的示意图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

下面结合附图对本发明的应用原理作详细的描述。

如图1所示,本发明实施例提供的面向NoSQL数据库的地理空间数据一维化GeoHash编码方法包括:

S101:依据地理空间点要素空间分布的历史统计数据将标准GeoHash编码转换成平衡GeoHash编码,并得到一张两者之间的映射表,称为编码映射表;

S102:需要入库的地理空间点要素通过查编码映射表绑定一个平衡GeoHash编码,然后以平衡GeoHash编码为关键字将空间点要素存储在HBase等NoSQL数据库中;

S103:当对NoSQL数据库中存储的空间点要素数据进行空间范围查询时,将作为查询条件的空间范围转化为平衡GeoHash编码一维空间上一系列取值区间,然后针对每个取值区间生成一个对应的区间Scan查询,再进行精细过滤获得最终查询结果。

所述将标准GeoHash编码转换成平衡GeoHash编码并生成编码映射表的方法具体包括:

步骤1:把全球地理范围均匀地划分成大小相等的n*n个矩形区域,并且按照标准GeoHash规则,即Morton编码规则,对这些区域进行标准GeoHash编码,如图3所示;

步骤2:根据点要素空间分布的历史统计数据获得各个矩形区域的相关统计值,并进一步求得每个区域的理想期望值E,其中:

E=点要素总个数÷(n×n);

步骤3:遍历标准GeoHash编码的各个区域,根据各区域的相关统计值与理想期望值的大小关系,对标准GeoHash编码区域进行或对等、或拆分、或聚合的处理后得到一批新的矩形区域,使得新矩形区中包含的点要素个数最接近于理想期望值E;

步骤4:对这些新生成的矩形区域基于原标准GeoHash编码的先后顺序重新从小到大进行编码,从而得到平衡GeoHash编码,同时将从标准GeoHash编码到平衡GeoHash编码的映射关系也记录到编码映射表中。

编码映射表表头的主要结构如图4所示,各表项解释如下:

StandardGeoHash表项:代表标准GeoHash编码;

TypeID表项:三种映射类型的ID号,A表示对等,B表示一对多,C表示多对一;

SubGeoHash表项:用于记录这个标准GeoHash区域在其所对应的平衡GeoHash区域中的相对位置信息;

BalancedGeoHash表项:代表标准GeoHash编码所对应的平衡GeoHash编码。

所述将空间点要素通过查编码映射表绑定平衡GeoHash编码的方法具体包括:

步骤1:根据待空间点要素的经纬度信息计算得到其所属的标准GeoHash编码区域;

步骤2:查编码映射表,根据标准GeoHash编码得到其所对应的平衡GeoHash编码;

步骤3:用步骤2得到的平衡GeoHash编码作关键字把空间点要素插入到NoSQL数据库中。

所述对已入库的空间点要素进行空间范围查询的方法具体包括:

步骤1:根据查询矩形的经纬度范围,计算与查询矩形有交集的标准GeoHash编码区域,得到一个标准GeoHash编码列表;

步骤2:从标准GeoHash编码列表中依次取出各个标准GeoHash编码,然后通过查编码映射表,得到对应的平衡GeoHash编码列表;

步骤3:将平衡GeoHash编码列表中的编码从小到大排序,然后将相邻的编码尽量合并,生成多个平衡GeoHash编码区间;

步骤4:使用步骤3生成的平衡GeoHash编码区间作为查询条件进行空间点要素的范围查询,一个平衡GeoHash编码区间对应NoSQL数据库的一个Scan查询;

步骤5:最后利用NoSQL数据库的Coprocessor机制或者用户自定义函数UDF机制对上述粗查询所得的空间点要素进行进一步的细筛选,最终得到被查询矩形所覆盖的空间点要素。

下面结合具体附图对本发明的应用原理作进一步的描述。

假定实例以人口密度分布数据作为点要素空间分布的历史统计数据,对全球范围进行基于人口密度分布的平衡GeoHash编码,并以某个微博平台发布的最近一周含地理定位信息的微博数据作为入库数据,查询在指定范围内近一周发出了哪些微博,数据库选择HBase。

依据人口密度分布数据,将全球范围进行平衡GeoHash编码的算法的具体实施步骤如下:

步骤1:假定将全球均匀划分成8*8(64)个大小相等的矩形区域,并按照标准GeoHash规则给各个区域编码,如图5所示;

步骤2:根据人口密度分布数据,假定人口密度分布数据如图6所示,得到各个矩形区域内的人口数目,比如编码为s0的区域里的人口数目为8003,并进一步求得每个区域的人口数目期望值(人口总数目/区域的总数目),这里求得是16248;

步骤3:按编码从小到大的顺序遍历这64个区域,根据各区域的实际人口数与上述求得的期望人口数16248的大小关系,对该区域进行或对等、或拆分、或聚合的处理后得到一批新的矩形区域,并对这些新矩形区域也进行GeoHash编码,从而得到一种基于人口密度分布的平衡GeoHash编码,同时要将从标准GeoHash编码到平衡GeoHash编码的映射信息也记录到一张映射表中。

这是该算法的核心部分,分析以下3种情况:

情况1:区域的相关统计值和理想期望值接近,在误差允许的范围内,这种情况下不需要对标准GeoHash编码区域进行特殊处理,直接“对等”过来即可,即一个标准GeoHash区域就对应一个新的平衡GeoHash区域,本发明称之为“一对一”情况,如图7所示(取图4编号s4~s7局部做映射)。在此实例中,如果区域的实际人口数目和期望人口数目16248接近,则该标准GeoHash区域直接对应一个新的平衡GeoHash区域;

比如编码为s4、s5、s6、s7的区域,人口数目分别为15981、16019、15995、15974,接近人口期望值16248,因此这些区域不需要进行特殊处理,可以直接作为新的平衡GeoHash编码区域来使用。

情况2:区域的相关统计值小于理想期望值并且超出了误差允许范围,这种情况下本发明需要对标准GeoHash区域进行“聚合”处理,即把其与之周围的矩形区域不断地进行合并,直到最终得到一个更大的新区域并且这个新区域的相关统计值接近理想期望值,此时多个标准GeoHash区域对应一个新的平衡GeoHash区域,本发明称之为“多对一”情况,如图8所示(取图4编号s40~s43局部做映射),这种情况在记录映射信息时,还需要记录小的标准GeoHash区域在大的平衡GeoHash区域中的相对位置信息。在此实例中,如果某个标准GeoHash区域的实际人口数目小于期望人口数16248并且超出了人为规定的误差允许范围,这种情况下本发明需要对这个标准GeoHash区域进行“聚合”处理;

比如编码为s40的区域,人口数目为4023,小于人口期望值16248并且已经不能把两者近似相等,这个时候就需要合并周围编码为s41、s42和s43的区域,形成一个更大的区域,使得这个大区域的实际人口数目16025和期望人口数目16248接近。这种情况下,要把编码为s40、s41、s42和s43的四个标准GeoHash区域视为一个平衡GeoHash区域,并把这些映射信息记录到一张表中,同时为了之后可以更加准确地定位到平衡GeoHash区域里的标准GeoHash区域,本发明还需要额外记录各个标准GeoHash区域在平衡GeoHash区域里的相对位置信息,比如编码为s40的标准GeoHash区域位于合并后的平衡GeoHash区域的“左下四分之一部分”,而编码为s43的区域位于“右上四分之一部分”(这些相对位置信息可以用SubGeoHash值的相对大小来表示)。

情况3:区域的相关统计值大于理想期望值并且超出了误差允许范围,这种情况下本发明需要对这个标准GeoHash编码区域进行“拆分”处理,即把这个区域不断均匀地二分下去,直到得到的每个新的小矩形区域中的相关统计值接近理想期望值为止,此时一个标准GeoHash区域对应多个新的平衡GeoHash区域,本发明称之为“一对多”情况,如图9所示(取图4编号s36局部做映射)。在此实例中,如果区域的实际人口数大于期望人口数16248并且超出了人为规定的误差允许范围,这种情况下本发明需要对这个标准GeoHash编码区域进行“拆分”处理;

比如编码为s36的区域,实际人口数目为64009,超出期望人口数16248太多了,这个时候就需要不断均匀二分编码为s36的区域,直到被拆成的小区域的实际人口数接近期望人口数16248。本发明发现将编码为s36的区域均匀拆成4份是最合适的,被拆分成的每个小区域的人口数16002近似等于期望人口数16248,因此本发明需要将这一个标准GeoHash区域对应到四个平衡GeoHash区域上,并记录这个映射信息到映射表中。

将64个标准GeoHash编码区域按照如上算法遍历完成之后,就能得到一种新的全球区域划分,按照每个区域的地理位置关系进行GeoHash编码,就得到了基于人口密度分布的平衡GeoHash编码,如图10所示,并且还得到了一张从标准GeoHash编码到这种平衡GeoHash编码的映射表,如图11所示。

其中TypeID若为A,则表示这个标准GeoHash编码和平衡GeoHash编码是一对一关系,若为B则表示一对多关系,若为C则表示是多对一关系;SubGeoHash仅在多对一(即TypeID为C)的时候使用,用于记录这个标准GeoHash区域在其所对应的平衡GeoHash区域中的相对位置信息,在其他时候用不到这个表项。

通过这张映射表,本发明可以很容易地将一个标准GeoHash编码转成其对应的平衡GeoHash编码。标准GeoHash编码是有规律的,在把全球均匀地划分成大小相等的8*8个矩形区域后,本发明可以通过经纬度计算得到其所属的标准GeoHash编码;然而由于平衡GeoHash编码是基于空间点要素的实际分布情况而无规律可循的,因此从标准GeoHash编码到平衡GeoHash编码的映射信息本发明需要记录在一张映射表中,方便在数据的入库以及之后的查询算法中使用。

在完成平衡GeoHash编码的工作之后,以这种平衡GeoHash编码作为关键字开始数据的入库工作,以图12所示的这些带有地理定位信息的微博数据为例,具体数据入库步骤如下:

步骤1:根据待入库数据的经纬度信息计算得到其所属的标准GeoHash编码区域;

第一条微博是在经度-11.23、维度20.39的地方发送的,计算可知这个坐标点位于标准GeoHash编码为s26的区域,同理得到第二条微博的发送坐标(经度23.20、维度12.46)位于标准GeoHash编码为s48的区域,第三条微博发送的坐标(经度-21.02、维度-10.36)位于编码为s15的区域。

步骤2:查映射表,根据标准GeoHash编码得到其所对应的平衡GeoHash编码;

这里会出现3种情况:

情况1:发送坐标所属的标准GeoHash区域和平衡GeoHash区域是“一对一”的情况时,直接映射过来找到其所对应的平衡GeoHash编码即可,无需特殊处理;

比如第一条微博的发送坐标位于标准GeoHash编码为s26的区域,这个标准GeoHash区域直接映射成了编码为b48的平衡GeoHash区域,因此编码b48就是第一条微博所对应的平衡GeoHash编码。

情况2:发送坐标所属的标准GeoHash区域和平衡GeoHash区域是“一对多”的情况时,查映射表时会发现这个标准GeoHash编码会对应多个平衡GeoHash编码,此时还需要进一步借助入库数据的经纬度信息进行细处理,从多个平衡GeoHash编码里计算选出入库数据所属的那一个平衡GeoHash编码;

比如第三条微博的发送坐标位于标准GeoHash编码为s15的区域,这个标准GeoHash区域被映射成了4个平衡GeoHash区域,映射成的4个平衡GeoHash区域的编码分别为b37、b38、b39和b40。此时本发明还需借助发送坐标的经纬度信息来更进一步确定其真正所属的平衡GeoHash区域。由于被拆分成的4个区域是大小相等的,所以本发明可以计算知道各个区域的经纬度范围,再和发送坐标的经纬度进行比较就可最终确定平衡GeoHash编码。由于发送坐标的经纬度(经度-21.02、维度-10.36)位于平衡GeoHash编码为b40的经纬度范围(经度-22.50~0.00,维度-11.25~0.00)内,因此b40就是第二条微博所对应的平衡GeoHash编码。

情况3:发送坐标所属的标准GeoHash区域和平衡GeoHash区域是“多对一”的情况时,查映射表时会发现这个标准GeoHash编码和一些其他标准GeoHash编码所对应的平衡GeoHash编码是一样的,为了更加准确地定位数据,不能直接使用这个平衡GeoHash编码,还需要借助映射表中之前记录的“相对位置信息”来对这个平衡GeoHash再进行一次细处理,得到更为准确的平衡GeoHash编码;

比如第二条微博的发送坐标位于标准GeoHash编码为s48的区域,这个标准GeoHash区域和一些其他的标准GeoHash区域(比如s50区域、s51区域等等)都映射成了同一个平衡GeoHash区域b65,本发明如果直接使用这个平衡GeoHash编码b65,会使得之后的查询算法在初始定位时不够准确,造成一些非必要的数据返回,为了让平衡GeoHash编码能更加准确地描述定位信息,本发明还需要借助之前在映射表中填入的“相对位置信息”。查表时,除了知道标准GeoHash编码s48映射成了平衡GeoHash编码b65外,本发明还可以知道这个标准GeoHash区域在平衡GeoHash区域中的相对位置信息00(本发明以数字的大小来记录相对位置信息),因此第三条微博应该得到的平衡GeoHash编码为b65.00(前半部分代表映射成的平衡GeoHash区域,后半部分代表在平衡GeoHash区域中的相对位置)。

步骤3:将上述得到的平衡GeoHash编码作为关键字(Key),经纬度等其他信息作为值(Value),构成Key-Values键值对把数据插入到NoSQL数据库中。

比如,要把第一条微博存入到HBase数据库中,其关键字(Key)是b48,其值(Value)可以有经度-11.23、维度20.39等其他信息,这样形成如图13所示的键值对来存入HBase数据库。

在完成全部数据的入库工作后,还需要实现一种查询算法,可以针对这些数据进行高效快速的查询。空间点要素的查询方式一般都是“拉框查询”,即查询被矩形框所框住的点,因此输入数据一般都是矩形框的经纬度范围。如图14所示,假定要查询在红色矩形框内发出的全部微博消息(也是一种点要素数据),以此为例说明点要素的空间范围查询算法的具体步骤:

步骤1:根据输入的矩形框的经纬度范围,计算求得被矩形框所框住的标准GeoHash编码区域;

如图15所示,只要标准GeoHash编码区域和矩形框有公共部分,就认为其被矩形框所框住(图中阴影部分表示被矩形框所框住的区域),因此这里“框住”包含“相交”和“包含”两层意思。所以在此例中,被矩形框所框住的标准GeoHash编码区域有:s15、s26、s37、s39、s48和s50,如图14阴影部分所示。

步骤2:将得到的标准GeoHash编码进行查表,进一步得到其所对应的基于人口密度分布的平衡GeoHash编码,如图16所示;

这里又会出现3种情况:

情况1:如果被框住的这个标准GeoHash编码区域和其所对应的平衡GeoHash编码区域是“一对一”情况,直接使用映射过来的平衡GeoHash编码即可,不需要再进行特殊处理;

比如上面被框住的标准GeoHash区域s26和s39,分别“一对一”地映射为平衡GeoHash区域b48和b62,可以直接使用b48和b62作为查询条件对数据进行查询。

情况2:如果被框住的这个标准GeoHash编码区域对应多个平衡GeoHash编码区域,即“一对多”情况,则还需再细分这个标准GeoHash区域,只选出被矩形框所框住的那部分平衡GeoHash编码区域,如图17所示;

比如此实例中被框住的标准GeoHash区域s15,它映射成4个平衡GeoHash区域b37、b38、b39和b40。本发明不能直接把这4个平衡GeoHash编码都作为查询条件来进行数据的查询,因为其中有些平衡GeoHash区域(比如b37和b38)并不在矩形框的范围内,为了尽量减少非必要的返回数据,加快查询效率,这里还需要做额外的筛选处理,借助矩形框的经纬度信息只选出被框住的那部分平衡GeoHash区域。此例在这种“一对多”的情况下最后应该被选出的可作为查询条件的平衡GeoHash编码应该是b39、b40,如图16所示。

情况3:如果被框住的多个标准GeoHash编码区域对应同一个平衡GeoHash编码区域,即“多对一”情况,为了尽量减少非必要的返回数据,本发明不应该直接将整个大的平衡GeoHash区域对应过来,而应该只选取其中被矩形框所框住的最小连续子区域,如图18所示;

比如此实例中被框住的标准GeoHash编码区域s48和s50,这两个区域都对应同一个平衡GeoHash区域b65,但是这里为了尽量减少非必要的返回数据从而提高查询效率,不能直接以b65作为查询条件来查询数据,因为平衡GeoHash编码b65还包含了没有被矩形框所框住的一些标准GeoHash区域(比如s55、s61等等)。加入相对位置信息进一步精确定位,如果只以b65.00(对应s48)和b65.02(对应s50)作为查询条件,是可以最大程度上减少非必要的返回数据,但是由于是离散不连续的,所以HBase内部会产生多个查询过程来查询数据,这又会增加查询时间。相互权衡利弊后,最佳的方案是以平衡GeoHash内部被框住的最小连续子区域作为查询条件,即本发明应该以[b65.00,b65.02]这个平衡GeoHash编码的连续区间作为查询条件。这样既减少了部分非必要的返回数据,也保证了只有一个查询过程。

步骤3:还需要把得到的平衡GeoHash编码进行“串连”处理,即如果两个平衡GeoHash片段是可以拼接的,则将这两段片段拼接成一个新的片段,直到片段之间再不能相互拼接为止,如图19所示;

具体串连步骤如下:

(1)对平衡GeoHash片段首先进行排序处理,开始遍历排序好的片段序列;

(2)如果当前片段的末尾和下一个片段的开头可以拼接,则连接起来作为一个新的片段,并以这个新的片段为当前片段;如果不能拼接,则将当前片段保存起来并且以下一个片段作为新的当前片段继续往后寻找可以拼接的片段;

(3)不断地循环(2)操作直到遍历到序列的最后一个片段为止,保存当前片段后结束。

减少了查询片段的数量,也就减少了HBase内部的区间Scan查询过程,从而减少了查询时间,可以提高查询效率。此实例在串连拼接处理之前得到平衡GeoHash片段如下:

{b39}、{b40}、{b48}、{b59}、{b60}、{b62}、[b65.00,b65.02]

经过串连处理后,得到如下片段:

[b39,b40]、{b48}、[b59,b60]、{b62}、[b65.00,b65.02]

步骤4:利用上述得到的平衡GeoHash编码片段作为查询条件进行空间点数据的查询;

如图16所示,红色矩形框是本发明最开始给定的查询范围,此例此时会得到在阴影区域范围内发送的微博消息。

步骤5:最后利用NoSQL数据库的Coprocessor机制或者用户自定义函数UDF机制对上述粗查询得到的空间点进行进一步的细筛选,最终得到被矩形框所框住的空间点数据。

如图16所示,阴影区域包含了红色矩形框,但是并不能完全吻合,仍然存在一点多余的数据,所以上述步骤得到的数据仅仅只是粗查询的结果,最后还需要借助矩形框的经纬度信息以及HBase数据库的Coprocessor机制或者UDF机制对这个结果进行细筛选,最终得到精确无误的查询结果。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

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