专利名称:城际导航路径的计算方法
技术领域:
本发明涉及一种由中心通过无线传输对车台进行导航的中心导航系统,特别涉及了一种起点、终点位于不同城市内的城际导航路径的计算方法。
背景技术:
现有的中心导航系统(非公知的系统)已可处理起点、终点位于同一城市内的导航路径的计算。它能够实现的一个前提条件是路径计算只涉及一个城市的拓扑地图,也可称之为单拓扑导航。
理论上,将全国范围内所有省外、省内、城市外、城市内的道路都抽象记录到一个大型的拓扑地图中,可以继续使用单拓扑导航的方式进行城际导航的计算。但是,一系列数据表明这种做法仅具有理论意义,没有实际应用的价值。
根据中心导航目前为止最好的实验结果,目前在厦门市地图拓扑内使用原始的DijkStra算法,计算一条路径大约需要5秒左右,使用优化的DijkStra算法计算一条路径可以控制在10毫秒左右。而全国31个省、直辖市可能对应几百个城市,有些城市的交通路线可能比厦门市复杂100倍(如北京市),可以想象容纳了全国所有层次(全国、省、市)的交通道路拓扑数据的地图包含的顶点数和弧数可能是目前厦门图的上千倍、甚至上万倍。而各种DijkStra算法最佳的运行效率是与弧总量和顶点总量的乘积成线性关系,可以粗略地估计使用这种超大型的地图拓扑计算一条路径的时间可能在10000秒以上,这是系统不可能接受的在阐述什么是城际导航前,首先必须了解单拓扑导航的一般原理,因为本发明采取当前的实施方式和单拓扑导航所需要的计算环境有较强的联系。
1、概述单拓扑导航指起点、终点位于同一拓扑图(包含国家级、省级、市级拓扑地图,本文仅用市级拓扑示例)内的导航路径计算过程,使用较成熟的DijkStra算法(1959年迪克斯特拉提出的单源问题算法是最适合拓扑网络中两结点间最短路径搜索的算法之一)来计算最短路径。
2、DijkStra算法的基本数据结构DijkStra算法运行所需要的计算环境是一个“弧加权有向部分连通图”,主要包含一个顶点集和一个有向弧集,而有向弧上携带的权值就是对应道路的长度。下面给出一个具体的数据结构表示顶点数据结构 其中数据结构的描述如下(1)顶点数据结构说明(Point Record)Longitude———顶点经度Latitude———顶点纬度ArcIndex以此顶点为起点的第一条邻接弧在弧记录数组中的下标(2)弧数据结构说明(Arc Record)FirstPoint———弧的起点编号EndPoint——弧的终点编号Length———弧的长度NodeCount———构成弧的节点数量
NodeArray———构成弧的节点数组(3)弧上节点数据结构说明(ArcNode Record)(包括弧结点在内的整个弧的描述点)Lonitude——节点经度Latitude——节点纬度(4)最短路径点数据结构说明(DijkStra Point Record)Point ID———拓扑顶点的编号PrePoint——最短路径中此顶点的前点Shortest Len——源点到此顶点的最短路径长度3、DijkStra算法的算法思想DijkStra的的基本思路是从起点开始向外发散,每次选取必定是最短路径的通路到达某个顶点(不要求是指定的终点),依次求遍起点到其他各个顶点的最短路径,直到指定终点的最短路径被选出。
由于计算过程中起点唯一,终点不定,所以计算时,在顶点中应存放其前点的标识,而不能存放其后点的标识。因为在起点唯一的条件下,某顶点无论处于多少条最短路径上,其路径前点都是唯一的,反之则不确定。
反证如下设起点为S,终点为T1,T2S到T1,T2的最短路径都经过点O,则在S到T1,S到T2的最短路径上点O的前点,应该都是S到点O的最短路径上点O的前点,否则将S到T1,S到T2的最短路径上S到点O的部分替换成S到点O的最短路径,则S到T1,S到T2的最短路径将变得更短,违背了最短路径的定义。
4、DijkStra算法的实施过程与证明假设某地图拓扑A中有n个拓扑顶点C,A={Ci|1<=i<=n}再假设已知最短路径的顶点集合为X,未知最短路径的顶点集合为Y,起点为S,终点为T。
具体算法过程如下X={S}Y=A-X比较集合X中与S直接相邻的顶点的当前路径长度(起始时为无穷大)和S到这些点的有向弧长度,取其小者为新的当前长度,当前长度发生变化者同时还需修改其前点为S
while(true){取出集合Y中当前长度最小的顶点,若无,则失败退出循环;否则假设该点为C,则顶点C的最短路径已求出(证明见循环后)if(T==C)breakY=Y-{C}X=X+{C}比较集合X中与C直接相邻的顶点的当前路径长度(起始时为无穷大)和C的最短路径长度+C到这些点的有向弧长度,取其小者为新的当前长度,当前长度发生变化者同时修改其前点为C}假设C的当前路径长为dCurPathLen(C);若C的当前路径不是最短路径,则C的最短路径上必定含有集合Y中的其他点(由C的当前路径构造过程容易看出,此路径已是只经过集合X中的点到达C点的所有路径中的最短者,因此若此路径还不是C点的最短路径,则C点的最短路径必定含有集合Y中的其他点),假设为D,C的最短路径长dMinPathLen(C)=dMinPathLen(D)+d(D,C)其中d(D,C)是C的最短路径上点D到点C的路径长。
考虑到dCurPathLen(C)的选取方法,有dCurPathLen(C)<=dMinPath(D)<dMinPath(D)+d(D,C)=dMinPathLen(C)这显然与dMinPath(C)的定义相矛盾,所以dCurPathLen(C)即C的最短路径长,换句话说,C的最短路径已经求出。
由于求出最短路径时,保存了前点,所以只要从终点向起点回溯即可得到最短路径的具体组成。
5、拓扑覆盖与拓扑合成(1)临时拓扑从DijkStra算法过程看,参与计算的起点和终点必须是地图拓扑中的顶点,而导航请求仅仅给出了起终点的经纬度,不一定恰好是拓扑中的顶点,无法参与计算。基于此问题,需要计算实际起终点在地图拓扑中对应的顶点。
由于不能直接在原始地图拓扑中直接获取与实际起终点最近的顶点作为新的起终点(实际起终点可能位于某条有向道路弧的中段,离顶点较远),因此可能要求创建新的拓扑顶点,以及可能在原始地图拓扑的某些顶点上增减有向弧。
上述这些工作显然针对的是一次具体的导航计算,不像原始地图拓扑一样具有永久性,只能作为临时拓扑信息存在,下次计算时,必须删去。
(2)拓扑替换单从DijkStra算法求解的角度,直接在原始地图拓扑上增加新的顶点、增减有向弧有利于计算,可称为拓扑替换。
拓扑替换可以满足当前计算的要求,但对于下次导航计算没有贡献,原则上需要在计算完成后对原始地图拓扑进行恢复,整个恢复工作并不复杂,只要事先保存了被替换数据即可。
但是拓扑替换完全不适合单拓扑下多任务或多拓扑计算。
仅以单拓扑下多任务计算为例,在多线程同时计算的情况下,原始地图拓扑是作为多线程共享数据结构存在的,每个线程对它的读访问远远多于写访问,但任一线程的写访问会影响其他所有线程的读访问,维护数据的线程安全非常困难。这决定了直接修改原始地图拓扑是不可行的,因此提出以下拓扑覆盖的概念。
(3)拓扑覆盖拓扑覆盖借用类似虚函数的概念,使用对象指针动态决定计算时调用永久对象和临时对象。
把原先用于拓扑替换的临时拓扑顶点和新建顶点对象分离出来,在单个计算任务中内建一个小型的地图拓扑(最多仅仅包含3-4个拓扑顶点和数条有向道路弧)。对于新建的顶点在原始地图拓扑的基础上进行编号,对于用于替换的拓扑顶点则沿用其在原始地图拓扑中的编号。
这个内建的小型拓扑即是原始地图拓扑的一个部分覆盖,简称拓扑覆盖。
(4)拓扑覆盖的DijkStra算法实际中,使用DijkStra算法时,需要根据原始地图拓扑和拓扑覆盖中所有的顶点数,建立一个临时信息数组,主要用于存放顶点在拓扑中的编号、顶点对象指针、最短路径上顶点的前点编号以及最短路径长度Class CNavCalcTempInfo{//……intm_iTPPtNoCTPPoint* m_pTPPt;//拓扑顶点指针,直接访问BOOLm_bArrival;//是否已到达
Int m_iTPPtNoPrev;//前点在数组中的编号Double m_dPathLen;//当前最短路径长度//……}然后依次遍历原始地图拓扑的顶点和拓扑覆盖的顶点,将其中的拓扑顶点编号取作临时信息数组的下标,将当前顶点对象指针填入。临时拓扑中,新建的顶点的编号从原始地图拓扑中顶点编号最大值+1依次递增,用于覆盖的顶点的编号仍然沿用原编号,遍历完后,新建的顶点对象指针自动加载到临时信息数组末尾,而用于覆盖的顶点对象指针自动替换掉临时信息数组中原有顶点对象指针。
在计算过程中,当遍历某个顶点的所有有向弧时,获取弧所指向的顶点编号后,取作访问临时信息数组的下标,使用该下标访问到的临时信息中,没有被修改的顶点对象指针没有发生改变,仍然索引到原始地图拓扑中的某个顶点对象,被修改的顶点对象指针则被改为拓扑覆盖中对应顶点的对象指针,如此便可以自动访问到顶点对象的正确版本。
6、计算切割点的算法假设起点为S,切割点为C,地图拓扑为T,Ai为拓扑T中的第i条有向弧,Lij是弧Ai上的第j条有向直线段(这些直线段均由弧上相邻节点遵照弧的方向连接而成)。
一般情况下,切割点均定义为地图拓扑中所有弧上与指定点距离最短的点d(S,C)=min d(S,Ai),Ai∈Td(S,Ai)=min d(S,Lij),Lij∈Aid(S,Lij)的求法如下从起点S作Lij的垂线段,求出垂足,若垂足位于直线段上,则起点S到垂足的距离即为所求,否则求出起点S到直线段Lij的两端点的距离,取其中的较小值即为所求。
7、计算临时拓扑的算法计算完起点和终点的切割点后,可以作为新的起终点,同时它们都是拓扑顶点,符合DijkStra算法计算的要求。
一般地,如果切割点不与原始地图拓扑中的任一拓扑顶点重合的话,即需要将其创建成一个新的拓扑顶点,否则直接引用原拓扑中的顶点编号进行计算。
将切割点创建成临时的拓扑顶点的过程中,对于起点的切割点,需要创建指向切割点所在弧上其他顶点的有向弧,同时要保证新建的有向弧的方向与原有向弧一致(需要区分原有向弧是单线弧还是双线弧,如果是单线弧,要继续区分是否是单行道)。
(1)为起点的切割点建立相关的临时拓扑若起点的切割点即是原地图拓扑中的拓扑顶点,则无需为该切割点建立任何临时的拓扑信息。
当需要为起点的切割点建立相关的临时拓扑时,需要注意以下三点第一,只能建立以切割点为起点,以原始拓扑中切割点所在的有向弧的顶点为终点的有向弧;如图1所示,点B是点A在弧上直线段CD上的切割点(不是任何已有的拓扑点),则需要将点B创建为临时拓扑顶点。同时建立B点到C点D点的有向弧。
第二,新建的有向弧不能违背原始拓扑中的交通关系,即需要考察原始拓扑中切割点所在弧是双线弧还是单线弧,如果是单线弧,需要继续考察是否为单行道。
同样如图1,若弧是双线弧,或是拥有单行道标志的单线弧,则只能建立从B点到D的有向弧。
第三,若起点和终点落入原地图拓扑中的同一条弧上,并在交通关系限制下是在弧上是可直达的,需要多建立一条起点到终点的直达弧。
如图2所示,假设A点是起点,E点是终点,则需要建立切割点B到F的有向弧。
如果有向弧BF的方向被实际交通关系禁止时(指双线弧方向与BF的方向相反,或是单行道单线弧的方向和BF相反),则不能在临时拓扑中建立有向弧BF(2)为终点的切割点建立相关的临时拓扑与为起点的切割点建立相关的临时拓扑过程类似。
只能建立以切割点为终点,以原始拓扑中切割点所在的有向弧的顶点为起点的有向弧。
同样,建立的临时有向弧方向必须是原始地图拓扑中的交通关系所允许的。首先,必须承认单拓扑导航处理城际导航问题,也并非不可能做到,将少数几个省、市的拓扑数据结合在同一个拓扑地图中,即可使用单拓扑导航方法处理这些地区的城际导航问题,但必将失去灵活性和通用性,因为它仅仅适用于这几个省市。如果要处理各种省市之间的组合城际导航问题,将存在许多种不同的地图组合,而这些地图中必然存在重复的地图拓扑数据,造成大量的空间浪费,同时同步维护工作极为困难。
因此,如果需要继续沿用单拓扑导航的方法,为了达到通用的目的,同时避免空间浪费,只能将所有的全国范围内的所有省市的拓扑数据存放在一张超大型的拓扑地图中,但是显然带来了如下两个问题第一,编辑地图困难,不但无法分工编辑,同时由于数据量过大,地图拓扑对象的定位查找和整个拓扑的导出都将变得非常迟缓;第二,使用该地图计算时耗费大量的机器时间。原因是地图包含了大量的数据,关于这一点在上文中已有涉及。
发明内容
本发明的主要目的是提供一种城际导航的灵活、通用和高效计算方法,不需要进行大量的数据运算,使之满足实用的要求,以此为前提,甚至可以允许计算得到的城际导航路径是次优的最短路径。
本发明所述的一种城际导航路径的计算方法是,先判断并选出所有同时包含起终点的地图拓扑,从中选出级别最低的地图拓扑计算最短路径P,找出该路径P上起点城市的出边界点和终点城市的入边界点,然后对路径P进行裁剪,仅保留不属于起点城市和终点城市内的部分,将计算得到的起点城市的出边界点传给起点城市拓扑作为新的终点,对起点城市拓扑使用单拓扑导航算法计算市级的最短路径,然后加入到路径P的头部,同时将计算得到的终点城市的入边界点传给终点城市拓扑作为新的起点,对终点城市拓扑使用单拓扑导航算法计算市级的最短路径,然后加入到路径P的尾部,至此即可形成完整的城际导航最短路径。
本发明具体包括以下步骤步骤1创建一个最高层的路径计算任务指定起终点指定起点A和终点B,主要指在最高层计算任务中记录起终点的经纬度。
设置起终拓扑设置其起始拓扑TA为包含起点A的级别最低的地图拓扑,终止拓扑TB为包含终点B的级别最低的地图拓扑。
步骤2判断最高层计算任务的起终拓扑关系若起终点所在起始拓扑和终止拓扑不是同一地图拓扑,则进入下一步计算;若相同则直接转入步骤4。
步骤3计算最高层计算任务起终点的公共拓扑优先转化其中级别较低者,假设起点拓扑TA的级别较低,为TA创建一个起点计算子任务,起点仍为A,计算拓扑为TA,但终点暂不确定。同时将最高层计算任务中的起始拓扑转化为所属的高级拓扑后,转步骤2。
步骤4计算最高层计算任务的最短路径当最高层计算任务的起始拓扑和终止拓扑相同时,此时它的计算拓扑即可确定下来,此时可对最高层计算对象采用单拓扑导航DijkStra算法,计算起点A和终点计算最短路径P。
步骤5判断最高层对象是否存在起点计算子任务判断最高层对象是否存在起点计算子任务,如存在则从计算得到的路径P上搜索第一个出边界点作为起点计算子任务的新终点,并将路径P中第一个出边界点前的点全部删除。
步骤6判断最高层对象是否存在终点计算子任务如存在则从计算得到的路径P上搜索最后一个入边界点作为终点点计算子任务的新起点,并将路径P中最后一个入边界点后的点全部删除。
步骤7合并路径将起点计算子任务得到的路径加入的路径P被裁剪后部分的头部,即将路径中的点对象从尾部开始到头部逆序的方式逐个移动到路径P的头部;将终点计算子任务得到的路径加入到路径P被裁剪后部分的尾部,即将路径中的点对象从头部开始到尾部顺序逐个移动到路径P的尾部。
步骤8最终即可形成起点A到终点B的最短路径为避免地图拓扑中数据交叉重复、一副拓扑容纳过多的数据以及计算涉及海量的拓扑数据,拓扑地图必须要分级制作,如每一城市都应有自己独立的拓扑地图,各省也应有独立的拓扑地图,甚至全国范围内也必须有一副独立的地图拓扑,路径必须在包含较少拓扑数据的拓扑中计算。
考虑以下的情形,若要计算起终点位于不同城市内的最短路径,由于使用任何单个城市拓扑均不能解决问题,同时两个城市间无连通关系,因此若要计算从一城市到另一城市的最短路径,必须定义更高一级(可以理解为行政级别更高,并无差别)的地图拓扑来补充描述两个独立的城市拓扑之间的道路连通关系。
假设这两个城市位于同一省内,此时定义一省拓扑用于连通两个城市,则不管使用何方法,总能计算出一条最短路径;若两城市位于不同的省份,则分别需要各自所在省的地图拓扑和全国范围内的拓扑地图,全国拓扑地图用于连通两个省份的交通道路,而省级拓扑用于连通城市。
如此,计算起终点位于不同城市内的最短路径计算问题,仅仅需要加载相关的城市和省级拓扑,甚至是全国范围的地图拓扑,而无需加载与当前路径计算不相关的地图拓扑数据,可以减少DijkStra算法将要访问的数据总量和计算时间。
本发明规定的拓扑地图中总是主要包含当前行政级别的图上道路,而不过多包含其低级拓扑(省级拓扑是全国级拓扑的低级拓扑,市级拓扑是省级拓扑的低级拓扑)中的道路细节,举例说明假设城市C位于省份P内,则P省对应的拓扑地图中不应包含C市中所有的道路细节,而是必须包含P省内通过C市的主要干道(包括在这些干道上可能的转向)和C市本身的主要干道的拓扑数据。
其次,高一级拓扑地图中必须记录其干道通过其低级拓扑时产生的出入边界点,且必须与低级拓扑中对应与这些边界点的顶点在经纬度上有着高精确度的重合关系,同时这些点应选取在距离有转向的路口较远的地点。
最后,我们如下定义跨越多个不同拓扑地图的导航最短路径假设起点为A,所在最低级别的拓扑为TA,TA的出边界点为C,终点为B,所在最低级别的拓扑为TB,TB的入边界点为D,最短路径P(A,B)=P(A,C)+P(C,D)+P(D,B)即,城际导航的最短路径不是理论方式上的最短路径,而是多段最短路径的和,但一般地,城际导航过程中,位于城市外的道路长度总是远大于城市内的部分,这是实际中存在的规律(因为城市的范围尺度相对于省,全国而言是足够小的),求出C和D两个边界点之间的最短路径,应与理论上的最短路径基本吻合,然后结合城市内的最短路径得到的实际路径应该就是理论上的最短路径,这里我们使用了一个实践性的规律来避免了大量数据的同级计算,而是转化为了一个分级计算。
仔细分析上述思想,可以发现存在一个问题,即某一拓扑地图的出入边界点并不是唯一存在的,因此无法先行计算位于低级地图拓扑中的最短路径部分。
图1为现有的建立临时拓扑的示意图;图2为现有的建立临时拓扑的另一种示意图;图3为本发明的具体示意图。
具体实施例方式
为描述上的一致性起见,本发明仅针对位于同省内的不同城市之间的城际导航问题进行说明,对于不同省内的不同城市间的城际导航,可以使用本发明阐述的原理,同理推广到全国范围后即可解决。
首先判断同时包含起终点的地图拓扑,从中选出级别最低的地图拓扑(全国级、省级或市级)计算最短路径,如图3,由于起点A和终点B分处于两个不同城市拓扑中,但同属于省级拓扑T,此时无需在全国级拓扑中进行计算,直接在省级拓扑T中对起点A和终点B使用单拓扑导航计算过程,计算出一条路径P。由于在省图上路径P的起点在城市A中,终点在城市B中,起点A所在最低级别的拓扑为TA,TA的出边界点为C,终点为B,所在最低级别的拓扑为TB,TB的入边界点为D,最短路径P(A,B)=P(A,C)+P(C,D)+P(D,B),容易得知路径P上必定存在起点城市TA的出边界点和终点城市TB的入边界点,进一步明确地说,路径P的第一个出边界点必定是城市TA的出边界点C,最后一个入边界点是城市TB的入边界点D,至于路径P上介于第一个出边界点和最后一个入边界点之间的边界点则可能是路径P穿过其他城市时的边界点。
由于省级拓扑不记录其所包含城市内的详细道路拓扑数据,只用于描述省内各城市之间的连通关系和市内干道,因此路径P位于起点城市TA和终点城市TB内的部分路径可能并不符合实际道路行驶情况,以此必须舍弃,即对路径P进行裁剪,仅保留不属于起点城市TA和终点城市TB内的部分。此处需要指出的是,不得裁剪路径P行经其他城市中的部分,因为系统默认车辆自某一城市TA到达另一城市TB时,中途穿过其他城市时,只选择中途城市中的干道行驶,而省级拓扑已记录城市的干道。
由于市级拓扑较详尽地记录了市内道路拓扑数据,因此将省级计算得到的起点城市TA的出边界点C传给起点城市拓扑TA作为新的终点,对TA使用单拓扑导航算法计算市级的最短路径,然后加入到路径P的头部,同时将省级计算得到的终点城市TB的入边界点D传给终点城市拓扑TB作为新的起点,对TB使用单拓扑导航算法计算市级的最短路径,然后加入到路径P的尾部,至此即可形成完整的城际导航最短路径。
本发明具体的计算步骤如下步骤1创建一个最高层的路径计算任务1、指定起终点指定起点A和终点B,主要指在最高层计算任务中记录起终点的经纬度。
2、设置起终拓扑设置其起始拓扑TA为包含起点A的级别最低的地图拓扑,终止拓扑TB为包含终点B的级别最低的地图拓扑。
这里需要特别指出的是包含某点的级别最低的地图拓扑应如下理解首先是与地图拓扑本身一同被记录的地图拓扑的区域(一组首尾相连的闭合折线围成的部分),测试点在拓扑内即测试点在拓扑的区域内,此算法是计算机图形学中的公知算法,具体编程时,可使用微软MFC类库中提供的CRgn类,也可以自行编程实现;其次级别指的是地图拓扑的行政级别,一般地将国家级地图拓扑的级别定义成最高,省级地图拓扑的级别次高,而城市级地图拓扑的级别最低,根据点在区域内的测试,可能国家级地图拓扑、某省级地图拓扑和某市级地图拓扑都包含此点,但此处必须取其中级别最低者,因为级别越低描述的道路细节越清晰(级别需作为一个属性存放在地图拓扑对象中)。
步骤2判断最高层计算任务的起终拓扑关系由于起终点所在起始拓扑和终止拓扑并不一定是同一地图拓扑,如果不相同,则无法直接进行DijkStra单源最短路径的计算,需要进入下一步计算;若相同则直接转入步骤4。
此处同样要补充说明的是,如何判断地图拓扑是否相同,从非编程的角度看,创建地图拓扑磁盘文件数据时,必须为每个拓扑规定一个唯一性的标识(我们采取是国家定义的行政区划编号,这是公知数据),拓扑之间直接根据此标识来判断是否相同;从编程的角度看,地图拓扑对象加载到内存中时,必定占用不同的内存空间,亦可使用地图拓扑对象的首地址来直接判断地图拓扑对象是否相同。
步骤3计算最高层计算任务起终点的公共拓扑1、由于最高层计算任务的起终拓扑不相同,无法直接在某个拓扑中计算起终点之间的最短路径,需要查找同时包含起终点的地图拓扑,方可进行计算。
2、优先转化其中级别较低者假设起点拓扑TA的级别较低,为TA创建一个起点计算子任务,起点仍为A,计算拓扑为TA,但终点暂不确定。同时将最高层计算任务中的起始拓扑转化为所属的高级拓扑后,转步骤2。
计算子任务的结构与最高级计算任务相同,除去上述需要修改的数据外,其他数据直接从最高级地图拓扑中复制继承。
计算子任务创建完成后,需要正确的挂接在最高级计算任务的某个分支上,假设是起点计算子任务,做法如下首先将最高级地图拓扑原有的起点计算子任务(如果该子任务存在)挂接在新创建的起点计算子任务的起始分支上,然后将自身挂接在最高计算任务的起始分支上。
对于终点计算分支可以同理进行。另外,从编程的角度而言,计算任务的挂接可以通过将计算子任务的指针交由上层计算任务保存来完成。
步骤4计算最高层计算任务的最短路径1、当最高层计算任务的起始拓扑和终止拓扑相同时,此时它的计算拓扑即可确定下来,此时可对最高层计算对象采用单拓扑导航DijkStra算法,计算起点A和终点计算最短路径P。
2、单拓扑导航DijkStra算法的理论如前所述由于此时的起终点仅仅只有经纬度数据,只有地理意义,与计算拓扑尚未有任何拓扑关系,不能直接进行DijkStra计算。
因此首先需要使用前述理论中“计算切割点的算法”来确定起终点在计算拓扑中对应的拓扑位置。计算完成后此拓扑位置应包含切割点的经纬度、所在的弧编号、及具体位于构成弧的折线段的哪条直线段上。
切割点计算完成后使用前述理论中“计算临时拓扑的算法”来建立真正可用于DijkStra计算的临时计算拓扑,简单做法是,将切割点创建成新的拓扑路口点,其编号从整个地图拓扑最大的拓扑路口点编+1开始;取出切割点所在弧的首尾两个路口点,创建它们的覆盖拓扑路口点(因为它们将受到从切割点创建的拓扑路口点的影响),除切割点所在的弧外,从原始的拓扑点上复制继承剩下所有的弧,最后再建立它们与切割点生成的新拓扑路口点之间的连通弧。
建立了临时计算拓扑后,需要应用前述拓扑覆盖的原理,为DijkStra计算创建一个临时计算信息表,目的是索引计算所需要的拓扑数据和暂时保存计算过程中产生的临时结果。
确切的例子如下Class CNavCalcTempInfo{//……int m_iTPPtNoCTPPoint* m_pTPPt;//拓扑顶点指针,直接访问BOOLm_bArrival;//是否已有最短路径到达Int m_iTPPtNoPrev;//前点在数组中的编号Doublem_dPathLen;//当前路径长度//……}可以创建上述结构的一个数组来描述临时计算信息表,其长度最大为原始地图拓扑中所有拓扑路口点数和临时计算拓扑中新创建的拓扑路口点数之和。
最后将临时计算拓扑中拓扑路口点的指针索引填入到临时计算信息表中,其中尤其值得注意的是将路口点编号与数组元素下标用一一对应(相等关系)起来,将路口点对象的指针索引填入数组元素的m_pTPPt字段中,相同路口点编号的拓扑路口点对象,需要重复覆盖地填入(临时新建的路口点对象指针索引覆盖原始拓扑路口点的指针索引)。索引数据填入完成后,初始化临时计算信息表,使得除起始拓扑路口点外,其他剩余所有点的最短路径到达标志都是FALSE(假),最短路径前点编号和当前路径长度都取无效值。
3、当一切计算准备完成后,开始进行DijkStra计算首先将起始拓扑路口点能通过有向弧索引到的拓扑路口点的前点编号填为起始拓扑路口点的编号,当前路径长度填为各自有向弧的长度,是否已有最短路径到达标志不变,然后开始循环过程。
循环{在临时计算信息数组中遍历,查找尚未有最短路径到达,但当前路径长度有效的点,取其中当前路径长度最短的拓扑路口点若未找到,表示起点到终点不存在可通路径,然后中断循环若已查找到,则当前找到的拓扑路口点的最短路径已求出(原因参见前面的原理部分)。
若当前找到的拓扑路口点即终止拓扑路口点,表示起点到终点的最短路径已求得,中断循环。
否则,检查当前拓扑路口点能通过有向弧索引到的拓扑路口点的当前路径长度,若无效则其前点编号填为当前拓扑路口点的编号,其当前路径长度填为各自有向弧的长度+当前拓扑路口点的当前最短路径长度,是否已有最短路径到达标志不变,然后继续循环过程;若有效,比较其当前路径长度与通过当前拓扑路口点后直接到达的路径长度,若前者较大,处理同前面当前路径长度无效时的情形。
}由于拓扑路口点有限,故有限次后,此循环过程停止。
步骤5判断最高层对象是否存在起点计算子任务判断最高层对象是否存在起点计算子任务,如存在则从计算得到的路径P上搜索第一个出边界点作为起点计算子任务的新终点,并将路径P中第一个出边界点前的点全部删除;此步骤涉及三个较重要的概念如何判断是否存在起点计算子任务?从程序编制的角度看,可以认为索引起点计算子任务的指针不为空,即表示存在起点计算子任务;如何搜索边界点?一般地,某级地图拓扑必须保存其包含的低级拓扑的所有出入边界点的信息,这要求地图制作和加载的时候将这个信息以某些位标志的方式记录在拓扑路口点的属性中。
将路径P中第一个出边界点前的点全部删除是因为此部分将被低级拓扑中计算得到的细节更清晰的路径代替,因此必须删除(由于路径是以所经过点的链表方式保存的,删除即指从链表中移除这些点对象)步骤6判断最高层对象是否存在终点计算子任务如存在则从计算得到的路径P上搜索最后一个入边界点作为终点点计算子任务的新起点,并将路径P中最后一个入边界点后的点全部删除;其具体解释同上。
步骤7合并路径将起点计算子任务得到的路径加入的路径P被裁剪后部分的头部,即将路径中的点对象从尾部开始到头部逆序的方式逐个移动到路径P的头部;将终点计算子任务得到的路径加入到路径P被裁剪后部分的尾部,即将路径中的点对象从头部开始到尾部顺序逐个移动到路径P的尾部;步骤8最终即可形成起点A到终点B的最短路径由于拓扑地图总数有限,且转化是按拓扑等级不断升高单向进行的,因此有限次后,转化过程必定停止。
最终可能得到两个结果,第一,不能找到某一拓扑地图同时包含起终点,此时表示起终点间无通路,计算最短路径失败;第二,找到一拓扑地图同时包含起终点,此时在可以此拓扑地图上计算出最短路径。
权利要求
1.一种城际导航路径的计算方法,其特征在于先判断并选出所有同时包含起终点的地图拓扑,从中选出级别最低的地图拓扑计算最短路径P,找出该路径P上起点城市的出边界点和终点城市的入边界点,然后对路径P进行裁剪,仅保留不属于起点城市和终点城市内的部分,将计算得到的起点城市的出边界点传给起点城市拓扑作为新的终点,对起点城市拓扑使用单拓扑导航算法计算市级的最短路径,然后加入到路径P的头部,同时将计算得到的终点城市的入边界点传给终点城市拓扑作为新的起点,对终点城市拓扑使用单拓扑导航算法计算市级的最短路径,然后加入到路径P的尾部,至此即可形成完整的城际导航最短路径。
2.如权利要求1所述的一种城际导航路径的计算方法,具体包括以下步骤步骤1创建一个最高层的路径计算任务指定起终点指定起点A和终点B,主要指在最高层计算任务中记录起终点的经纬度。设置起终拓扑设置其起始拓扑TA为包含起点A的级别最低的地图拓扑,终止拓扑TB为包含终点B的级别最低的地图拓扑;步骤2判断最高层计算任务的起终拓扑关系如果起终点所在起始拓扑和终止拓扑并不是同一地图拓扑,则进入下一步计算;若相同则直接转入步骤4;步骤3计算最高层计算任务起终点的公共拓扑优先转化其中级别较低者,假设起点拓扑TA的级别较低,为TA创建一个起点计算子任务,起点仍为A,计算拓扑为TA,但终点暂不确定。同时将最高层计算任务中的起始拓扑转化为所属的高级拓扑后,转步骤2;步骤4计算最高层计算任务的最短路径当最高层计算任务的起始拓扑和终止拓扑相同时,此时它的计算拓扑即可确定下来,此时可对最高层计算对象采用单拓扑导航DijkStra算法,计算起点A和终点计算最短路径P;步骤5判断最高层对象是否存在起点计算子任务判断最高层对象是否存在起点计算子任务,如存在则从计算得到的路径P上搜索第一个出边界点作为起点计算子任务的新终点,并将路径P中第一出边界点前的点全部删除;步骤6判断最高层对象是否存在终点计算子任务如存在则从计算得到的路径P上搜索最后一个入边界点作为终点点计算子任务的新起点,并将路径P中最后一个入边界点后的点全部删除;步骤7合并路径将起点计算子任务得到的路径加入的路径P被裁剪后部分的头部,即将路径中的点对象从尾部开始到头部逆序的方式逐个移动到路径P的头部,将终点计算子任务得到的路径加入到路径P被裁剪后部分的尾部,即将路径中的点对象从头部开始到尾部顺序逐个移动到路径P的尾部;步骤8最终即可形成起点A到终点B的最短路径。
全文摘要
本发明涉及一种城际导航路径的计算方法,先判断并选出所有同时包含起终点的地图拓扑,从中选出级别最低的地图拓扑计算最短路径P,找出该路径P上起点城市的出边界点和终点城市的入边界点,然后对路径P进行裁剪,仅保留不属于起点城市和终点城市内的部分,将起点城市的出边界点传给起点城市拓扑作为新的终点,对起点城市拓扑使用单拓扑导航算法计算市级的最短路径,然后加入到路径P的头部,同时将终点城市的入边界点传给终点城市拓扑作为新的起点,对终点城市拓扑使用单拓扑导航算法计算市级的最短路径,然后加入到路径P的尾部,至此即可形成完整的城际导航最短路径。利用该种方法不需要进行大量的数据运算,使之满足实用的要求。
文档编号G06F17/00GK1796942SQ200410155550
公开日2006年7月5日 申请日期2004年12月21日 优先权日2004年12月21日
发明者时宜, 涂高元, 邱志斌, 陈典全, 许宁, 余建成 申请人:厦门雅迅网络股份有限公司