摘 要:地理信息系统(GIS)的实际应用中,对城市道路最短路径的搜索一直是人们研究的重点。Dijkstra算法是最适合拓扑网络中两点间最短路径搜索的算法之一,但由于在城市里对道路最短路径搜索受到道路的畅通等原因所影响,故单纯利用Dijkstra算法并不能很好解决人们的实际需求。本文通过在GIS系统中增加一个设置、查询路障功能来解决以上提到的问题。
关键词:Dijkstra;算法;优化
1.引言
近年来,GIS被广泛的应用在城市管理等方面上,GIS最主要、最具体的任务是负责管理大型网状设施(如城市中的各类地下管线、交通线、通讯线路等),使得其对网络最短路径分析功能的需求日益增长。在对最短路径搜索的问题上,Dijkstra算法是综合各方面性能较好的算法之一。可在实际道路搜索中,最短路径的意义不仅是指地理上的最短距离,还应包括时间上的,即能用最短的时间到达目的路,这对安排抢险救援的路线尤其重要。本文针对城市应急中的最短路径分析进行了深入的研究,并提出了相应的解决办法。
2.Dijkstra算法的应用与实现
传统的Dijkstra算法将网络节点分为未标记结点、临时结点和永久标记结点三种类型。网络中所有结点首先初始化为未标记结点,在搜索过程中和最短路径结点相连通的节点为临时标记结点,每一次循环都是从临时标记结点中搜索距离源点路径长度最短的结点作为永久标记结点,直至找到目标结点或者所有结点都成为永久标记结点才结束算法。该算法能有效解决有向图中单个源点到其他顶点的最短路径问题。
在本文讨论的GIS中,用MapObjects实现的具体思路为:
(1) 在地图上获取一点,作为起点,并获取到该点的点对象FMoPoint。
(2) 以FMoPoint作为源点调用MO的方法对指定的单位图层搜索该点附近很小范围内的图元元素,搜索到的第一个图元元素作为起点的起始地址;若搜索不到,则把步骤(3)得到的道路名称作为起始地址。
(3) 以FMoPoint作为源点调用MO的方法搜索最短路径图层,找到距离原点最近的一条道路作为开始的道路。
具体的搜索的方法为:
①以某一指定的步长作为搜索范围的半径,搜索FMoPoint作为圆点的圆形范围;搜索的结果若为空,则增加步长的值,再重新开始搜索,直到搜索结果不为空。
②将搜索到的结果作为一个线段的集合,计算源点到每条线段的最短距离,距离源点最近的一条线段作为开始的线段(道路),并记录下该线段到源点距离最短的点作为FNode(开始结点)。
(4) 同理,在地图上获取第二点TMoPoint作为终点,并得到终点的地址,和终点(结束)的线段(道路)及TNode(结束结点)。
(5) 得到开始线段和结束线段后,计算出FNode到开始线段的两个端点的距离,TNode到结束线段两个端点的距离;因为FNode和TNode是作为临时创建的点,故要计算出所需的距离,用于最短距离计算。
(6) 以FNode作为起点,TNode作为终点,用Dijkstra算法对最短路径图层计算出最短路径来。
(7) 判断FMoPoint是否在开始线段上,如果不在则计算FMoPoint到FNode的距离;如果在,则计算实际的最短路径由FMoPoint经过开始线段的端点的距离。
(8) 同理,判断TMoPoint是否在结束线段上,并进行相应的处理。最后调整最短路径的实际距离。
最短路径计算结束。
3.改进的设计与实现
由于上述算法中得到只是行驶长度的最短路径,但在实际情况中,这个长度并不真正就意味着是救援者到现场的最优路径,因这其中还涉及到道路等级、路面状况等因素。为此本系统还增加了一个设置路障、查询路障的功能,使查找最短路径时能避开这些无效路径,从而得到实际中的最优路径。
实现的具体思路为:
(1) 首先得到要设置的道路,方法有两个:
①通过MO的方法用SQL语句来查询所要设置的道路。
②通过点取地图上的道路线段来获得所要设置的线段。实现为在地图上点一点,然后调用MO的搜索方法搜索该点附近的线段来获取要设置的线段。
(2) 得到要设置的道路线段后,通过MO的方法获得该线段两个端点的经纬度。计算这两点的经度值之差的绝对值(LongV)和纬度值之差的绝对值(LatV)。比较LongV和LatV的大小,如果LongV>LatV,那么认为该道路线段是沿着经度方向的,反之,则认为该道路线段是沿着纬度方向的。
(3) MO的每条线段都是点的集合,假定对应数组PointAry[i](i=0,1,2,……, PointCount-1),并且把PointAry[0]当作该线段的起点,把PointAry[PointCount-1]当作终点。如果起点的纬度值大于终点的纬度值,则该线段默认的纬度方向是从东向西,反之,则是从西向东。同理,如果起点的经度值大于终点的经度值,则该线段默认的经度方向是从北朝南,反之,则是从南朝北。
最短路径操作可分两步:
(1) 初始化最短路径的信息。
(2) 查找最短路径。
在步骤(1)中,初始化每条线段时,若在数据表里面有这条线段的路段信息,则开始判断路段类型的值;若是“路障道路”,则设置该线段的两个端点之间的双向距离都是无穷大。如果是“双行道”,则设置该线段的两个端点之间的双向距离为线段的实际的距离。如果是“单行道”,则再根据默认的线段方向的值,若是“经度方向”,则用默认的经度方向和路段设置的方向的值做比较;若是“纬度方向”,则用默认的纬度方向和路段设置的方向做比较。然后根据比较的结果,设置线段的两个端点之间的双向距离。
4.结论
本文探讨的最短路径问题,是依赖于一个具体的实际应用,针对采用单纯最短路径算法得到的只是理论上的距离最短,与现实应用中的需求有一定的差距,从而提出了一个新的观点,即在运用算法之前,先对实际路面情况进行查询,从而避免将一些无效道路作为节点插入其中,这样既可以有效的提高了算法的效率,所得结果也能更满足人们的实际需求。
参考文献:
[1]王一军,罗大庸,张航.城市应急最优路径算法.系统工程,2008,26(7)
[2]邬伦,张晶,刘瑜.地理信息系统:原理、方法和应用.科学出版社,2005,1
[3]陆峰.最短路径算法.分类体系与研究进展.测绘学报,2001,30(3)