发明内容
针对上述技术问题,本申请提供一种地理位置距离批量计算方法及装置,技术方案如下:
一种地理位置距离批量计算方法,用于计算分别取自两个位置点集合的两点间距离,该方法包括:
对于给定的第一位置点集合A以及第二位置点集合B,分别获得集合A与集合B中位置点的geohash编码;
针对所获得的任一种geohash编码i,确定该编码所对应的集合A中位置点所构成的子集Ai,以及确定该编码所对应的集合B中位置点所构成的子集Bi,其中i=1、2、3…N,N为所获得的geohash编码的种类数;
针对所获得的任一种geohash编码i,计算Ai×Bi中每个元素所对应的位置点对的距离,其中Ai×Bi表示Ai和Bi的笛卡尔积。
一种地理位置距离批量计算装置,用于计算分别取自两个位置点集合的两点间距离,该装置包括:
编码获得模块,用于对于给定的第一位置点集合A以及第二位置点集合B,分别获得集合A与集合B中位置点的geohash编码;
子集确定模块,用于针对所获得的任一种geohash编码i,确定该编码所对应的集合A中位置点所构成的子集Ai,以及确定该编码所对应的集合B中位置点所构成的子集Bi,其中i=1、2、3…N,N为所获得的geohash编码的种类数;
距离计算模块,用于针对所获得的任一种geohash编码i,计算Ai×Bi中每个元素所对应的位置点对的距离,其中Ai×Bi表示Ai和Bi的笛卡尔积。
本申请所提供的技术方案,针对实际的应用需求,首先利用geohash将大面积的地理区域划分为若干矩形区块,然后分别在每个区块中计算位置点对的距离,这样能够有效减少不必要的位置点对距离计算,提升处理速度。另外,在分布式计算环境下、以geohash为单位进行分布式处理时,可以预先依据geohash中所包含的位置点/位置点对的数量,对不同的geohash进行分组,从而令每个分组中的计算任务都能维持在一个相对较小的变化范围内,以减轻数据倾斜现象,有效保证分布式计算的处理效率和资源利用率。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本申请。
具体实施方式
为了使本领域技术人员更好地理解本申请中的技术方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行详细地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员所获得的所有其他实施例,都应当属于本申请保护的范围。
首先对本申请涉及的一些相关概念进行介绍:
geohash是一种针对地理位置信息的编码方式,可以将二维的经度、纬度转换为一个字符串。每个geohash编码表示的并不是一个点,而是一个矩形区域。换言之,geohash将大面积的地理区域划分为若干个矩形区域,同一矩形区域内的每个位置点都具有相同的geohash编码。
矩形区域的精度可以通过geohash编码长度来控制,编码长度越长,对应的矩形区域面积越小,可表示的精度也就越高。例如,当编码长度为5时,精度在2400m左右,而编码长度为9时,精度可达到2m左右。
本申请基于geohash编码技术提出一种地理位置距离计算方法,以解决批量计算位置点间距时的效率问题。参见图1所示,该方法可以包括以下步骤:
S101,对于给定的第一位置点集合A以及第二位置点集合B,分别获得集合A与集合B中位置点的geohash编码;
假设给定两个位置点的集合A与B,A中包括x个位置点,B中包括y个位置点,应用需求可以是:对于A中的任意位置点,找到与其距离较近的B中位置点;或者,对于B中的任意位置点,找到与其距离较近的A中位置点。由于对A和B并未作区分,因此这两种需求的本质是完全相同的。
根据本申请方案,首先分别获得A中的x个位置点的geohash编码、B中y个位置点的geohash编码。
获得任意位置点geohash编码的方式,可以是根据位置点的坐标实时计算出位置点的geohash编码;也可以预先计算出位置点的geohash编码并存储,在需要使用时直接读取预先存储的计算结果。在实际应用中,上述两种方式也可以结合使用,例如,在计算“商家-用户”距离的应用场景中,“商家”的位置相对固定,因此可以预先计算出商家POI(Pointof Interest,兴趣点)的对应geohash编码;而“用户”的位置则相对变化频繁,因此可以在有处理需求时,再根据对用户的实时定位结果来计算对应的geohash编码。
geohash编码的具体生成方式与本申请方案无关,这里不再详细说明。另外geohash编码长度可以根据实际需求设置,本申请也不需要进行限定。
S102,针对所获得的任一种geohash编码i,确定该编码所对应的集合A中位置点所构成的子集Ai,以及确定该编码所对应的集合B中位置点所构成的子集Bi,
由于每个位置点都具有对应的geohash编码,因此针对A中包括的x个位置点,以及B中包括的y个位置点,可以对应得到共(x+y)个geohash编码。但是由geohash编码的特性可知,在这(x+y)个geohash编码中,一般是会出现大量重复编码的。也就是说,如果在S101共获得的geohash编码的种类数为N,理论上N≤(x+y),而实际的情况则往往是N<<(x+y)。
假设对N种geohash编码分别以编号1~N进行标识,那么对于所获得的任一种geohash编码i,其对应的矩形区域内,可能会包括若干集合A中的位置点以及若干集合B中的位置点,将第i个geohash编码所对应的集合A中的位置点定义为集合Ai、将第i个geohash编码所对应的集合B中的位置点定义为集合Bi。该处理对应的实际意义在于:将集合A和集合B中的位置点按照位置分布在第1、2、3…N个geohash编码矩形区域,每个区域i中的集合A位置点构成子集Ai,每个区域i中的集合B位置点构成子集Bi。
在本申请的一种具体实施方式中,除了根据geohash编码区域之外,还可以进一步结合其他约束条件来确定子集Ai和子集Bi,具体而言,集合A与集合B中的位置点,均可以具有至少一种附加属性,并赋有相应的属性值。进而,在确定子集Ai和子集Bi时,除了满足“位置点均位于相同的geohash编码i区域”之外,还需要进一步满足条件:子集Ai中的位置点附加属性值与子集Bi中的位置点附加属性值相匹配。这里的“匹配”,在实际应用中可以包含多种含义,下面结合实际应用场景进行说明:
集合A与集合B中的位置点具有相同的附加属性:
仍以“商家-用户”的推荐应用场景为例进行说明,“商家”和“用户”可以具有例如“所在城市”、“所在商圈”、“商户类型”等附加属性。附加属性的匹配规则可以是“属性值完全一致”,例如商家所在商圈和用户“所在城市”完全一致;匹配规则也可以是“属性值满足特定的匹配标准(不要求完全一致)”,例如规定位置临近的“商圈”中的位置点即满足匹配规则,等等。
集合A与集合B中的位置点具有存在对应关系的附加属性:
例如,商户具有附加属性“商户类型”,用户具有附加属性“期望推荐商户类型”(该属性值可能会根据用户需求实时确定),假设当前需要进行餐饮业的商户推荐处理,则“附加属性相匹配”的要求可以是:“商户类型与期望推荐商户类型属性值均为餐饮”、“商户类型与期望推荐商户类型中至少包括餐饮”等等。
可见,结合实际的应用需求,可以利用附加属性约束的方式对子集Ai和子集Bi所包含的位置点数量进行筛选,从而实现进一步降低数据处理量的效果。当然,上述几种筛选方案仅用于示意性说明,根据实际的应用需求,还可以选取其他形式的附加属性以及其他形式的匹配规则,本申请对此并不需要进行限定。
S103,针对所获得的任一种geohash编码i,计算Ai×Bi中每个元素所对应的位置点对的距离。
首先简单介绍一下笛卡尔积(Cartesian product)的概念:对于两个集合A和B,如果用A中元素作为第一元素,B中元素作为第二元素构成有序对,所有这样的有序对组成的集合叫做A与B的笛卡尔积,表示为A×B。
在本方案申请中,对于任意的geohash编码i,假设子集Ai中有x1个位置点、子集Bi中有y1个位置点,则Ai×Bi中共有x1*y1组“Ai位置点-Bi位置点”的位置点对。这里需要说明的是,尽管根据数学上的定义,笛卡尔积是不满足交换律的,但是针对本申请方案,由于“两点距离”是与两个位置点的前后顺序无关的,也就是说,本申请方案可以仅关注两个集合间元素的排列、与组合无关,因此计算Ai×Bi或者计算Bi×Ai都能够得到同样的x1*y1组的位置点对,对最终的两点距离计算结果并没有影响。
对每种geohash编码(i=1、2、3…N)分别进行上述处理,得到N个笛卡尔积,即N个位置点对的集合,然后分别计算每种geohash编码所对应的位置点对的距离。根据实际应用需求,计算距离时可以直接采用两点间直线距离公式,对于精度需求比较高、且位置点跨越幅度较大的应用场景,可以采用球面距离公式进行计算:
d=R·arc cos[cosβ1cosβ2cos(α1-α2)+sinβ1sinβ2]
其中R为地球半径,(α1,β1)、(α2,β2)分别为两个位置点的经纬度。
可以看出,本申请方案利用geohash编码,将某个大面积地理区域内的位置点划分至N个小区域中,与现有技术相比,位置对距离的计算量至少能够从x*y降低至(x1*y1+x2*y2+…xN*yN),这里x1~xN和y1~yN是指未考虑附加属性筛选的情形,即满足:x1+x2+…+xN=x,y1+y2+…+yN=y。如果结合附加属性进行筛选,则计算量能够进一步降低。
在分布式计算环境下,可以将位置点对距离的计算任务发送至分布式计算系统进行处理。为提高分布式计算的处理效率,本申请进一步提供方案如下:
以geohash编码i(i=1、2、3…N)为key,将不同的geohash编码i对应的位置点对距离计算任务分别发送至不同的分布式节点进行并行计算。
为了避免或减小数据倾斜问题,将N种geohash编码划分为多个分组,具体的分组方案可以包括:
统计每种geohash编码所对应的集合A(或集合B)位置点数量,也即每个Ai(或Bi)的位置点数量,根据统计结果以及预设的分组区间,将N种geohash编码划分为多个分组。分组区间可以设置为一个或多个,一般而言,n个数量阈值可以确定n+1个区间,具体阈值大小可以根据实际需求设置。例如,设置一个数量阈值2000,则对应的数量区间为2个:[0,2000)、[2000,∞)。
也可以统计每种Ai×Bi中所包含的位置点对数量,然后根据统计结果以及预设的分组区间,将N种geohash编码划分为多个分组。
总之,这里进行分组的原则是,令每个分组内的计算任务量能够分别维持在一个相对较小的变化范围内,这样在进行分布式处理时,根据分组结果,依次将不同的分组的Ai×Bi所对应的位置点对距离计算任务发送至分布式系统进行处理,可以有效避免或减轻数据倾斜的问题。
例如,在N种geohash编码中,对应每个编码i的距离计算任务量变化范围在500~4000,如果不分组直接进行分布式处理,那么可能出现的情况是(假设各个节点的计算能力相同):处理500任务的节点在很早完成计算并进入空闲等待状态,需要等待处理4000任务的节点完成计算后才能再次处理下一个任务。如果以2000为阈值进行分组后,500~2000区间、2000~4000区间将作为两个任务组依次发送至分布式系统,也就是说,在多个节点并行处理任务时,计算量的变化范围从500~4000缩减至500~2000或2000~4000,数据倾斜的现象明显减小,实际的处理效率和资源利用率也会得到相应的改善。当然,根据实际需求(例如计算任务数量跨度、区间分布、分布式节点数量、处理能力等),还可以进一步设置更复杂的分组策略,本申请对此并不需要进行限定。
相应于上述方法实施例,本申请还提供一种地理位置距离批量计算装置,参见图2所示,该装置可以包括:
编码获得模块110,用于对于给定的第一位置点集合A以及第二位置点集合B,分别获得集合A与集合B中位置点的geohash编码;
子集确定模块120,用于针对所获得的任一种geohash编码i,确定该编码所对应的集合A中位置点所构成的子集Ai,以及确定该编码所对应的集合B中位置点所构成的子集Bi,其中i=1、2、3…N,N为所获得的geohash编码的种类数;
距离计算模块130,用于针对所获得的任一种geohash编码i,计算Ai×Bi中每个元素所对应的位置点对的距离,其中Ai×Bi表示Ai和Bi的笛卡尔积。
在本申请的一种具体实施方式中,距离计算模块130可以具体用于:
统计所获得的每种geohash编码所对应的集合A位置点数量,和/或每种geohash编码所对应的集合B位置点数量,根据统计结果,将所获得的geohash编码划分为至少两个分组;
根据分组结果,依次将不同的分组的Ai×Bi所对应的位置点对距离计算任务发送至分布式系统进行处理。
在本申请的一种具体实施方式中,编码获得模块110可以具体用于:
读取预先存储的集合A与集合B中位置点的geohash编码;
或者
根据集合A与集合B中位置点的坐标,计算每个坐标所对应的geohash编码。
在本申请的一种具体实施方式中,集合A与集合B中的位置点,均具有至少一种附加属性;
相应地,子集确定模块120可以具体用于:针对所获得的任一种geohash编码i,根据位置点的附加属性值进行筛选,确定i所对应的位置点子集Ai和位置点子集Bi,且满足:子集Ai中的位置点附加属性值与子集Bi中的位置点附加属性值相匹配。
在本申请的一种具体实施方式中,距离计算模块130可以具体用于:
根据位置点的经纬度,计算两个位置点的球面距离。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例或者实施例的某些部分所述的方法。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置或系统实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的装置或系统实施例仅仅是示意性的,其中所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,在实施本申请方案时可以把各模块的功能在同一个或多个软件和/或硬件中实现。也可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上所述仅是本申请的具体实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本申请的保护范围。