基于vc的电子导航系统_毕业论文(编辑修改稿)内容摘要:
图 地图的显示 使用地图标准工具 在地图显示出来后,用户通常要以各种比例查看地图的全局、局部或细部,必须提供诸 如放大、缩小和漫游等功能。 采用 MapX 通用工具,可以非常方便地实现上述功能。 设定 MapX 使用标准工具的方法很简单,只需设定地图对象的 CulrentTool 属性。 下面的例子是用标准放大工具实现放大功能。 添加新菜单项资源,输入标题“工具”,在“工具”下添加子菜单,输入标题“放大”及 ID 为 ID_ZOOM_ IN。 打开类向导,选择视图类 CVCDZDHView,为菜单项内蒙古科技大学毕业设计 说明书(毕业 论文 ) 10 ID_ZOOM_IN 添加 COMMAND 消息映射函数 OnZoomIn(),并编辑代码如下。 void CVCDZDHView::OnZoomIn() { (miZoomInToo1)。 //miZoomInTool 为放大工具的常量 } 编译运行程序,选择“工具 放大”,就会看到此时光标变为放大镜,单击鼠标就会实现放大功能。 如图 所示: 图 放大功能演示 可用相同方法实现缩小、漫游、全图等标准工具的功能。 其它的功能跟上面的方法类似,只是需要修改指示常量。 表 中列出了 部分 MapX 工具的指示常量 [9]。 内蒙古科技大学毕业设计 说明书(毕业 论文 ) 11 表 部分 MapX 工具的指示常量 图层控制工具 为了使用户方便查询各个图层, 通常要在电子导航系统中设计图层控制工具。 在菜单中建立图层控制菜单,设置图层控制 ID 为 ID_VIEW_LAYERCONTROL,然后建立类向导,选择 CVCDZDHView 类,添加如下函数: void CVCDZDHView::OnViewLayercontrol() { try { VARIANT vHelpFile, vHelpID。 = VT_ERROR。 = DISP_E_PARAMNOTFOUND。 = VT_ERROR。 = DISP_E_PARAMNOTFOUND。 CMapXLayers layers = ()。 (vHelpFile, vHelpID)。 } catch (COleDispatchException *e) 内蒙古科技大学毕业设计 说明书(毕业 论文 ) 12 { eReportError()。 eDelete()。 } catch (COleException *e) { eReportError()。 eDelete()。 } } 这样,就添加上了图层控制工具, 运行程序,该功能如图 所示: 图 图层控制工具 内蒙古科技大学毕业设计 说明书(毕业 论文 ) 13 第三章 自定义工具 测量折线距离 MapX 提供的地图标准工具能满足一般需要,但在一些特殊地方,用户可能需要某种特殊工具来完成某些特定的地图操作功能。 因此, MapX 提供了用户自定义工具的方法,这样可以大大扩展 MapX 的应用范围。 可使用地图对象的 CreateCustomTool 方法创建自定义工具。 下面是用自定义工具实现折线距离的计算。 创建用户自定义工具 为了满足用户需要,使用户方便查询两地之间的距离,我们利用自定义工具在电子导航系统中设计了折线距离计算功能。 方法如下: 首先,在 文件中定义常量。 define MYTOOL_DISTANCE 1 然后,在 文件中的 OnCreate()函数中加入如下代码,从而创建一个用户自定义工具。 int CVCDZDHView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if(CView:: OnCreate(1pCreateStruct) = = 1) return 1; …… (MYTOOL_DISTANCE,miToolTypePoly,miCrossCursor)。 //MYTOOL_DISTANCE 代表 自 定义工具的常量 , miToolTypePoly 描述了该工具的行为是画折线, miCrossCursor 表示指定光标的形式 return 0; } 内蒙古科技大学毕业设计 说明书(毕业 论文 ) 14 编程实现自定义工具的行为 在创建了用户自定义工具后,需在 ToolUsed 事件中实现该工具是如何工作的。 要处理 MapX 事件,首先需要为要处理的事件创建一事件槽,其方法如下。 在 文件中,在 DECLARE_MESSAGE_MAP()行下面加入如下一行代码。 DECLARE_EVENTSINK_MAP() 然后在 文件中,加入如下代码。 BEGIN_EVENTSINK_M AP(CVCDZDHView, CView) ON_EVENT(CVCDZDHView, IDC_M AP, 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()两行代码之间加入的,就是要处理的事件。 切换到 VCDZDHView. h 文件中,声明事件响应函数,代码如下。 void OnPolyToolUsedMap(short ToolNum, long Flags, LPDISPATCH Points, BOOL bShift, BOOL bCtrl, BOOL FAR*EnableDefauh) 然后在 中加入函数的实现代码。 void CVCDZDHView::OnPolyToolUsedMap(short ToolNum,long ags,LPDISPATCH Points,BOOL bShift,BOOL bCtrl,BOOL FAR*EnableDefault) { if (ToolNum==MYTOOL_DISTANCE)。 { 内蒙古科技大学毕业设计 说明书(毕业 论文 ) 15 CMapXPoints pts。 long n。 long i。 try { (Points,FALSE)。 double dDistanceTot=。 n=()。 for(i=1。 in。 i++) { CMapXPoint pt1=(i)。 CMapXPoint pt2=(i+1)。 Double d=((),(),(),())。 dDistanceTot+=d。 } CString str。 (总距离为 :%f公里 ,dDistanceTot)。 ((CMainFrame*)AfxGetMainWnd())(0,str)。 //在状态栏中显示折线距离 } catch(COleDispatchException *e) { eReportError()。 内蒙古科技大学毕业设计 说明书(毕业 论文 ) 16 eDelete()。 } catch(COleException *e) { eReportError()。 eDelete()。 } } } 为了在状态栏中显示折线距离,还必须在 文件中添加 CMainFrame类的头文件。 include“ ” 并且将 CMainFrame 类中的 mwndStatusBar 由受保护的变量改为全局变量。 调用自定义工具 在“工具”下拉菜单中添加“折线距离”子菜单项, ID 为 ID_DISTANCE_TOOL。 打开类向导,选择视图类 CVCDZDHView,为菜单项 ID_DISTANCE_TOOL 添加COMMAND 消息映射函数 OnPolydistancetool(),添加代码如下。 void CVCDZDHView::OnDistanceTool() { // TODO: Add your mand handler code here (MYTOOL_DISTANCE)。 //调用自定义工具 } 内蒙古科技大学毕业设计 说明书(毕业 论文 ) 17 编译并运行程序,如 图 所示为使用“折线距离”工具的应用程序界面。 图 折线距离演示 内蒙古科技大学毕业设计 说明书(毕业 论文 ) 18 第四章 最优路径分析 对城市道路网进行最短路径分析, 需要把城市道路网络实体抽象化为网络图论理论中的网络图,然后通过图论中的网络分析理论来实现道路网络的最短路径分析。 在实际应用中,道路网的表现形式一般为数字化的矢量地图,其网络空间特征中的交叉路口坐标和道路位置坐标是在地图上借助图形来识别和解释的 ; 而为了能够高效率地进行最短路径分析,必须首先将其按结点和弧的关系抽象为图的结构。 这就需要先对原始道路图进行预处理,构建其相应的网络拓扑关系,然后才能进行最短路径分析等各种操作。 下面介绍一种 Dijkstra 算法。 实现过程及其算法分析 Dijkstra(迪杰斯特拉 )算法 是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。 主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。 Dijkstra 算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。 Dijkstra 算法 一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE 表方式。 其采用的是贪心法的算法策略 , 大概过程: 创建两个表, OPEN, CLOSE。 OPEN 表保存所有已生成而未考察的节点, CLOSED 表中记录已访问过的节点。 1. 访问路 网中距离起始点最近且没有被检查过的点,把这个点放入 OPEN 组中等待检查。 2. 从 OPEN 表中找出距起始点最近的点,找出这个点的所有子节点,把这个点放到 CLOSE 表中。 内蒙古科技大学毕业设计 说明书(毕业 论文 ) 19 3. 遍历考察这个点的子节点。 求出这些子节点距起始点的距离值,放子节点到OPEN 表中。 4. 重复第 2 和第 3 步 ,直到 OPEN 表为空,或找到目标点。 Dijkstra 算法的基本思路是:假设每个点都有一对标号 (dj, pj),其中 dj 是从起源点s 到点 j 的最短路径的长度 (从顶点到其本身的最短路径是零路 (没有弧的路 ),其长度等于零 ); pj 则是从 s 到 j 的最短路径中 j 点的前一点。 求解从起源点 s 到点 j 的最短路径算法的基本过程如下: 开 始初 始 化d j = m i n [ d j , d k + l k j ]d i = m i n [ d j , 所 有 未 标 记 的 点 j ]i = j *标 记 点 i ,所 有 点 已 标 记。 输 出 结 果k = iYN 图 算法流程图 1) 初始化。 起源点设置为:① ds=0, ps 为空 ; ② 所有其他点 : di=∞ ,pi=?; ③ 标记起源点 s,记 k=s,其他所有点设为未标记的。 2) 检验从所有已标记的点 k 到其直接连接的未标记的点 j 的距离 , 并设置: dj=min[ dj, dk+lkj],式中, lkj 是从点 k 到 j 的直接连接距离。 3) 选取下一个点。 从所有未标记的结点中, 选取 dj 中最小的一个 i: di=min[ dj, 所内蒙古科技大学毕业设计 说明书(毕业 论文 ) 20 有未标记的点 j] ,点 i就被选为最短路径中的一点,并设为已标记的。 4) 找到点 i 的前一点。 从已标记的点中找到直接连接到点 i 的点 j*,作为前一点 ,设置: i=j*。 5) 标记点 i。 如果所有点已标记,则算法完全推出,否则,记 k=i,转到 2)再继续。 为了实现 Dijkstra 算法,在程序中首先引入三个类: 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。 //在最短路。基于vc的电子导航系统_毕业论文(编辑修改稿)
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。
用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。