《基于VC++的电子导航系统毕业论文.doc》由会员分享,可在线阅读,更多相关《基于VC++的电子导航系统毕业论文.doc(60页珍藏版)》请在三一办公上搜索。
1、基于VC+的电子导航系统摘 要地理信息系统(GIS)自二十世纪六十年代开始发展至今,已经逐渐成为一门成熟的技术,其在交通、旅游、环境等诸多领域的应用使地理信息系统被越来越多的用户所接受,成为人们工作、生活中一个强有力的工具。本设计以VC+为开发平台,以MapX控件为图形平台,以MSComm控件为通信平台,设计具有电子导航的基本功能(如地图的放大缩小、全图、漫游等)、自定义工具测量折线距离、图层控制、最优路径分析、GPS导航等功能的GIS应用软件。本文介绍了电子导航系统设计的背景及设计中需要用到的MapX控件、VC+、MSComm控件,分析了GIS开发三种实现方式,提出系统设计方案:集成二次开发
2、。在集成二次开发的基础上,首先实现了地图的导入、地图放大缩小及图层控制等电子导航的基本功能,其次以测量折线距离为例实现了自定义工具的功能,再次介绍了最优路径分析,最后实现GPS导航功能。关键词:电子导航;GIS开发;VC+;MapX控件;最优路径Electronic Navigation Systems Based On VC+AbstractSince the beginning of 1960s,Geographic Information System (GIS) has gradually become a mature technology. In transportation, t
3、ourism, environment and many other fields of application GIS has been accepted by an increasing number of users for the people working and living as a powerful tool.The design used VC + + as a development platform, MapX control as a graphics platform, MSComm control as a communications platform.It h
4、as devised the GIS applications such as electronic navigation Basic functions(zoom control,the whole map, Roaming, for example), Calculating the distance, Layer Control, Analysis of the optimal path and GPS Navigation Features.This article has described the design of electronic navigation systems ba
5、ckground, MapX control,VC+ and MSComm control. It has analyzed GIS development in three ways and proposed system design:Secondary development of integrated. First of all, It has realized the basic functions of GIS such as the insert map,Layer Control, Zoom control in the integrated development of th
6、e basis of secondary. Second, it has used a custom tool as an example to measure the distance, and then it has introduced the analysis of the optimal path. Finally, it has realized GPS navigation.Key words: Electronic navigation; GIS Development;VC+; MapX control; Optimal path目 录摘 要IAbstractII第一章 引
7、言11.1设计背景11.2系统设计方案41.2.1应用型GIS开发的三种实现方式41.2.2三种实现方式的分析5第二章 电子导航基本功能在VC+中的实现72.1利用MapX实现GIS基本功能72.1.1将MapX支持类库加入工程72.1.2地图的显示72.2使用地图标准工具92.3图层控制工具11第三章 自定义工具测量折线距离133.1创建用户自定义工具133.2编程实现自定义工具的行为143.3调用自定义工具16第四章 最优路径分析184.1实现过程及其算法分析184.2查询最短路径25第五章 GPS导航功能305.1定位信息的接收325.2提取定位数据34总 结39参考文献40附录:源程序
8、42CVCDZDHView类源程序42致 谢52第一章 引 言1.1 设计背景学科发展走向综合是一个普遍的趋势,比如全球定位系统(GPS)与地理信息系统(GIS)的集成应用。目前用于GIS应用软件开发的模式有很多,其中组件式GIS软件开发是目前较为流行、高效、快速的开发模式。随着计算机技术的飞速发展,GIS得到了广泛的重视和应用,GPS技术也已深入到各行各业,GPS与GIS的集成具有广泛的应用需求,它可以实现GPS导航信息在地图上的可视化、一体化和集成化,能够在地图上实时动态地跟踪目标和显示地理方位。VC+是目前较流行的可视化开发编程工具之一,支持面向对象和事件驱动机制的程序开发,利用其强大的
9、集成开发环境,程序员仅需要较少代码即可生成标准的“Windows” 界面,并且能在VC开发平台下可以较为方便的集成组件。本文主要介绍利用MapX控件,采用VC+编程语言进行组件式GIS应用软件开发的主要过程和基本模式,来实现电子导航的目的。MapX是MapInfo公司向用户提供的具有强大地图分析功能的ActiveX控件产品。由于它是一种基于Windows操作系统的标准控件,因而能支持绝大多数标准的可视化开发环境如Visual C+、Visual Basic、Delphi、PowerBuilder等。编程人员在开发过程中可以选用自己最熟悉的开发语言,轻松地将地图功能嵌入到应用中,并且可以脱离Ma
10、pInfo的软件平台运行。利用MapX,能够简单快速地在企业应用中嵌入地图化功能,增强企业应用的空间分析能力,实现企业应用的增值。MapX采用基于MapInfo Professional的相同的地图化技术,可以实现MapInfo Professional具有的绝大部分地图编辑和空间分析功能。而且,MapX提供了各种工具、属性和方法,实现这些功能是非常容易的1。MapX为开发人员提供了一个快速、易用、功能强大的地图化组件。在VB,Delphi,PowerBuilder,VC等可视化开发环境中,只需在设计阶段将MapX控件放入窗体中,并对其进行编程,设置属性或调用方法或相应事件,即可实现数据可视化
11、,专题分析,地理查询,地理编码等丰富的地图信息系统功能。 MapX定义了一个类体系,以有效的组织图形元素,图层,属性数据等对象。MapX的主要功能包括:显示MapInfo格式的地图;对地图进行放大、缩小、漫游、选择等操作;专题地图;图层控制;数据绑定;动态图层和用户绘图图层;生成和编辑地图对象;简单地理查询:边界查询,地址查询。VC+是微软公司开发的一个IDE(集成开发环境),换句话说,就是使用C+的一个开发平台。有些软件就是这个编出来的,另外还有VB、VF,只是使用不同语言。但是,VC+是Windows平台上的C+编程环境,学习VC要了解很多Windows平台的特性并且还要掌握MFC、ALT
12、、COM等的知识。Windows下编程需要了解Windows的消息机制以及回调(callback)函数的原理;MFC是Win32API的包装类,需要理解文档视图类的结构,窗口类的结构,消息流向等等;COM是代码共享的二进制标准,需要掌握其基本原理等等。VC+应用程序的开发主要有两种模式,一种是WIN API方式,另一种则是MFC方式,传统的WIN API开发方式比较繁琐,而MFC则是对WIN API再次封装,所以MFC相对于WIN API开发更具备效率优势。VC基于C,C+语言,主要由是MFC组成,是与系统联系非常紧密的编程工具,它兼有高级,和低级语言的双重性,功能强大,灵活,执行效率高,几乎
13、可说VC在 Windows平台无所不能。MSComm 作为一个串行通讯控件为程序员串口通讯编程节省了很多时间。在基于对话框的应用中加入一个MSComm控件非常简单。只需进行以下操作即可:打开“Project-Add To Project-Components and Controls-Registered Activex Controls”,然后选择控件:Microsoft Communication Control,version 6.0插入到当前的工程中。这样就将类 CMSComm 的相关文件 mscomm.cpp 和 mscomm.h 一并加入到了工程中。编程时只需将控件对话中的 MSC
14、omm 控件拖至你的应用对话框中就OK了。MSComm控件提供了两种处理通信的方法:1. 事件驱动通信,是一种功能很强的处理串口活动的方法。例如,当在CD(Carrier Detect)线或RTS(Request To Send)线上有字符到达或发生了改变,在这种情况下,可以使用MSComm控件的OnComm事件捕获和处理这些通信事件。OnComm也可以捕获和处理通信中的错误。2. 可以在每个重要的程序功能之后检查CommEvent属性的值来检测事件和通信错误。使用的每个MSComm控件都与一个串口对应。如果在应用程序中需要访问多个串口,必须使用多个MSComm控件,可以在Windows 控制
15、面板中修改串口地址的中断地址。MSComm 控件有很多重要的属性,如:CommPort 属性:设置并返回通讯端口号。RThreshold 属性:在MSComm控件设置CommEvent属性为comEReceive并产生OnComm之前,设置并返回的要接收的字符数。CTSHolding属性:确定是否可通过查询Clear To Send (CTS)线的状态发送数据。Clear To Send 是调制解调器发送到相联计算机的信号,指示传输可以进行。该属性在设计时无效,在运行时为只读。SThreshold属性:在MSComm控件设置CommEvent属性为comEvSend并产生OnComm事件之前,
16、设置并返回传输缓冲区中允许的最小字符数。CDHolding 属性:通过查询 Carrier Detect (CD)线的状态确定当前是否有传输。Carrier Detect 是从调制解调器发送到相联计算机的一个信号,指示调制解调器正在联机。该属性在设计时无效,在运行时为只读。DSRHolding 属性:确定Data Set Ready (DSR)线的状态。Data Set Ready信号由调制解调器发送到相连计算机,指示作好操作准备。该属性在设计时无效,在运行时为只读。Settings属性:设置并返回波特率、奇偶校验、数据位、停止位参数。InputLen属性:设置并返回Input属性从接收缓冲区
17、读取的字符数。1.2 系统设计方案1.2.1 应用型GIS开发的三种实现方式(1)独立开发不依赖于任何GIS工具软件,从空间数据的采集、编辑到数据的处理分析及结果输出,所有的算法都由开发者独立设计,然后选用某种程序设计语言,如Visual C+、Delphi等,在一定的操作系统平台上编程实现。这种方式的好处在于无须依赖任何商业GIS工具软件,减少了开发成本,但一方面对于大多数开发者来说,能力、时间、财力方面的限制使其开发出来的产品很难在功能上与商业化GIS工具软件相比,而且在购买GIS工具软件上省下的钱可能还抵不上开发者在开发过程中绞尽脑汁所花的代价。(2)单纯二次开发完全借助于GIS工具软件
18、提供的开发语言进行应用系统开发。GIS工具软件大多提供了可供用户进行二次开发的宏语言,如ESRI的ArcView提供了Avenue语言,MapInfo公司研制的MapInfo Professional提供了MapBasic语言等等。用户可以利用这些宏语言,以原GIS工具软件为开发平台,开发出自己的针对不同应用对象的应用程序。这种方式省时省心,但进行二次开发的宏语言,作为编程语言只能算是二流,功能极弱,用它们来开发应用程序仍然不尽如人意。(3)集成二次开发集成二次开发是指利用专业的GIS工具软件,如MapInfo、ArcView等,实现GIS的基本功能,以通用软件开发工具尤其是可视化开发工具,如
19、Visual C+、Delphi、Visual Basic、Power Builder等为开发平台,进行二者的集成开发。集成二次开发目前主要有两种方式:1) OLE/DDE采用OLE Automation技术或利用DDE技术,用软件开发工具开发前台可执行应用程序,以OLE自动化方式或DDE方式启动GIS工具软件在后台执行,利用回调技术动态获取其返回信息,实现应用程序中的地理信息处理功能。2) GIS控件利用GIS工具软件生产厂家提供的建立在OCX技术基础上的GIS功能控件,如ESRI的MapObjects、MapInfo公司的MapX等,在VC+等编程工具编制的应用程序中,直接将GIS功能嵌入
20、其中,实现地理信息系统的各种功能。1.2.2 三种实现方式的分析由于独立开发难度太大,单纯二次开发受GIS工具提供的编程语言的限制差强人意,因此结合GIS工具软件与当今可视化开发语言的集成二次开发方式就成为GIS应用开发的主流。它的优点是既可以充分利用GIS工具软件对空间数据库的管理、分析功能,又可以利用其它可视化开发语言具有的高效、方便等编程优点,集二者之所长,不仅能大大提高应用系统的开发效率,而且使用可视化软件开发工具开发出来的应用程序具有更好的外观效果,更强大的数据库功能,而且可靠性好、易于移植、便于维护,尤其是使用OCX技术利用GIS功能组件进行集成开发,更能表现出这些优势。由于上述优
21、点,集成二次开发正成为应用GIS开发的主流方向。这种方法唯一的缺点是前期投入比较大,需要同时购买GIS工具软件和可视化编程软件,但“工欲善其事,必先利其器”,这种投资值得。目前许多软件公司都开发了很多ActiveX控件,合理选择和运用现成的控件,减少了开发者的编程工作量,使开发者避开某些应用的具体编程,直接调用控件,实现这些具体应用,不仅可以缩短程序开发周期,使编程过程更简洁,用户界面更友好,可以使程序更加灵活、简便。与利用OLE Automation技术作为服务器的MapInfo相比,利用控件开发速度快,占用资源少,而且易实现许多底层的编程和开发功能4。第二章 电子导航基本功能在VC+中的实
22、现2.1 利用MapX实现GIS基本功能在进行MapX开发之前,首先要在计算机中正确的安装了MapX控件和VC+应用程序。下面就用一个具体的实例,介绍在VC+中集成MapX的方法。2.1.1 将MapX支持类库加入工程利用VC+环境下的应用程序生成向导创建一单文档界面应用程序VCDZDH。先将位于MapX的安装路径下的子目录Samples40C+Cpp中的MapX.h和MapX.cpp文件拷贝到当前应用程序所在的VCDZDH文件夹下,然后从Project菜单中选择Add to ProjectFiles命令,此时打开了Insert Files into Project对话框,选择VCDZDH文件
23、夹下的MapX.cpp和MapX.h文件加入到工程中。2.1.2 地图的显示在VCDZDH文件夹下新建文件夹map,map中复制MapInfo格式的地图文件及Geoset(.GST)文件MY.GST。用户只需要打开Geoset文件,就可以按预先定制的方式显示各层地图。通过以下步骤,就可以实现地图的显示5。1) 在VCDZDHView.h文件中,加入MapX.h对象的头文件,并声明CMapX类型的变量m_ctrlMapX。方法如下:#include“MAPX.H”Class CVCDZDHView:publicCViewprotected:CMapX m_ctrlMapX;/ 声明CMapX类型
24、的变量m_ctrlMapX2) 为MapX创建一个资源ID。选择View Resource Symbols,并点击New按钮,输入名称IDC_MAP,值取默认数值。3) 在VCDZDHView.h文件中声明int类型的全局变量m_created和CString类型的全局变量m_tempclientpath。通过类向导创建消息映射函数WM_CREATE。选择“建立类向导”或使用快捷键CTRL+W,可以打开类向导。从类名中选择CVCDZDHView类,在消息框中选择WM_CREATE消息,然后添加函数,编辑代码创建MapX对象。代码如下:int CVCDZDHView:OnCreate(LPCRE
25、ATESTRUCT lpCreateStruct) if (!m_ctrlMapX.Create(NULL,WS_VISIBLE,CRect(0,0,100,100),this,IDC_MAP) return -1;4) 采用同样的方法创建WM_SIZE消息映射函数。该函数用来调整地图大小使其充满客户区。具体代码如下:void CVCDZDHView:OnSize(UINT nType,int cx,int cy)CView:OnSize(nType,cx,cy);m_ctrlMapX.MoveWindow(0,0,cx,cy);/调整地图大小5) 采用同样的方法创建WM_SETFOCUS消息
26、映射函数。修改函数使得当窗口获得焦点时,地图控件获得焦点。具体代码如下。void CVCDZDHView:OnSetFocus(CWnd*pOldWnd)CView:OnSetFocus(pOldWnd);m_ctrlMapX.SetFocus();/当窗口获得焦点时,地图控件获得焦点通过以上步骤,将应用程序编译运行就可显示地图。如图2.1所示:图2.1 地图的显示2.2 使用地图标准工具在地图显示出来后,用户通常要以各种比例查看地图的全局、局部或细部,必须提供诸如放大、缩小和漫游等功能。采用MapX通用工具,可以非常方便地实现上述功能。设定MapX使用标准工具的方法很简单,只需设定地图对象的
27、CulrentTool属性。下面的例子是用标准放大工具实现放大功能。添加新菜单项资源,输入标题“工具”,在“工具”下添加子菜单,输入标题“放大”及ID为ID_ZOOM_ IN。打开类向导,选择视图类CVCDZDHView,为菜单项ID_ZOOM_IN添加COMMAND消息映射函数OnZoomIn(),并编辑代码如下。void CVCDZDHView:OnZoomIn()m_ctrlMapX.SetCurrentTool(miZoomInToo1);/miZoomInTool为放大工具的常量编译运行程序,选择“工具放大”,就会看到此时光标变为放大镜,单击鼠标就会实现放大功能。如图2.2所示:图2
28、.2 放大功能演示可用相同方法实现缩小、漫游、全图等标准工具的功能。其它的功能跟上面的方法类似,只是需要修改指示常量。表 2.1中列出了部分MapX工具的指示常量9。表2.1 部分MapX工具的指示常量2.3 图层控制工具为了使用户方便查询各个图层,通常要在电子导航系统中设计图层控制工具。在菜单中建立图层控制菜单,设置图层控制ID为ID_VIEW_LAYERCONTROL,然后建立类向导,选择CVCDZDHView类,添加如下函数:void CVCDZDHView:OnViewLayercontrol() try VARIANT vHelpFile, vHelpID;vHelpFile.vt
29、= VT_ERROR;vHelpFile.scode = DISP_E_PARAMNOTFOUND;vHelpID.vt = VT_ERROR;vHelpID.scode = DISP_E_PARAMNOTFOUND;CMapXLayers layers = m_ctrlMapX.GetLayers();layers.LayersDlg(vHelpFile, vHelpID);catch (COleDispatchException *e) e-ReportError();e-Delete();catch (COleException *e) e-ReportError();e-Delete(
30、);这样,就添加上了图层控制工具,运行程序,该功能如图2.3所示:图2.3 图层控制工具第三章 自定义工具测量折线距离MapX提供的地图标准工具能满足一般需要,但在一些特殊地方,用户可能需要某种特殊工具来完成某些特定的地图操作功能。因此,MapX提供了用户自定义工具的方法,这样可以大大扩展MapX的应用范围。可使用地图对象的CreateCustomTool方法创建自定义工具。下面是用自定义工具实现折线距离的计算。3.1 创建用户自定义工具为了满足用户需要,使用户方便查询两地之间的距离,我们利用自定义工具在电子导航系统中设计了折线距离计算功能。方法如下:首先,在VCDZDH.h文件中定义常量。#
31、define MYTOOL_DISTANCE 1然后,在VCDZDH.cpp文件中的OnCreate()函数中加入如下代码,从而创建一个用户自定义工具。int CVCDZDHView:OnCreate(LPCREATESTRUCT lpCreateStruct)if(CView:OnCreate(1pCreateStruct) = = -1)return -1;m_ctrlMapX.CreateCustomTool(MYTOOL_DISTANCE,miToolTypePoly,miCrossCursor); /MYTOOL_DISTANCE代表自定义工具的常量,miToolTypePoly描述
32、了该工具的行为是画折线,miCrossCursor表示指定光标的形式return 0;3.2 编程实现自定义工具的行为在创建了用户自定义工具后,需在ToolUsed事件中实现该工具是如何工作的。要处理MapX事件,首先需要为要处理的事件创建一事件槽,其方法如下。在VCDZDHView.h文件中,在DECLARE_MESSAGE_MAP()行下面加入如下一行代码。DECLARE_EVENTSINK_MAP()然后在VCDZDHView.cpp文件中,加入如下代码。BEGIN_EVENTSINK_M AP(CVCDZDHView,CView)ON_EVENT(CVCDZDHView,IDC_M A
33、P,11,OnPolyTooIUsedMap,VTS_I2 VTS_I4 VTS_DISPATCH VTS_BOOL VTS_BOOL VTS_PBOOL) /11代表PolyToolused,OnPolyToolUsedMap是事件响应函数的名称。END_EVENTSINK_MAP()BEGIN_EVENTSINK_MAP(CVCDZDHView,CView)和END_EVENTSINK_MAP()两行代码之间加入的,就是要处理的事件。切换到VCDZDHViewh文件中,声明事件响应函数,代码如下。void OnPolyToolUsedMap(short ToolNum,long Flags
34、,LPDISPATCH Points,BOOL bShift,BOOL bCtrl,BOOL FAR*EnableDefauh)然后在VCDZDHView.cpp中加入函数的实现代码。void CVCDZDHView:OnPolyToolUsedMap(short ToolNum,long ags,LPDISPATCH Points,BOOL bShift,BOOL bCtrl,BOOL FAR*EnableDefault) if (ToolNum=MYTOOL_DISTANCE); CMapXPoints pts; long n; long i; try pts.AttachDispatch
35、(Points,FALSE); double dDistanceTot=0.0; n=pts.GetCount(); for(i=1;im_wndStatusBar.SetPaneText(0,str);/在状态栏中显示折线距离 catch(COleDispatchException *e) e-ReportError(); e-Delete(); catch(COleException *e) e-ReportError(); e-Delete(); 为了在状态栏中显示折线距离,还必须在VCDZDH.cpp文件中添加CMainFrame类的头文件。#include“MainFrm.h”并且将
36、CMainFrame类中的mwndStatusBar由受保护的变量改为全局变量。3.3 调用自定义工具在“工具”下拉菜单中添加“折线距离”子菜单项,ID为ID_DISTANCE_TOOL。打开类向导,选择视图类CVCDZDHView,为菜单项ID_DISTANCE_TOOL添加COMMAND消息映射函数OnPolydistancetool(),添加代码如下。void CVCDZDHView:OnDistanceTool() / TODO: Add your command handler code herem_ctrlMapX.SetCurrentTool(MYTOOL_DISTANCE);/
37、调用自定义工具编译并运行程序,如图3.1所示为使用“折线距离”工具的应用程序界面。图3.1 折线距离演示第四章 最优路径分析对城市道路网进行最短路径分析,需要把城市道路网络实体抽象化为网络图论理论中的网络图,然后通过图论中的网络分析理论来实现道路网络的最短路径分析。在实际应用中,道路网的表现形式一般为数字化的矢量地图,其网络空间特征中的交叉路口坐标和道路位置坐标是在地图上借助图形来识别和解释的;而为了能够高效率地进行最短路径分析,必须首先将其按结点和弧的关系抽象为图的结构。这就需要先对原始道路图进行预处理,构建其相应的网络拓扑关系,然后才能进行最短路径分析等各种操作。下面介绍一种Dijkstr
38、a算法。4.1 实现过程及其算法分析Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。Dijkstra算法一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表方式。其采用的是贪心法的算法策略,大概过程:创建两个表,OPEN, CLOSE。OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。1 访问路网中距离起始点最近且没有被检查过的点,把这个点放入
39、OPEN组中等待检查。2 从OPEN表中找出距起始点最近的点,找出这个点的所有子节点,把这个点放到CLOSE表中。3 遍历考察这个点的子节点。求出这些子节点距起始点的距离值,放子节点到OPEN表中。4 重复第2和第3步,直到OPEN表为空,或找到目标点。Dijkstra算法的基本思路是:假设每个点都有一对标号 (dj, pj),其中dj是从起源点s到点j的最短路径的长度 (从顶点到其本身的最短路径是零路(没有弧的路),其长度等于零);pj则是从s到j的最短路径中j点的前一点。求解从起源点s到点j的最短路径算法的基本过程如下:图4.1 算法流程图1) 初始化。起源点设置为: ds=0, ps为空
40、; 所有其他点: di=,pi=?; 标记起源点s,记k=s,其他所有点设为未标记的。2) 检验从所有已标记的点k到其直接连接的未标记的点j的距离,并设置:dj=mindj, dk+lkj,式中,lkj是从点k到j的直接连接距离。3) 选取下一个点。从所有未标记的结点中,选取dj 中最小的一个i:di=mindj, 所有未标记的点j,点i就被选为最短路径中的一点,并设为已标记的。4) 找到点i的前一点。从已标记的点中找到直接连接到点i的点j*,作为前一点,设置:i=j*。5) 标记点i。如果所有点已标记,则算法完全推出,否则,记k=i,转到2)再继续。为了实现Dijkstra算法,在程序中首先
41、引入三个类:class VERTEX /顶点类public int id;public int Searched; /0表示从来没有搜索过,表示搜索过,但没有完成,表示搜索完成,该点的最短路径已经找到public IPoint pPoint;public VERTEX Prev;public VERTEX Next;public Link Neighbor;/一个链接关系,相当于线节点public double Weight;/权重,初始时置为无穷大,搜寻最短路径时置为该点当前最短路径长度public VERTEX ShortPathPre;/在最短路径上的前一个点public int Lin
42、eID;/最短路径中与前一个点之间的线的IDpublic SearchLink SLink;/Open或Close表中的链接class Link/点的邻接关系public VERTEX v1;/每个Link对象的v1都应该指向它所附属的点节点public VERTEX v2;/每个Link对象的v2都应该指向与它所附属的点相邻的那个点节点public double weight;/线的权重public Link v1Next;public Link v2Next;public int LineID;class SearchLink/搜寻路径时的邻接关系,用来放入Open或Close表中publ
43、ic VERTEX v;public SearchLink Prev;public SearchLink Next;VERTEX类用来存储点节点,Link类用来存储邻接关系,SearchLink是一个临时的中间邻接关系,在寻径时替代VERTEX实例进行运算,用来维持邻接多重表。系统的主要功能函数为:private VERTEX BuildTopo(IFeatureLayer pFeatLayerP,IFeatureLayer pFeatLayerL,IPoint pStartV,IPoint pEndV,ref int PointCount,ref intEdgeCount),主要用来建立拓扑
44、关系private void shortpath(),查询最短路径的主函数private void InsertOrder(SearchLink vIN,ref SearchLink vTO)按权重的升序插入private void Insert(SearchLink vIN,ref SearchLink vTO)插入private void Delete(ref SearchLink vOUT,ref SearchLink vFROM)从链表中删除建立拓扑关系:VERTEXRoadNode=new VERTEXNodeCount;indexP=0;pFeatureP=pFeatCsrP.Ne
45、xtFeature();while(null!=pFeatureP)indexP=(int)pFeatureP.get_Value(pFeatureP.Fields.FindField(ID);if(indexP0)pFeatureP=pFeatCsrP.NextFeature();continue;RoadNodeindexP=new VERTEX();RoadNodeindexP.Neighbor=null;RoadNodeindexP.pPoint=(IPoint)pFeatureP.Shape;RoadNodeindexP.Searched=0;RoadNodeindexP.ShortPathPre=null;RoadNodeindexP.Weight=double.MaxValue;pFeatureP=pFeatCsrP.NextFeature();首先建立VERTEX数组,用来存放点节点,在遍历点层元素的过程中,根据点的ID号找到数组索引号,生成点节点的实例(即VERTEX实例)。建立这一过程的时间消耗与点的数量n成正比,即时间复杂度为O(n)。pFeatCsrL=pFeatClsL.Search(null,false);int ind