[0036] 为了更清楚地说明本发明的技术方案和技术效果,下面将对照附图对本发明的具体实施方式进行详细说明。显而易见地,下面描述仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图,并获得其他的实施方式。
[0037] 应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及的技术特征只要彼此之间未构成冲突就可以相互组合。
[0038] 本发明的技术思路为:Spark中的driver节点(驱动器节点),将所有excutor节点(执行器节点)都使用到的公用数据通过broadcast机制进行广播,各个excutor节点加载一部分数据,然后各个excutor节点完成各自节点的计算任务,充分利用多核CPU的计算性能。
[0039] driver节点为Spark中的主节点,主要用来控制任务分发,协调各节点的运行等。executor是从节点,主要完成各个分区的计算任务。弹性式分布数据集(Resilient Distributed Dataset,RDD)是Spark中的基本数据抽象,具有自动容错、位置感知调度及可伸缩性等特点。Partition是数据组织的基本单位,类似于hdfs文件被切分为多个block存储在各个节点上,RDD被切分为多个partition。RDDs有transformations和actions两种操作形式,前者指的是从已有数据集中创造出新的数据集出来,如RDDs,后者将数据集上计算得到的结果返回给Driver。
[0040] 具体实施时,主要针对单条道路分别进行运算,运算的相关信息如下:
[0041] 单条道路的数据结构采用LineInfo来描述,LineInfo中包括了道路编号(id),分区编号(partitionNum),道路的Geometry形式(LineString),道路分段信息(segments),与其他道路的交点信息(CrossPoints),路网交点的索引结构(intersections),交点的位置信息(relationInfo),每个线性单云的邻接单元信息(weight),邻域内的事件点数(pointcount)等。路网交点的索引结构intersections即路网拓扑结构。
[0042] 其中,分区编号partitionNum指Spark分区的编号,具体以1,2,3……等编号;道路的Geometry形式为postgres数据库存储数据的一种格式;交点信息CrossPoints用来存储每条道路与其他道路的交点信息,具体用来存储相交道路的编号以及交点坐标;交点的位置信息relationInfo用来存储交点的位置信息,具体用来存储道路上的点索引编号及交点索引编号。
[0043] 本具体实施方式中,全局自相关指数计算的具体步骤如下:
[0044] 步骤1,将整个道路网标记为A,采用LineInfo来描述道路网中各单条道路的道路信息,赋给A中的每一条道路一个唯一编号标识,记为Li(i=1,2,…n),Li表示第i条道路的编号标识,n为道路网中道路数量;其中唯一的编号标识值Li由道路信息LineInfo中的id来标识。
[0045] 步骤2,Spark中driver节点向集群广播道路网A,excutor节点执行如下:
[0046] 2.1各个excutor节点分别计算任意两条道路之间的交点,在道路信息LineInfo的crossPoint中记录所计算出的交点信息。每个excutor节点完成一部分的交点计算。因为两条道路之间相交可能存在多个交点,所以crossPoints变量为List>类型,二元组Tuple的键为道路的编号,值为交点坐标。如,编号为1的道路与编号为2的道路相交于点a,点a的坐标为coordinateA,则对于道路1,crossPoints中的一个值为Tuple2<1,coordinate>;
[0047] 2.2各excutor节点从道路网获取每条道路的起止点、交点的坐标并排列,构建坐标序列;
[0048] 2.3各excutor节点以起止点、交点为分割点,将每条道路划分为多条路段,再将每条路段按照预设的线性单元长度分割为多个线性单元,不足一个线性单元长度的按照一个线性单元处理。
[0049] 步骤3,步骤2中excutor节点执行的结果发送给driver节点,driver节点将各线性单元按位置顺序存储入有序线性单元集中,再次向集群广播,excutor节点执行:
[0050] 3.1excutor节点根据crossPoint记录的交点坐标信息及segments中的线性单元编号构建路网拓扑结构,用于标识第i条道路Li的第k段线性单元lik与另一条道路Lj的第t段线性单元ljt之间的邻接关系;
[0051] 在构建路网结构的过程中,对segments中各线性单元的首尾节点进行顺次编号,第一个线性单元的首节点编号为0,尾节点编号为1,第二个线性单元的首节点编号为1,尾节点编号为2,第m个线性单元的首节点编号为m-1,尾节点编号为m。针对每个线性单元,结合crossPoints中信息和节点编号信息,即可完成路网拓扑结构intersections的构建。intersections中Map数组的键为当前LineInfo中交点编号,值为与该节点相交的其他LineInfo信息集合(可能有多条道路与一个节点相交),二元组Tuple的键为LineInfo编号,值为segments的节点编号。
[0052] 3.2excutor节点统计各线性单元的事件点总数;各excutor节点统计的各线性单元的事件点总数发送至driver节点;
[0053] 将每个线性单元的统计事件点数初始化为0,输入事件点集合,计算每个事件点与每条道路的距离,选择与事件点距离最短的道路Lmin,再分别计算该事件点与Lmin上每个线性单元的距离,如果该事件点与某线性单元距离最短,则在该线性单元的计数值上加1,计数值即统计事件点数;如果最短距离超过阈值范围,则表明此事件点不沿该道路分布,事件点无效,不作统计。阈值范围根据道路的密度而设定,当道路密度较大,则阈值范围的上下限均设为较小值;反之,则其上下限均设为较大值。
[0054] 步骤4,步骤3中excutor节点执行的结果发送给driver节点,driver节点向集群广播,excutor节点执行:每个excutor节点根据网络拓扑结构,得到每条道路Li上各段线性单元的邻接线性单元,并计算相应的空间权重。所述邻接线性单元指:对线性单元a,与其具有相同节点的所有其他线性单元,均为线性单元a的邻接线性单元。
[0055] 本发明路网约束下的空间权重主要采用近邻权重,即,相邻的线性单元权重为1,不相邻的线性单元权重为0。道路是否相邻按照最短网络距离来判断,主要有两种考虑方式:
[0056] 与线性单元具有相同节点的线性单元为相邻线性单元,其权重为1,其余权重为0,类似于空间邻近权重。见图5,线性单元5的端点为E和F,节点为E的线性单元有4,节点为F的线性单元有6、9、10,所以线性单元5的邻接单元为线性单元4、6、9、10,这些与线性单元5相邻的线性单元的权重为1,其他线性单元的权重为0。
[0057] 线性单元带宽范围内的线性单元为相邻线性单元。如图5权重图,假设线性单元长度为20米,带宽为40米,则距离线性单元40米范围内的线性单元为相邻线性单元。此时的距离为网络距离。如线性单元3的相邻线性单元为1、2、4、5。
[0058] 步骤5,在driver节点,基于空间权重矩阵,通过Spark中的累加器,根据公式(1):实现空间自相关指数I的计算,此处I为全局空间自相关指数,
其中xi是线性单元i的事件统计值,i为线性单元的编号,j为线性单元i对应的邻接单元编号,n为线性单元的总数, 和s分别是线性单元的事件统计值的平均值和标准差;wij是空间权重矩阵,具体来说wij表示线性单元i和j之间的权重,当线性单元j为线性单元i的邻接单元时,wij取1;否则,wij取0。
[0059] 步骤6,在Spark的每个分区,随机置换每个线性单元的统计事件点数,完成随机分布模拟,并计算自相关指数。
[0060] 步骤7,将步骤6重复m次,m为预设的最大迭代次数,一般取9~999;以重复m次后获得的一系列自相关指数作为随机分布,根据 检验自相关指数的显著性;其中,Z(I)为显著性检验指标,I为步骤5计算所得的自相关指数,E(I)、VAR(I)分别为m次重复计算所得一系列自相关指数的平均值和方差。
[0061] 随机置换包括全局随机置换和局部随机置换,全局随机置换的流程如下:
[0062] (1)将道路网广播到集群;
[0063] (2)在Executor节点的各个分区内,随机交换线性单元的统计事件点数;
[0064] (3)收集道路集合数据A,在Driver节点计算自相关指数。
[0065] 对于局部空间自相关指数计算,其和全局空间自相关指数计算相比,区别在于步骤5和步骤6。
[0066] 局部随机置换的流程如下:
[0067] (1)将道路网广播到集群;
[0068] (2)在Excutor节点,每个线性单元随机挑选p个线性单元的事件统计值作为邻接线性单元的事件统计值,模拟随机置换;例如线性单元5,其邻接的线性单元为线性单元1、2、3,所对应的事件统计值分别记为A1、A2、A3,为模拟随机置换,随机挑选线性单元5的3个邻接线性单元所对应的统计值,所挑选的3个线性单元可能包含线性单元1、2、3中的部分或不包含线性单元1、2、3,将所挑选的统计值分别作为线性单元1、2、3的统计值。本发明中,p一般取9、99、999等。
[0069] 对自相关指数技术,包括局部空间自相关指数计算和全局空间自相关指数计算。前文公式(1)为全局空间自相关指数计算公式,而局部空间自相关指数计算为:
[0070] 在driver节点,基于空间权重矩阵,通过Spark中的累加器,计算整体线性单元对应点事件统计值的平均值和标准差;此处,整体线性单元指全部的线性单元;
[0071] 在excutor节点,利用平均值和标准差,对每个线性单元的点事件统计值标准化;
[0072] 在excutor节点,得到各线性单元所对应的邻接线性单元的点事件统计值,具体参见步骤3,根据公式(2): 计算局部空间自相关指数Ii。
[0073] 应当理解的是,本说明书未详细阐述的部分均属于现有技术。
[0074] 应当理解的是,上述针对较佳实施例的描述较为详细,并不能因此而认为是对本发明专利保护范围的限制,本领域的普通技术人员在本发明的启示下,在不脱离本发明权利要求所保护的范围情况下,还可以做出替换或变形,均落入本发明的保护范围之内,本发明的请求保护范围应以所附权利要求为准。