1.基于方向约束的路网连续K近邻查询方法,包括如下步骤:
1初始时刻K近邻查询;
初始时刻K近邻查询用于确定指定时间段[ti,tj]起始时刻朝向查询点运动的K个近邻对象;该阶段采用路网扩展的方式确定K近邻,并加入方向判定算法,保证这K个近邻都是朝向查询点运动的;具体包括:
11)采用路网扩展的方法;将查询点作为路网的一个节点加入到局部路网中,利用DijKstra算法预计算各个路网节点到查询点的单源最短路网距离,同时得到一个基于路网距离升序排列的路网节点扩展优先级队列;按照该优先级队列的次序依次进行路网节点的扩展,每扩展一个节点,就处理该节点所有未访问过的邻接边上的所有移动对象,直到获得最近的K个朝向查询点的移动对象;
12)移动对象方向判断;在上述的路网扩展过程中,每访问当前扩展节点的一条邻接边,就对该邻接边的移动对象进行一次判断;采用的方法是将当前扩展的节点也看成是“移动”的,它的移动方向是顺着路网扩展的方向;比如路网节点nodei扩展后,所访问的邻接边的对顶点是节点nodej,那么nodei的“移动”方向就是nodei指向nodej的方向;如果移动对象运动方向与扩展节点的运动方向不一致,那么就认为这个移动对象是朝向查询点移动的;
13)将前两步得到的K个朝向查询点运动的近邻对象加入结果集,假设由近及远K个对象为:p1,p2…pk,所以结果集为:Result={p1,p2…pk},其中pk为最远近邻;
2获取需要监测的候选对象;
该阶段是为了获取连续查询的监测范围,如果针对全局路网进行监测,会有大量无效的计算增大了算法开销;本方法使用监测范围进行剪枝,过滤掉不可能是结果的移动对象,只有处于监测范围内的移动对象才有可能成为最终的连续K近邻查询结果;根据上一小节获取到的K个近邻计算出监测距离,然后构建局部路网,并在局部路网内获取到候选对象集合;具体包括:
21)计算监测距离(MD);在指定的查询时间段内,只有距离查询点的路网距离小于MD的对象才有可能影响查询结果;MD的计算公式如下:MDq(ti,tj)=NDq,pk(ti)+q.s*(tj‑ti)+AD (1)
AD=max{e.s*(tj‑ti)}(e∈E) (2)
式中ti,tj表示指定查询时间段的起始终止时刻,NDq,pk(ti)表示起始时刻查询到的K近邻中最远近邻pk到查询点的距离,q.s*(tj‑ti)表示该时间段内查询点的移动距离;前两项表示查询结果集中对象距查询点的最远距离,如果存在对象在时间段内到查询点的距离小于NDq,pk(ti)+q.s*(tj‑ti),则说明该对象有可能取代结果集中对象,应当监测该对象的移动;从查询点扩展NDq,pk(ti)+q.s*(tj‑ti)长度的路网距离所到达的路段也就是候选对象有可能出现的路段集合,使用E表示;AD表示候选对象可能移动的最大距离;
22)获取候选对象;将距离查询点小于MD的路段定义为影响边,并参与构建局部路网,局部路网中包含了需要监测的对象信息,连续K近邻查询结果一定在局部路网之内;然后从查询点开始进行路网扩展,将距离查询点小于MD且朝向查询点运动的对象添加入候选对象集合,用于后续验证;
3验证候选对象,完成连续KNN查询;
候选对象有可能在[ti,tj]时间段内的某一时刻取代ti时刻的K近邻中的最远近邻pk,该阶段的目的是确定结果集改变的时间点,然后进行时间段划分并更新结果集,保证了每个子时间段内的任意时刻查询结果都是一样的;
31)第一次时间段划分;路网距离的计算与对象所在路段有关,根据候选对象到达路段节点的时刻进行时间段划分,保证每个时间段内所有对象都不会改变其所在路段,该步骤也确保路网距离计算的准确性;
32)第二次时间段划分;假设有一候选对象p′到查询点距离等于pk到查询点的距离,则p′有可能成为结果集中新的pk;针对每一个需要划分的时间片[tm,tn],起始时刻的结果集已知,通过等式NDq,pk(t)=NDq,p′(t)可以得到p′取代pk的时间点t,若tm
连续K近邻的查询为一个时间段对应一个结果集Res,表示该时间段内的任意时刻的K近邻结果都是Res。