📄 gis中最短路径的实现 - kaixin110 - 博客园.htm
字号:
href="http://www.cnblogs.com/kaixin110/archive/2007/08/03/841858.html">2. 邯郸机场全天候对外开放8月8日为“首航日”(1184)</A>
<LI><A id=TopViewPosts1_TopList_ctl03_Hyperlink1
href="http://www.cnblogs.com/kaixin110/archive/2007/07/31/837463.html">3. 公交路线查询算法(719)</A>
<LI><A id=TopViewPosts1_TopList_ctl04_Hyperlink1
href="http://www.cnblogs.com/kaixin110/archive/2007/06/29/799844.html">4. 主流WebGIS实现的原理.矢量地图(550)</A>
<LI><A id=TopViewPosts1_TopList_ctl05_Hyperlink1
href="http://www.cnblogs.com/kaixin110/archive/2007/08/10/850805.html">5. GIS中最短路径的实现(419)</A>
</LI></UL></DIV>
<H3>评论排行榜</H3>
<DIV class=RecentComment>
<UL style="WIDTH: 100%; WORD-BREAK: break-all">
<LI><A id=TopFeedbackPosts1_TopList_ctl01_Hyperlink1
href="http://www.cnblogs.com/kaixin110/archive/2007/08/03/841858.html">1. 邯郸机场全天候对外开放8月8日为“首航日”(24)</A>
<LI><A id=TopFeedbackPosts1_TopList_ctl02_Hyperlink1
href="http://www.cnblogs.com/kaixin110/archive/2007/07/06/807878.html">2. 公交礼仪标兵接受乘客点评(10)</A>
</LI></UL></DIV></DIV>
<DIV id=main>
<DIV class=post>
<H2><A id=viewpost1_TitleUrl
href="http://www.cnblogs.com/kaixin110/archive/2007/08/10/850805.html">GIS中最短路径的实现</A>
</H2>
<TABLE cellSpacing=0 cellPadding=0 width=778 border=0>
<TBODY>
<TR>
<TD vAlign=top width=569 height=398>
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width=520 border=0>
<TBODY>
<TR>
<TD height=379>
<P align=center><SPAN class=main><FONT
size=3><STRONG>GIS中最短路径的实现</STRONG></FONT><BR> <BR>张燕,付仲良
,黄庆彬</SPAN></P>
<TABLE height=83 cellSpacing=1 cellPadding=1 width=517
bgColor=#999999 border=0>
<TBODY>
<TR>
<TD class=main width=513 bgColor=#e9e9e9 height=81>
<DIV align=center>
<TABLE height=56 cellSpacing=0 cellPadding=0 width=489
border=0>
<TBODY>
<TR>
<TD class=main width=489
height=56> 本文提出了一种基于矢量角度的最短路径搜索算法,设计出一种类似于面向对象的数据存储结构来存储网络图中的节点及弧段对象,在最短路径的搜索上引入矢量夹角标量值做为搜索因子,充分利用了网络图中各点元素和线元素间的拓扑关系,提高了搜索的趋势性,同时还考虑了各弧段的长度值(或权值),较好的将网络图中对象的空间信息和属性信息相结合……</TD></TR></TBODY></TABLE></DIV></TD></TR></TBODY></TABLE>
<P class=main align=justify> <SPAN class=main> <STRONG>1
引言</STRONG><BR><BR> 随着地理信息产业的建立和数字化信息产品在全世界的普及,地理信息系统将深入到各行各业甚至各家各户,成为人们生产、生活学习和工作中不可缺少的工具和助手。<BR><BR> 地理信息系统中网络分析功能的主要目的是对地理网络(如交通网络)、城市基础设施网络(如各种网线、电力线、电话线、供排水管线等)进行地理分析和模型化。<BR><BR> 最短路径问题是地理信息系统网络分析中的最基本最关键的问题,在交通网络结构的分析,交通运输线路的选择,通讯线路的建造与维护,运输货流的最小成本分析,城市公共交通网络的规划等,都有直接应用的价值。<BR><BR> 关于最短路径问题,目前为人们所公认的最好求解方法,是1959年由E.W.Dijkstar提出的标号法,但具体实现中在存储空间及运行效率上还存在着一定的问题。<BR><BR> 本文从图形数据的存储结构及最短路径顶点的搜索策略两个方面对Dijkstra算法进行了改进,提出了一种基于矢量角度的最短路径搜索算法。<BR></SPAN></P></TD></TR></TBODY></TABLE></DIV></TD>
<TD vAlign=top>
<DIV align=right><BR></DIV></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=778 border=0>
<TBODY>
<TR>
<TD height=1108>
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width=734 border=0>
<TBODY>
<TR>
<TD height=1108>
<P class=main><BR> <STRONG>2
道路网络数据结构</STRONG><BR><BR> 构造类似于面向对象的数据结构存储网络图:<BR><BR> Public Type
Mynode(点结构)<BR><BR> Dim NodeID As Integer '节点ID,唯一标识节点
<BR><BR> Dim AdjoinNum As Integer '邻接弧段数量<BR><BR> Dim
AdjoinArcID() As Integer '邻接弧段ID<BR><SPAN class=main><BR> Dim
AdjoinNodeID() As Integer '邻接节点ID<BR><BR> Dim AdjoinClamp() As
Double '指向邻接节点的矢量的角度<BR><BR> End Type<BR><BR> Public Type
MyArc(弧结构)<BR><BR> Dim ArcID As Integer
'弧段ID,唯一标识弧段<BR><BR> Dim Length As Double '弧段长<BR><BR> End
Type<BR><BR> 其中节点对象中的三个数组大小在初始化时利用邻接弧段数量设置大小,因此对应不同的节点对象其大小是不固定的,使用此种结构,对于有向图不会造成数据的冗余,而对应于无向图也仅多存储了一倍的弧段ID,邻接节点ID及矢量角度,相对于经典Dijkstra算法来说,需要的存储空间仍较小。对于弧段对象来说,其中的Length可以设置为弧段长度,也可根据需要设置为时间、费用等相应的权值。<BR><BR> <STRONG>3
算法原理</STRONG><BR><BR> 由两点之间直线最短的定理,构造一条理想最短路径(如图一中的AB),这条直线段一定是A、B两点间弧段中距离最短的一条。但实际上这条直线段作为一段道路存在的可能性极小,但这条从起点到终点的直线段却代表了一个路线的趋势,从概率的角度,顺着这个方向的某些路段的集合组成最短路径的可能性较大。<BR><BR> <IMG
height=232 src="GIS中最短路径的实现 - kaixin110 - 博客园_files/picxmgl01.jpg"
width=272>
<BR><BR> 以矢量夹角标量值做为最短路径顶点选取的第一要素。<BR><BR> 如图一,求解A、B两点间的最短路径。∠1为矢量Aa与矢量AB间夹角的标量值,当前节点的每个邻接节点都对应一个角度标量值,按照标量值的正负值大小,构造标识分别为正负的两个队列,两个队列均根据节点对应标量值的绝对值从小到大进行排序。<BR><BR> 分别从正负两个队列中选出排在最前位的节点,加入到最短路径树中。<BR><BR> 除第一次搜索外,其余过程中都需要判断搜索到的节点是否已存在于最短路径树中,如果该节点已存在于最短路径树中,则需要比较本次搜索过程结束后该节点信息与对应的最短路径树节点信息。<BR><BR> 假设在第m次搜索过程中已确定指向节点S的树节点Sm,之后在第n次(n
≥
m)搜索得到的树节点Sn再次指向网络图中节点S。<BR><BR> 当Sn的Length值大于Sm的Length值时,在Sn处停止搜索,如图二所示。<BR><BR> <IMG
height=357 src="GIS中最短路径的实现 - kaixin110 - 博客园_files/picxmgl02.jpg"
width=466>
<BR><BR> 当Sn的Length值小于或等于Sm的Length值,如图三所示,将Sm之下的所有树节点移动到Sn之下,并依据Sn的Length值对应修改原Sm之下所有树节点(图示方框中所有树节点)的Length值。<BR><BR> <IMG
height=397 src="GIS中最短路径的实现 - kaixin110 - 博客园_files/picxmgl03.jpg"
width=466> <BR><BR> <STRONG>4
算法实现</STRONG><BR><BR> 本算法在武汉市经济开发区道路网络图上得到实现。武汉市经济开发区道路网络图中共有节点371个,边653条。在ArcMap的VBA环境中,通过VB+ArcObjects的编程方式,由VB实现算法逻辑控制,ArcMap管理图形的显示与控制,实现在图形窗口中动态显示求得的最短路径以及选取组成最短路径的路段集合的过程。实现流程图如下:<BR><BR> <IMG
height=469 src="GIS中最短路径的实现 - kaixin110 - 博客园_files/picxmgl04.jpg"
width=401>
<BR><BR> 在武汉市经济开发区道路图上任意选取六个节点,分别进行三次最短路径求解的实验,得出的参数如下表:</SPAN></P>
<P class=main align=justify><SPAN class=main> <IMG height=170
src="GIS中最短路径的实现 - kaixin110 - 博客园_files/picxmgl05.jpg"
width=571><BR> </SPAN><SPAN class=main> 其中:<BR><BR> Arc
Number表示的是最短路径经过的弧段数,单位为段;<BR><BR> Node
Number表示的是最短路径经过的结点个数,单位为个;<BR><BR> Path
Length表示的是最短路径的长度,单位为米;<BR><BR> Modification在本文算法中表示的是求解过程中树节点修改次数,在Dijkstra算法中表示的是求解过程中节点标号的修改次数;<BR><BR> Time表示的是求解最短路径花费的时间,单位为秒。<BR><BR> 由上表可以看到,在求解最短路径的过程中本文讨论的算法与传统的Dijkstra算法,最大的差别在于Modification。<BR><BR> 由于文中探讨的算法在求解最短路径过程中具有起、止点的方向性趋势,每次搜索过程中仅考虑当前节点的邻节点,故修改次数较小;而在Dijksra算法中,每次搜索过程中都将遍历所有未确定永久标号的节点,故修改次数较大。<BR><BR> 文中探讨的算法求解过程简单,速度快,求得的最短路径与用Dijkstra算法求得的最短路径相同或相近,所以该算法具有一定的实用性和可操作性。<BR><BR> <STRONG>5
结论</STRONG><BR><BR> 在对于搜索技术性能评价的时候,在各种不同的情况下有着不同的要求,并非只注重最优解,而是注重在一定条件下的非劣解。虽然本文讨论的算法在道路较不规整时求得的最短路径可能有一定的误差,但是与最短路径的最优解相近,而非劣解,且在其他情况下都能求得最优解,求解的速度快,故具有一定的实用性和可操作性。<BR><BR> 由于实际情况的复杂性,为了减小算法在求解时产生的误差,使得算法有更好的适应性,有进一步研究道路网络图中拓扑关系的必要,增加矢量条件,真正使最短路径的求解过程简单快速,结果准确可信。</SPAN></P></TD></TR></TBODY></TABLE></DIV></TD></TR></TBODY></TABLE>
<P class=postfoot>posted on 2007-08-10 14:50 <A
href="http://kaixin110.cnblogs.com/">kaixin110</A> 阅读(419) <A
href="http://www.cnblogs.com/kaixin110/archive/2007/08/10/850805.html#Post">评论(0)</A>
<A
href="http://www.cnblogs.com/kaixin110/admin/EditPosts.aspx?postid=850805">编辑</A>
<A
href="http://www.cnblogs.com/kaixin110/AddToFavorite.aspx?id=850805">收藏</A>
所属分类: <A
href="http://www.cnblogs.com/kaixin110/category/98024.html">GPS,GIS,RS,WebGIS</A>
</P></DIV><IMG height=1 src="GIS中最短路径的实现 - kaixin110 - 博客园_files/850805.jpg"
width=1> <!--
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description
rdf:about="http://www.cnblogs.com/kaixin110/archive/2007/08/10/850805.html"
dc:identifier="http://www.cnblogs.com/kaixin110/archive/2007/08/10/850805.html"
dc:title="GIS中最短路径的实现"
trackback:ping="http://www.cnblogs.com/kaixin110/services/trackbacks/850805.aspx" />
</rdf:RDF>
-->
<SCRIPT type=text/javascript>
//<![CDATA[
Sys.WebForms.PageRequestManager._initialize('AjaxHolder$scriptmanager1', document.getElementById('Form1'));
Sys.WebForms.PageRequestManager.getInstance()._updateControls(['tAjaxHolder$UpdatePanel1'], [], [], 90);
//]]>
</SCRIPT>
<DIV id=AjaxHolder_UpdatePanel1>
<STYLE>TD {
FONT-SIZE: 12px
}
.commentTextBox {
FONT-SIZE: 13px; FONT-FAMILY: Verdana
}
</STYLE>
<!--Beging Temp Save-->
<STYLE>.userData {
BEHAVIOR: url(#default#userdata)
}
</STYLE>
<DIV class=userData id=CommentsPersistDiv></DIV>
<SCRIPT type=text/javascript>
function pageLoad()
{
Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(handleInitializeRequest);
//Sys.WebForms.PageRequestManager.getInstance().add_endRequest(handleEndRequest);
}
function handleInitializeRequest(sender, args)
{
var prm = Sys.WebForms.PageRequestManager.getInstance();
var eid = args.get_postBackElement().id;
if (eid.indexOf("DeleteLink")>0)
{
args.get_postBackElement().innerHTML = "<font color='red'>正在删除...</font>";
}
else if (eid.indexOf("btnSubmit")>0)
{
document.getElementById("AjaxHolder_PostComment_ltSubmitMsg").innerHTML="正在提交...";
document.getElementById("AjaxHolder_PostComment_btnSubmit").disabled = true;
}
else if(eid.indexOf("refreshList")>0)
{
document.getElementById("AjaxHolder_PostComment_refreshList").innerHTML="<font color='red'>正在刷新...</font>";
}
}
function TempSave(ElementID)
{
try
{
CommentsPersistDiv.setAttribute("CommentContent",document.getElementById(ElementID).value);
CommentsPersistDiv.save("CommentXMLStore");
}
catch(ex)
{
}
}
function Restore(ElementID)
{
CommentsPersistDiv.load("CommentXMLStore");
document.getElementById(ElementID).value=CommentsPersistDiv.getAttribute("CommentContent");
}
</SCRIPT>
<!--Ene TempSave-->
<DIV id=divRefreshComments
style="FONT-SIZE: 12px; MARGIN-BOTTOM: 5px; MARGIN-RIGHT: 10px; TEXT-ALIGN: right"><A
id=AjaxHolder_PostComment_refreshList
href="javascript:__doPostBack('AjaxHolder$PostComment$refreshList','')">刷新评论列表</A> </DIV>
<DIV class=commentform><SPAN id=AjaxHolder_PostComment_ltSubmitMsg
style="COLOR: red"></SPAN><BR><A name=Feedback></A>
<TABLE cellSpacing=1 cellPadding=1 border=0>
<TBODY>
<TR>
<TD width=75></TD>
<TD></TD>
<TD></TD></TR>
<TR>
<TD width=55>标题</TD>
<TD><INPUT class=commenttb id=AjaxHolder_PostComment_tbTitle
style="WIDTH: 320px" value="re: GIS中最短路径的实现"
name=AjaxHolder$PostComment$tbTitle></TD>
<TD><SPAN id=AjaxHolder_PostComment_RequiredFieldValidator1
style="VISIBILITY: hidden; COLOR: red">请输入标题</SPAN></TD></TR>
<TR>
<TD>姓名</TD>
<TD><INPUT class=commenttb id=AjaxHolder_PostComment_tbName
style="WIDTH: 320px" name=AjaxHolder$PostComment$tbName></TD>
<TD><SPAN id=AjaxHolder_PostComment_RequiredFieldValidator2
style="VISIBILITY: hidden; COLOR: red">请输入你的姓名</SPAN></TD></TR>
<TR>
<TD>主页</TD>
<TD><INPUT class=commenttb id=AjaxHolder_PostComment_tbUrl
style="WIDTH: 320px" name=AjaxHolder$PostComment$tbUrl></TD>
<TD><FONT face=宋体></FONT></TD></TR>
<TR>
<TD align=left colSpan=3>
<TABLE class=CommentForm id=AjaxHolder_PostComment_tbCaptchaImage
cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD colSpan=3><SPAN
id=AjaxHolder_PostComment_Requiredfieldvalidator4
style="DISPLAY: none; COLOR: red">请输入验证码</SPAN> <SPAN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -