最新浅谈GIS中网络分析与最短路径的实现Word文档格式.docx
《最新浅谈GIS中网络分析与最短路径的实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《最新浅谈GIS中网络分析与最短路径的实现Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
1.引言
随着地理信息系统产业的建立和数字化信息产品在全世界的普及,地理信息系统已经深入到各行各业。
其中,网络分析是地理信息系统(GIS)最主要的功能之一。
对地理网络(如交通网络)、城市基础设施网络(如各种网线、电力网线、电话网线、供排水网线等)进行地理分析和模型化,是地理信息系统中网络分析的主要目的。
近几年来面向社会的GIS应用开发不断增多,逐渐形成以MapObject和MapGuide为主流的GIS应用开发体系,但这两个系统都没有现成的网络分析功能,只有通过二次开发才能实现MapObject和MapGuide的网络分析功能
。
网络分析中最基本最关键的问题是最短路径问题。
最短路径不仅仅指一般地理意义上的距离最短,还可以引申到其他的度量,如时间、费用、线路容量等。
相应地,最短路径问题就成为最快路径问题、最低费用问题等。
其实,无论是距离最短、时间最快还是费用最低,它们的核心算法都是最短路径算法。
最短路径的求解,必须把现实生活中的道路、管线等各种网络抽象成一种数学结构,这种抽象出来的数学结构被称为网络拓扑结构。
于是各种网络分析技术实现的关键在于网络拓扑结构的建立和高效能最短路径算法。
下面我就分别从这两方面讨论起。
2.网络拓扑关系的建立
网络分析是空间分析的一个重要方面,是依据网络拓扑关系(线性实体之间、线性实体与结点之间、结点与结点之间的连结、联通关系),并通过考察网络元素的空间、属性数据,对网络的性能特征进行多方面的分析计算
对地理网络、城市基础设施网络进行地理分析和模型化的关键技术是用什么样的方式抽象出网络拓扑结构,及节点与节点的连通关系,并对网络拓扑结构进行高效能访问。
2.1网络数据模型的基本概念
网络是由若干线性实体互连而成的一个系统,资源由网络来传输,实体间的联络也由网络来达成。
网络数据模型是真实世界中网络系统(如交通网、通讯网、自来水网等)的抽象表示。
构成网络的基本元素是上述线性实体以及这些实体的连结交汇点
前者被称为网线或链(link),后者一般称为结点(node)。
网线构成网络的骨架,是资源传输或通讯网络的通道,可以代表公路、铁路、航线、水管、河流等;
结点是网线的端点,又是网线的交汇点,可以表示交叉路口、中转站、河流汇合点等。
除了上述基本网络元素之外,网络还可能有若干附属元素,如在路径分析中用来表示途径地点的站点;
在资源分配中用来表示资源发散地点或资源汇聚地点的中心;
对资源传输或通讯网络起阻断作用的障碍等。
针对网络分析的需要,作为网络基本元素的网线或结点除自身的常规属性外,还要具有一些特殊属性的数据。
比如,为了实施路径分析和资源分配,网线数据应包含正反两个方面上的阻碍度以及资源需求量,而节点数据也应该包含资源需求量。
2.2网络拓扑关系的获取
GIS中的数据(如道路、管网、水系等)要进行最短路径的计算,就必须首先将其按结点和边的关系抽象为图的结构,这在GIS中称为构建网络的拓扑关系。
只有建立了拓扑关系,我们才能进行网络路径分析。
在GIS系统拓扑数据结构中,通常具有如下三种重要的拓扑形式:
说明线串如何相连的连通性,即线串是在结点上相互连接的。
多边形是由一系列相连通的线串组成的。
记录多边形的相邻信息已表示拓扑结构的连续性是根据线串的走向,可以决定谁是左多边形。
同时,量多变形之所以相邻是因为二者具有共同的边界。
为了能够更好的描述路网拓扑结构的建立过程,首先介绍一下描述路网的基本要素及各要素的属性。
描述路网的基本要素:
点对象:
路网中道路和道路的交叉点以及道路的端点。
先对象:
用弧或链表示路段,形成路段的基本规则是:
道路的所有车道合在一起,两结点之间的部分形成一个路段。
面对像:
有路段线围成的封闭区域。
相关路网要素的属性:
路段标识符(用编号表示)
起、终点标识符(用编号表示)
路段名称
路段长度
道路类别
结点表示符号
结点坐标
通常,可以用赋权图来表示路网。
具体做法是分别存储点状实体——结点,线状实体——两点间的路段,结点和路段的属性信息,以及实体间的拓扑关系(主要是连通性和方向性)。
这样从图论的角度看,便将路网转化为一个图。
进一步还可以在每一条边上定义权,这样便得到了一个赋权图。
从而,确定某两地间的最优路线问题便可以转化为在赋权图上求两点间的最短路径问题。
对于矢量图形的拓扑关系的描述,主要有基于网路的拓扑模型和基于点集拓扑理论的拓扑模型
基于网络的拓扑模型具有直观、结构清晰、互换性强、便于组织存储等优点。
路网拓扑关系主要讨论线与线之间的联通性关系,即将其按结点和边的关系抽象为图的结构,这在GIS中称为构建网络的拓扑关系,在计算机中这种拓扑关系与面无关,拓扑关系中只记录了线与结点的关系,而没有线与面的关系,所以不是完备的拓扑关系。
路网拓扑结构主要包括两种对象,结点(Node)对象和边(Link)对象。
结点对象主要包括结点序号,结点属性和它附近的相关信息,及与之相连接的编序号;
边对象应包括编序号,长度信息,两个端点序号。
根据结点对象相连接的边序号和边对象的两个端点序号,就建立了结点之间的连接特性。
路网的拓扑结构的生成主要找出各路段之间的直接连通性,实现算法是找出相应图层中的所有线图元,然后判断任意两线图元是否相交,根据交点和顶点得到结点,根据橡胶关系判断两条边是否直接相连接,再根据相关信息对相应边赋权值,利用拓扑得到的带权图来查询最短路径。
拓扑结构的建立过程表示为图2.1的流程图。
图2.1拓扑关系建立过程流程图
3.最短路径算法
由于网络特征的复杂性和问题的不同特征,最短路径的算法也表现出多样性。
但总的来说可以按问题的类型、网络特征和实现的算法进行分类,其中最经典,应用最广泛的的还是Dijkstra算法。
在实际应用当中,应该根据不同问题的类型选择适合于该问题的算法。
3.1算法选择
最短路径算法选取的原则一般包括:
1.算法速度快;
2.算法占用资源少;
3.算法稳定性强。
据统计,目前提出来的最短路径算法大约有17种,F.BenJiama等人对其中的15种进行了测试,结果显示有三种效果比较好,他们分别是TQQ(graphgrowthwithtoqueues)、DKA(theDijkstra’salgorithmwithapproximatebuckets)、以及DKD(theDijkstra’simplementedwithdoublebuckets)。
其中TQQ算法的基础是图增长理论,较适合于单点到其他各点的最短距离;
后两种算法则都是基于Dijkstra的算法,较适合于计算两点间最短距离
目前多数系统解决最短路径问题采用的是Dijkstra算法为理论基础,只是不同系统对Dijkstra算法采用了不同的实现方法。
针对不同的网络特征、应用需求及具体的硬件环境,各种算法在时间复杂度、空间复杂度、实的难易程度等方面各具特色。
3.2传统Dijkstra算法的主要思想
Dijkstra算法的基本思路是:
假设每个顶点都有一对标号
,其中
是从起点s到终点j的最短路径长度;
则是从s到j的最短路径中s的前一点。
求解从s到j的最短路径的算法的基本过程如下:
初始化。
起始点设置为:
①
,
为空;
②所有其它点:
∞,
=?
;
③标记起始点s,计k=s,其它所有点设为为标记的。
检验从所有以标记的点k到其直接连接的标记点j的距离,并设置:
式中,
是从点k到j的直接连接距离。
选取下一个点。
从所有为标记的结点中,选取
中最小的一个i:
点i就被选为最短路径中的一点,并设为以标记的。
找到点i的前一点。
从以标记的点中找到直接连接到点i的点
,作为前一点,设置:
标记点i。
如果所有点以标记,则算法完全退出,否则,记k=i,转到2)在继续。
3.3经典Dijkstra算法的实现
首先,引进一个辅助向量D,它的每个分量D表示当前所找到的从始点v到每个终点vi的最短路径的长度。
如D[3]=2表示从始点v到终点3的路径相对最小长度为2。
这里强调相对就是说在算法过程中D的值是在不断逼近最终结果但在过程中不一定就等于最短路径长度。
它的初始状态为:
若从v到vi有弧,则D为弧上的权值;
否则置D为∞。
显然,长度为D[j]=Min{D|vi∈V}的路径就是从v出发的长度最短的一条最短路径。
此路径为(v,vj)。
那么,下一条长度次短的最短路径是哪一条呢?
假设该次短路径的终点是vk,则可想而知,这条路径或者是(v,vk),或者是(v,vj,vk)。
它的长度或者是从v到vk的弧上的权值,或者是D[j]和从vj到vk的弧上的权值之和。
一般情况下,假设S为已求得最短路径的终点的集合,则可证明:
下一条最短路径(设其终点为X)或者是弧(v,x),或者是中间只经过S中的顶点而最后到达顶点X的路径。
因此,下一条长度次短的最短路径的长度必是D[j]=Min{D|vi∈V-S}其中,D或者是弧(v,vi)上的权值,或者是D[k](vk∈S)和弧(vk,vi)上的权值之和。
迪杰斯特拉算法描述如下:
1)arcs表示弧上的权值。
若不存在,则置arcs为∞(在本程序中为MAXCOST)。
S为已找到从v出发的最短路径的终点的集合,初始状态为空集。
那么,从v出发到图上其余各顶点vi可能达到的最短路径长度的初值为D=arcs[LocateVex(G,v),i]vi∈V2)选择vj,使得D[j]=Min{D|vi∈V-S}3)修改从v出发到集合V-S上任一顶点vk可达的最短路径长度
下面为用C语言描叙的迪杰斯特拉算法:
voidShortestPath_DIJ(MGraphG,intv0,PathMatrix&
P,ShortPathtable&
D)
{
//用Dijkstra算法求有向图G的v0顶点到其余v的最短路径P[v]及其带权长度D[V]
//若P[v][w]为true,那么w是从v0到v当前求得最短路径上的点
//final[v]为true当且仅当v属于s,即已经求得从v0到v的最短路径
for(v=0;
v<
G.vexnum;
v++)
{
final[v]=false;
D[v]=G.arcs[v0][v];
for(w=0;
w<
w++)
P[v][w]=false;
//设置空路径
if(D[v]<
infinity)
P[v][v0]=true;
P[v][v]=true;
}
}
D[v0]=0;
final[v0]=true;
//开始主循环,每次求得v0到某个v定点的最短路径,并且加v入到s集
for(i=1;
i<
i++)
min=infinity;