一种基于Trie的范围查询方法及装置与流程

文档序号:13915584阅读:280来源:国知局

本发明涉及一种基于trie的范围查询方法及装置,属于空间数据库(spatialdatabase)领域、空间关键字查询领域、地理信息系统(geographicinformationsystem,gis)等领域。



背景技术:

随着移动设备的普及、定位技术的快速发展、基于位置的服务(location-basedservice,lbs)的飞速发展等,空间数据量正在飞速增长。

海量的空间数据需要高效的空间索引技术。空间索引用于过滤、排除大量与特定空间操作无关的地理对象,从而缩减空间操作范围,空间索引性能的优劣直接影响空间数据库的可用性与可扩展性。从空间数据库的观点来看,空间索引结构可以分为两类:专门用于处理点对象的点存取方法(pam)和处理具有空间扩展的空间对象(包括点、线、面、体)的空间存取方法(sam)。pam包括grid文件、buddy树、k-d-b树、hb树、lsd树等;依据空间对象的不同组织方式,sam分为对象映射、对象分割/复制和对象界定三类,对象映射即将高维空间中的对象线性映射到一维空间,用空间排列码(如:peano码、hilbert码、morton码等)进行表达;对象分割/复制是把与子空间相交的数据对象分割成几个子对象,分别存储在互不重叠的子空间中,在子空间中复制对象本身或其标识符,如:r+树、cell树、线性四叉树等;对象界定又称为区域重叠技术,其主要思想是允许子空间的相互重叠,如:r树、r*树等。r树是目前最流行的动态空间索引结构,其采用对象的最小外包矩形(minimumboundingrectangle,mbr)来近似表示空间实体,可有效支持查询、插入、删除等操作。由于空间数据分布的偶然性,容易造成mbr重叠,查询时会产生多个查询分支,从而降低查询效率。r+树的提出用于避免r树由于兄弟节点的重叠而产生的多路径查询问题,与此同时,也产生了相应的问题,如:冗余存储、可能产生死锁等。

采用geohash空间索引方法可有效解决由r树导致的上述问题。geohash编码支持区域分层、任意精度与简单的近似估计,只需对一个字段进行索引,降低空间索引复杂度。因此,geohash空间索引方法广泛用于多个领域,如:地理信息系统领域(如:postgis)、空间数据库领域(如:mongodb)、信息检索领域(如:lucene)。

存储geohash编码的常用索引结构如:b树、hashing、trie。对geohash编码而言,位于同一区域的位置点具有公共前缀,区域越小,公共前缀越长,这使得geohash编码可有效支持位置点的范围查询。trie(字典树、前缀树、单词查找树)可以将字符串公共前缀压缩为trie中一条公共路径,因此可以很好地存储geohash编码。采用trie存储geohash编码的方法如:stcode、geotrie、mp-trie等,但是上述方法通常基于完整字符串构建trie索引结构,因此空间开销较大。



技术实现要素:

本发明提供了一种基于trie的范围查询方法及装置,目的在于有效支持任意范围查询;在降低空间开销的同时,具有较高的查询效率。

本发明的技术方案是:一种基于trie的范围查询方法,包括:

数据预处理步骤,将数据集中所有位置点编码成长度为n的字符串,根据字符串后缀按字典序对数据集中的位置点排序并编号id;

空间索引建立步骤,根据排序后的字符串前缀构建trie空间索引结构;

范围查询步骤,在索引结构上获取查询域内的位置点,经过滤得到候选集,并对候选集验证返回查询范围内的所有位置点。

所述数据预处理步骤,具体包括如下步骤:

步骤110:给定一个由一系列位置点构成的数据集d,通过geohash算法将d中的位置点编码成长度为n的字符串s;其中,位置点由纬度、经度数据构成;

步骤120:将每一个位置点编码的字符串s分为m位前缀部分spre和n-m位后缀部分ssuf,根据字符串后缀按字典序对数据集中的位置点排序并编号,该编号即为对应的位置点id;其中,m≤n。

所述空间索引建立步骤,具体为:

步骤210:根据字符串前缀构建trie索引结构,每个spre可映射为trie中一条从根到叶节点的路径,那么spre可称为该叶节点的前缀,每个叶节点存储由该节点的前缀对应的id构成的反向列表。

所述空间索引建立步骤,还包括步骤220,具体为:

步骤220:构建字符串后缀和id范围的映射表;其中,id范围指包含字符串后缀的字符串对应id的起始值至结束值。

所述范围查询步骤,具体包括如下步骤:

步骤310:给定查询位置点q和查询距离范围d,根据geohash精度表选定与d相对应的geohash编码长度p,通过geohash算法将位置点q编码为p位长度的字符串qs,获取字符串qs周围8个区域的geohash编码,并将字符串qs及其周围8个区域作为查询域;其中,p对应的距离误差不小于d且为最小值;

步骤320:若d>d1,通过检索trie索引结构即可返回9个查询域内的id;反之,需通过映射表辅助查询方可返回9个查询域内的id;其中,d1表示geohash精度表中|spre|+1对应的距离;

步骤330:根据查询位置点q和查询距离范围d分别确定纬度范围与经度范围,通过经纬度范围对9个查询域内的id进行筛选,最终得到候选集;

步骤340:计算候选集中id对应的位置点到q的距离dq:若dq≤d,则返回该位置点,否则,不返回。

所述步骤110,包括下列步骤111、112:

步骤111:根据geohash精度表确定geohash编码长度n;

步骤112:通过geohash算法将所有位置点编码成长度为n的字符串。

所述通过geohash算法将位置点编码成字符串具体为:首先,将经纬度范围看作二维平面坐标系;然后,采用二分法对经度/纬度进行划分,根据位置点经度/纬度在划分结果中的位置分别赋值0或1,直到划分次数满足对应的经/纬度位串的位数;之后,通过位交错方法合并经度位串与纬度位串;最后,通过base32编码将经纬度位串编码为相应长度的字符串。

所述步骤310中,获取qs周围8个区域的geohash编码的方法:根据qs的经纬度位串,东/西方向的区域编码:经度位串不变,纬度位串加/减1,通过位交错方法得到该区域的经纬度位串;南/北方向的区域编码:纬度位串不变,经度位串减/加1,通过位交错方法得到该区域的经纬度位串;东北/西南方向的区域编码,经纬度位串均加/减1,通过位交错方法得到该区域的经纬度位串;东南方向的区域编码:纬度位串加1,经度位串减1,通过位交错方法得到该区域的经纬度位串;西北方向的区域编码:纬度位串减1,经度位串加1,通过位交错方法得到该区域的经纬度位串;之后,通过base32编码将以上8个位串进行编码即可获得qs周围8个区域的geohash编码。

所述步骤330中根据查询位置点q和查询距离范围d分别确定纬度范围与经度范围方法如下:纬度的最大值maxlat=lat+range,纬度的最小值minlat=lat-range;经度的最大值maxlng=lon+lngr,经度的最小值minlng=lon-lngr;其中,lat表示查询位置点q的纬度值,lon表示查询位置点q的经度值,range=180/π*d/6372.797,lngr=range/cos(lat*π/180.0)。

一种基于trie的范围查询装置,包括:

数据预处理装置,用于将数据集中所有位置点编码成长度为n的字符串,根据字符串后缀按字典序对数据集中的位置点排序并编号id;

空间索引建立装置,用于根据排序后的字符串前缀构建trie空间索引结构,并构建字符串后缀和对应的位置点id范围的映射表;

范围查询装置,用于在索引结构上获取查询域内的位置点,经过滤得到候选集,并对候选集验证返回查询范围内的所有位置点。

本发明的有益效果是:本发明采用基于字符串前缀构建部分trie索引结构,在降低空间开销的同时,具有较高的查询效率;采用geohash空间索引方法,有效支持任意范围查询。

附图说明

图1是基于trie的范围查询功能模块图;

图2是geohash精度表;

图3是base32编码规则图;(注:(+/-)表示加减);

图4是位置点转换为字符串图;

图5是位置点排序图;

图6是基于字符串前缀构建的trie图;

图7是字符串后缀和id范围的映射表图。

具体实施方式

实施例1:如图1-7所示,一种基于trie的范围查询方法,包括

数据预处理步骤:

步骤111、根据geohash精度表(如图2所示),将geohash编码长度n设置为8,则经纬度位串分别为20位;

步骤112、通过geohash算法将d中的位置点转换成长度为8的字符串,实现方法如下:

示例:(19.596412-99.219501)

首先将纬度范围(-90,90)平分成(-90,0)、(0,90)两个区间,如果目标纬度位于前一个区间,则编码为0,否则编码为1。因19.596412属于区间(0,90),所以编码为1;然后再将(0,90)分成(0,45)、(45,90)两个区间,因19.596412属于区间(0,45),所以编码为0;以此类推,直至位串长度为20。最终19.596412的编码为10011011110111101101。

经度也采取同样的方法,对范围(-180,180)依次细分至位串长度为20。最终-99.219501的编码为00111001011100011010。

接下来将经纬度位串进行合并,奇数位为纬度,偶数位为经度,得到编码0100101111000111011110110101011011011001。

最后,通过base32编码(如图3所示)得到(19.5964412-99.219501)的geohash编码为9g3rqpqt。

通过geohash算法将d中的位置点转换成长度为8的字符串,如图4所示。

步骤120、将m值设置为“5”,根据字符串后缀按字典序对数据集中的位置点排序并编号,如图5所示。

空间索引的建立包括下列步骤:

步骤210、字符串集

{9g3rw04d,9g3rw058,9g3rw24s,9g3rw27u,9g3rtb4h,9g3rtbst,9g3rqn7z,9g3rqp4t,9g3rqp57,qw6x1p5t,tdn4rp5t,r39x8p5t,9g3rqp5t,dp3mgp5t,9g3rqp6z,wdw5rp7u,9g3rqp7u,7nx1tp7u,9g3rqpbz,9g3rqphk,9g3rqpmz,9g3rqpqt,9g3rqpvz,9g3rqq7z,9g3rqqmk,9g3rqr7x,9g3rqrbt,9g3rmy55,9g3rmz1w,9g3rmzxy},根据字符串前缀构建trie索引结构,每个叶节点存储由该节点的前缀对应的id构成的反向列表,如图6所示。

步骤220、构建字符串后缀和id范围的映射表,如图7所示。

范围查询包括下列步骤:

步骤311、给定查询位置点(19.596412-99.219501)和查询距离范围500米,需p对应的距离误差不小于500且为最小值,则p值应设置为6,通过geohash算法将(19.596412-99.219501)编码为6位长度的字符串9g3rqp;

步骤312、获取9g3rqp周围8个区域的geohash编码,并将9g3rqp及其周围8个区域作为查询域,方法如下:

9g3rqp的纬度位串为100110111101111,经度位串为001110010111000。

北方区域的geohash编码:纬度位串为100110111101111,经度位串为001110010111000+1=001110010111001,经纬度位串为010010111100011101111011010111,geohash编码为9g3rqr;

东北区域的geohash编码:纬度位串为100110111101111+1=100110111110000,经度位串为001110010111000+1=001110010111001,经纬度位串为010010111100011101111110000010,geohash编码为9g3rw2;

东方区域的geohash编码:纬度位串为100110111101111+1=100110111110000,经度位为001110010111000,经纬度位串为010010111100011101111110000000,geohash编码为9g3rw0;

东南区域的geohash编码:纬度位串为100110111101111+1=100110111110000,经度位串为001110010111000-1=001110010110111,经纬度位串为010010111100011101111100101010,geohash编码为9g3rtb;

南方区域的geohash编码:纬度位串为100110111101111,经度位串为001110010111000-1=001110010110111,经纬度位串为010010111100011101111001111111,geohash编码为9g3rmz;

西南区域的geohash编码:纬度位串为100110111101111-1=100110111101110,经度位串为001110010111000-1=001110010110111,经纬度位串为010010111100011101111001111110,geohash编码为9g3rmy;

西方区域的geohash编码:纬度位串为100110111101111-1=100110111101110,经度位为001110010111000,经纬度位串为010010111100011101111011010100,geohash编码为9g3rqn;

西北区域的geohash编码:纬度位串为100110111101111-1=100110111101110,经度位串为001110010111000+1=001110010111001,经纬度位串为010010111100011101111011010110,geohash编码为9g3rqq。

9g3rqp周围的8个区域为:9g3rqr、9g3rw2、9g3rw0、9g3rtb、9g3rmz、9g3rmy、9g3rqn、9g3rqq;

步骤320、因500<610(前缀长度为5,则d1应选取geohash长度为6所对应的距离,由图2可知,其表示距离610m),故需通过映射表辅助查询返回候选集,实现过程如下:

通过trie查询9g3rw区域内的id{1,2,3,4},后缀表中以‘0’为起始字符的id{1,2},{1,2,3,4}与{1,2}的交集为{1,2},故9g3rw0区域内的id为{1,2};以‘2’为起始字符的id{3,4},{1,2,3,4}与{3,4}的交集为{3,4},故9g3rw2区域内的id为{3,4};

通过trie查询9g3rq区域内的id{7,8,9,13,15,17,19,20,21,22,23,24,25,26,27},后缀表中以‘r’为起始字符的id{26,27},{7,8,9,13,15,17,19,20,21,22,23,24,25,26,27}与{26,27}的交集为{26,27},故9g3rqr区域内的id为{26,27};以‘q’为起始字符的id{24,25},{7,8,9,13,15,17,19,20,21,22,23,24,25,26,27}与{24,25}的交集为{24,25},故9g3rqq区域内的id为{24,25};以‘n’为起始字符的id{7},{7,8,9,13,15,17,19,20,21,22,23,24,25,26,27}与{7}的交集为{7},故9g3rqn区域内的id为{7};以‘p’为起始字符的id{8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23},{7,8,9,13,15,17,19,20,21,22,23,24,25,26,27}与{8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23}的交集为{8,9,13,15,17,19,20,21,22,23}故9g3rqp区域内的id为{8,9,13,15,17,19,20,21,22,23};

通过trie查询9g3rm区域内的id{28,29,30},后缀表中以‘y’为起始字符的id{28},{28,29,30}与{28}的交集为{28},故9g3rmy区域内的id为{28};以‘z’为起始字符的id{29,30},{28,29,30}与{29,30}的交集为{29,30},故9g3rmz区域内的id为{29,30};

通过trie查询9g3rt区域内的id{5,6},后缀表中以‘b’为起始字符的id{5,6},{5,6}与{5,6}的交集为{5,6},故9g3rtb区域内的id为{5,6};

由上可知,9个查询域内的id为{1,2,3,4,5,6,7,8,9,13,15,17,19,20,21,22,23,24,25,26,27,28,29,30};

(备注:根据以上所述,不难发现{9g3rw,9g3rq,9g3rm,9g3rt}四个区域内id的并集与9个查询域内的id一致,因数据集不全面而出现了该问题。若数据集中包含位置点(19.609757-99.225675),其geohash编码为9g3rw1f5(假设其id为10),则9g3rw区域内的id为{1,2,3,4,10},后缀表中以‘0’为起始字符的id{1,2},{1,2,3,4,10}与{1,2}的交集为{1,2},故9g3rw0区域内的id为{1,2};以‘2’为起始字符的id{3,4},{1,2,3,4,10}与{3,4}的交集为{3,4},故9g3rw2区域内的id为{3,4}。9个查询域内的id不包含10,即不包含该位置。)

步骤330、根据查询位置点(19.596412-99.219501)和查询距离范围500m确定纬度范围与经度范围,如下所示:

step1:180÷3.141593×0.5÷6372.797=0.004495

step2:0.004495÷cos(19.596412×3.141593÷180.0)=0.004771

step3:19.596412+0.004495=19.600907

step4:19.596412-0.004495=19.591917

step5:-99.219501+0.004771=-99.214730

step6:-99.219501-0.004771=-99.224272

由上可知,经度范围为[19.591917,19.600907],纬度范围为[-99.224272,-99.214730]。根据经纬度范围对9个查询域内的id{1,2,3,4,5,6,7,8,9,13,15,17,19,20,21,22,23,24,25,26,27,28,29,30}进行过滤并返回经纬度范围内的位置点。如:id为1时,其经纬度为(19.600038-99.22491),19.600038位于[19.591917,19.600907]内,而-99.22491不位于[-99.224272,-99.214730]内,故过滤id为1的位置点。经过滤后,候选集为{2,9,13,17,20,21,22,23,27}。

步骤340、计算候选集{2,9,13,17,20,21,22,23,27}中id对应的位置点(19.596412-99.219501)的距离dq,若dq<=500,则返回该位置点,实现过程如下所示:

查询条件:(19.596412-99.219501),500米;

距离计算公式:设a(x1,y1),b(x2,y2),则|ab|=(1);

根据公式(1)依次计算位置点集中的位置点与(19.596412-99.219501)的距离,返回不大于500米的位置点,经计算,满足要求的位置点集为{{19.594717-99.22388},{19.59506-99.223537},{19.596261-99.223194},{19.594888-99.222507},{19.596776-99.220447},{19.596412-99.219501},{19.599523-99.220447},{19.59918-99.21667}}。

故满足查询范围内的位置点为{{19.594717-99.22388},{19.59506-99.223537},{19.596261-99.223194},{19.594888-99.222507},{19.596776-99.220447},{19.596412-99.219501},{19.599523-99.220447},{19.59918-99.21667}}。

一种基于trie的范围查询装置,包括:

数据预处理装置,用于将数据集中所有位置点编码成长度为n的字符串,根据字符串后缀按字典序对数据集中的位置点排序并编号id;

空间索引建立装置,用于根据排序后的字符串前缀构建trie空间索引结构,并构建字符串后缀和对应的位置点id范围的映射表;

范围查询装置,用于在索引结构上获取查询域内的位置点,经过滤得到候选集,并对候选集验证返回查询范围内的所有位置点。

实施例2:如图1-7所示,一种基于trie的范围查询方法,包括:

数据预处理步骤,将数据集中所有位置点编码成长度为n的字符串,根据字符串后缀按字典序对数据集中的位置点排序并编号id;

空间索引建立步骤,根据排序后的字符串前缀构建trie空间索引结构;

范围查询步骤,在索引结构上获取查询域内的位置点,经过滤得到候选集,并对候选集验证返回查询范围内的所有位置点。

进一步地,可以设置所述数据预处理步骤,具体包括如下步骤:

步骤110:给定一个由一系列位置点构成的数据集d,通过geohash算法将d中的位置点编码成长度为n的字符串s;其中,位置点由纬度、经度数据构成;

步骤120:将每一个位置点编码的字符串s分为m位前缀部分spre和n-m位后缀部分ssuf,根据字符串后缀按字典序对数据集中的位置点排序并编号,该编号即为对应的位置点id;其中,m≤n。

进一步地,可以设置所述空间索引建立步骤,具体为:

步骤210:根据字符串前缀构建trie索引结构,每个spre可映射为trie中一条从根到叶节点的路径,那么spre可称为该叶节点的前缀,每个叶节点存储由该节点的前缀对应的id构成的反向列表。

进一步地,可以设置所述范围查询步骤,具体包括如下步骤:

步骤310:给定查询位置点q和查询距离范围d,根据geohash精度表选定与d相对应的geohash编码长度p,通过geohash算法将位置点q编码为p位长度的字符串qs,获取字符串qs周围8个区域的geohash编码,并将字符串qs及其周围8个区域作为查询域;其中,p对应的距离误差不小于d且为最小值;

步骤320:d>d1,通过检索trie索引结构即可返回9个查询域内的id;其中,d1表示geohash精度表中|spre|+1对应的距离;(如实施例1,给出了d≤d1情况下,具体的实施过程,本实施例给出的是d>d1情况,采用实施例1中的数据对此处进行说明如下:通过检索trie索引结构即可返回9个查询域内的id,若给定查询位置点(19.596412-99.219501)和查询距离范围2000米,由geohash精度表可知,需p对应的距离误差不小于2000且为最小值,则p值应设置为5,通过geohash算法将(19.596412-99.219501)编码为5位长度的字符串9g3rq。9g3rq周围8个区域的geohash编码为:9g3rw、9g3rx、9g3rr、9g3rp、9g3rn、9g3rj、9g3rm、9g3rt。将9g3rq及其周围8个区域作为查询域,因2000>610,故通过检索trie索引结构即可返回9个查询域内的id,9个查询域内的id为{1,2,3,4,5,6,28,29,30}。)

步骤330:根据查询位置点q和查询距离范围d分别确定纬度范围与经度范围,通过经纬度范围对9个查询域内的id进行筛选,最终得到候选集;

步骤340:计算候选集中id对应的位置点到q的距离dq:若dq≤d,则返回该位置点,否则,不返回。

进一步地,可以设置所述步骤110,包括下列步骤111、112:

步骤111:根据geohash精度表确定geohash编码长度n;

步骤112:通过geohash算法将所有位置点编码成长度为n的字符串。

进一步地,可以设置所述通过geohash算法将位置点编码成字符串具体为:首先,将经纬度范围看作二维平面坐标系;然后,采用二分法对经度/纬度进行划分,根据位置点经度/纬度在划分结果中的位置分别赋值0或1,直到划分次数满足对应的经/纬度位串的位数;之后,通过位交错方法合并经度位串与纬度位串;最后,通过base32编码将经纬度位串编码为相应长度的字符串。

进一步地,可以设置所述步骤310中,获取qs周围8个区域的geohash编码的方法:根据qs的经纬度位串,东/西方向的区域编码:经度位串不变,纬度位串加/减1,通过位交错方法得到该区域的经纬度位串;南/北方向的区域编码:纬度位串不变,经度位串减/加1,通过位交错方法得到该区域的经纬度位串;东北/西南方向的区域编码,经纬度位串均加/减1,通过位交错方法得到该区域的经纬度位串;东南方向的区域编码:纬度位串加1,经度位串减1,通过位交错方法得到该区域的经纬度位串;西北方向的区域编码:纬度位串减1,经度位串加1,通过位交错方法得到该区域的经纬度位串;之后,通过base32编码将以上8个位串进行编码即可获得qs周围8个区域的geohash编码。

进一步地,可以设置所述步骤330中根据查询位置点q和查询距离范围d分别确定纬度范围与经度范围方法如下:纬度的最大值maxlat=lat+range,纬度的最小值minlat=lat-range;经度的最大值maxlng=lon+lngr,经度的最小值minlng=lon-lngr;其中,lat表示查询位置点q的纬度值,lon表示查询位置点q的经度值,range=180/π*d/6372.797,lngr=range/cos(lat*π/180.0)。

一种基于trie的范围查询装置,包括:

数据预处理装置,用于将数据集中所有位置点编码成长度为n的字符串,根据字符串后缀按字典序对数据集中的位置点排序并编号id;

空间索引建立装置,用于根据排序后的字符串前缀构建trie空间索引结构,并构建字符串后缀和对应的位置点id范围的映射表;

范围查询装置,用于在索引结构上获取查询域内的位置点,经过滤得到候选集,并对候选集验证返回查询范围内的所有位置点。

上面结合图对本发明的具体实施方式作了详细说明,但是本发明并不限于上述实施方式,在本领域普通技术人员所具备的知识范围内,还可以在不脱离本发明宗旨的前提下作出各种变化。

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