基于vc的电子导航系统文档格式.docx
- 文档编号:18088689
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:42
- 大小:557.35KB
基于vc的电子导航系统文档格式.docx
《基于vc的电子导航系统文档格式.docx》由会员分享,可在线阅读,更多相关《基于vc的电子导航系统文档格式.docx(42页珍藏版)》请在冰豆网上搜索。
MapXcontrol;
Optimalpath
第一章引言
1.1设计背景
学科发展走向综合是一个普遍的趋势,比如全球定位系统(GPS)与地理信息系统(GIS)的集成应用。
目前用于GIS应用软件开发的模式有很多,其中组件式GIS软件开发是目前较为流行、高效、快速的开发模式。
随着计算机技术的飞速发展,GIS得到了广泛的重视和应用,GPS技术也已深入到各行各业,GPS与GIS的集成具有广泛的应用需求,它可以实现GPS导航信息在地图上的可视化、一体化和集成化,能够在地图上实时动态地跟踪目标和显示地理方位。
VC++是目前较流行的可视化开发编程工具之一,支持面向对象和事件驱动机制的程序开发,利用其强大的集成开发环境,程序员仅需要较少代码即可生成标准的“Windows”界面,并且能在VC开发平台下可以较为方便的集成组件。
本文主要介绍利用MapX控件,采用VC++编程语言进行组件式GIS应用软件开发的主要过程和基本模式,来实现电子导航的目的。
MapX是MapInfo公司向用户提供的具有强大地图分析功能的ActiveX控件产品。
由于它是一种基于Windows操作系统的标准控件,因而能支持绝大多数标准的可视化开发环境如VisualC++、VisualBasic、Delphi、PowerBuilder等。
编程人员在开发过程中可以选用自己最熟悉的开发语言,轻松地将地图功能嵌入到应用中,并且可以脱离MapInfo的软件平台运行。
利用MapX,能够简单快速地在企业应用中嵌入地图化功能,增强企业应用的空间分析能力,实现企业应用的增值。
MapX采用基于MapInfoProfessional的相同的地图化技术,可以实现MapInfoProfessional具有的绝大部分地图编辑和空间分析功能。
而且,MapX提供了各种工具、属性和方法,实现这些功能是非常容易的[1]。
MapX为开发人员提供了一个快速、易用、功能强大的地图化组件。
在VB,Delphi,PowerBuilder,VC等可视化开发环境中,只需在设计阶段将MapX控件放入窗体中,并对其进行编程,设置属性或调用方法或相应事件,即可实现数据可视化,专题分析,地理查询,地理编码等丰富的地图信息系统功能。
MapX定义了一个类体系,以有效的组织图形元素,图层,属性数据等对象。
MapX的主要功能包括:
显示MapInfo格式的地图;
对地图进行放大、缩小、漫游、选择等操作;
专题地图;
图层控制;
数据绑定;
动态图层和用户绘图图层;
生成和编辑地图对象;
简单地理查询:
边界查询,地址查询。
VC++是微软公司开发的一个IDE(集成开发环境),换句话说,就是使用C++的一个开发平台。
有些软件就是这个编出来的,另外还有VB、VF,只是使用不同语言。
但是,VC++是Windows平台上的C++编程环境,学习VC要了解很多Windows平台的特性并且还要掌握MFC、ALT、COM等的知识。
Windows下编程需要了解Windows的消息机制以及回调(callback)函数的原理;
MFC是Win32API的包装类,需要理解文档视图类的结构,窗口类的结构,消息流向等等;
COM是代码共享的二进制标准,需要掌握其基本原理等等。
VC++应用程序的开发主要有两种模式,一种是WINAPI方式,另一种则是MFC方式,传统的WINAPI开发方式比较繁琐,而MFC则是对WINAPI再次封装,所以MFC相对于WINAPI开发更具备效率优势。
VC基于C,C++语言,主要由是MFC组成,是与系统联系非常紧密的编程工具,它兼有高级,和低级语言的双重性,功能强大,灵活,执行效率高,几乎可说VC在Windows平台无所不能。
MSComm作为一个串行通讯控件为程序员串口通讯编程节省了很多时间。
在基于对话框的应用中加入一个MSComm控件非常简单。
只需进行以下操作即可:
打开“Project->
AddToProject->
ComponentsandControls->
RegisteredActivexControls”,然后选择控件:
MicrosoftCommunicationControl,version6.0插入到当前的工程中。
这样就将类CMSComm的相关文件mscomm.cpp和mscomm.h一并加入到了工程中。
编程时只需将控件对话中的MSComm控件拖至你的应用对话框中就OK了。
MSComm控件提供了两种处理通信的方法:
1.事件驱动通信,是一种功能很强的处理串口活动的方法。
例如,当在CD(CarrierDetect)线或RTS(RequestToSend)线上有字符到达或发生了改变,在这种情况下,可以使用MSComm控件的OnComm事件捕获和处理这些通信事件。
OnComm也可以捕获和处理通信中的错误。
2.可以在每个重要的程序功能之后检查CommEvent属性的值来检测事件和通信错误。
使用的每个MSComm控件都与一个串口对应。
如果在应用程序中需要访问多个串口,必须使用多个MSComm控件,可以在Windows控制面板中修改串口地址的中断地址。
MSComm控件有很多重要的属性,如:
CommPort属性:
设置并返回通讯端口号。
RThreshold属性:
在MSComm控件设置CommEvent属性为comEReceive并产生OnComm之前,设置并返回的要接收的字符数。
CTSHolding属性:
确定是否可通过查询ClearToSend(CTS)线的状态发送数据。
ClearToSend是调制解调器发送到相联计算机的信号,指示传输可以进行。
该属性在设计时无效,在运行时为只读。
SThreshold属性:
在MSComm控件设置CommEvent属性为comEvSend并产生OnComm事件之前,设置并返回传输缓冲区中允许的最小字符数。
CDHolding属性:
通过查询CarrierDetect(CD)线的状态确定当前是否有传输。
CarrierDetect是从调制解调器发送到相联计算机的一个信号,指示调制解调器正在联机。
DSRHolding属性:
确定DataSetReady(DSR)线的状态。
DataSetReady信号由调制解调器发送到相连计算机,指示作好操作准备。
Settings属性:
设置并返回波特率、奇偶校验、数据位、停止位参数。
InputLen属性:
设置并返回Input属性从接收缓冲区读取的字符数。
1.2系统设计方案
1.2.1应用型GIS开发的三种实现方式
(1)独立开发
不依赖于任何GIS工具软件,从空间数据的采集、编辑到数据的处理分析及结果输出,所有的算法都由开发者独立设计,然后选用某种程序设计语言,如VisualC++、Delphi等,在一定的操作系统平台上编程实现。
这种方式的好处在于无须依赖任何商业GIS工具软件,减少了开发成本,但一方面对于大多数开发者来说,能力、时间、财力方面的限制使其开发出来的产品很难在功能上与商业化GIS工具软件相比,而且在购买GIS工具软件上省下的钱可能还抵不上开发者在开发过程中绞尽脑汁所花的代价。
(2)单纯二次开发
完全借助于GIS工具软件提供的开发语言进行应用系统开发。
GIS工具软件大多提供了可供用户进行二次开发的宏语言,如ESRI的ArcView提供了Avenue语言,MapInfo公司研制的MapInfoProfessional提供了MapBasic语言等等。
用户可以利用这些宏语言,以原GIS工具软件为开发平台,开发出自己的针对不同应用对象的应用程序。
这种方式省时省心,但进行二次开发的宏语言,作为编程语言只能算是二流,功能极弱,用它们来开发应用程序仍然不尽如人意。
(3)集成二次开发
集成二次开发是指利用专业的GIS工具软件,如MapInfo、ArcView等,实现GIS的基本功能,以通用软件开发工具尤其是可视化开发工具,如VisualC++、Delphi、VisualBasic、PowerBuilder等为开发平台,进行二者的集成开发。
集成二次开发目前主要有两种方式:
1)OLE/DDE
采用OLEAutomation技术或利用DDE技术,用软件开发工具开发前台可执行应用程序,以OLE自动化方式或DDE方式启动GIS工具软件在后台执行,利用回调技术动态获取其返回信息,实现应用程序中的地理信息处理功能。
2)GIS控件
利用GIS工具软件生产厂家提供的建立在OCX技术基础上的GIS功能控件,如ESRI的MapObjects、MapInfo公司的MapX等,在VC++等编程工具编制的应用程序中,直接将GIS功能嵌入其中,实现地理信息系统的各种功能。
1.2.2三种实现方式的分析
由于独立开发难度太大,单纯二次开发受GIS工具提供的编程语言的限制差强人意,因此结合GIS工具软件与当今可视化开发语言的集成二次开发方式就成为GIS应用开发的主流。
它的优点是既可以充分利用GIS工具软件对空间数据库的管理、分析功能,又可以利用其它可视化开发语言具有的高效、方便等编程优点,集二者之所长,不仅能大大提高应用系统的开发效率,而且使用可视化软件开发工具开发出来的应用程序具有更好的外观效果,更强大的数据库功能,而且可靠性好、易于移植、便于维护,尤其是使用OCX技术利用GIS功能组件进行集成开发,更能表现出这些优势。
由于上述优点,集成二次开发正成为应用GIS开发的主流方向。
这种方法唯一的缺点是前期投入比较大,需要同时购买GIS工具软件和可视化编程软件,但“工欲善其事,必先利其器”,这种投资值得。
目前许多软件公司都开发了很多ActiveX控件,合理选择和运用现成的控件,减少了开发者的编程工作量,使开发者避开某些应用的具体编程,直接调用控件,实现这些具体应用,不仅可以缩短程序开发周期,使编程过程更简洁,用户界面更友好,可以使程序更加灵活、简便。
与利用OLEAutomation技术作为服务器的MapInfo相比,利用控件开发速度快,占用资源少,而且易实现许多底层的编程和开发功能[4]。
第二章电子导航基本功能在VC++中的实现
2.1利用MapX实现GIS基本功能
在进行MapX开发之前,首先要在计算机中正确的安装了MapX控件和VC++应用程序。
下面就用一个具体的实例,介绍在VC++中集成MapX的方法。
2.1.1将MapX支持类库加入工程
利用VC++环境下的应用程序生成向导创建一单文档界面应用程序VCDZDH。
先将位于MapX的安装路径下的子目录Samples40\C++\Cpp中的MapX.h和MapX.cpp文件拷贝到当前应用程序所在的VCDZDH文件夹下,然后从Project菜单中选择AddtoProject>
Files命令,此时打开了InsertFilesintoProject对话框,选择VCDZDH文件夹下的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”
ClassCVCDZDHView:
:
publicCView
{
protected:
CMapXm_ctrlMapX;
//声明CMapX类型的变量m_ctrlMapX
}
2)为MapX创建一个资源ID。
选择ViewResourceSymbols,并点击New按钮,输入名称IDC_MAP,值取默认数值。
3)在VCDZDHView.h文件中声明int类型的全局变量m_created和CString类型的全局变量m_tempclientpath。
通过类向导创建消息映射函数WM_CREATE。
选择“建立类向导”或使用快捷键CTRL+W,可以打开类向导。
从类名中选择CVCDZDHView类,在消息框中选择WM_CREATE消息,然后添加函数,编辑代码创建MapX对象。
代码如下:
intCVCDZDHView:
OnCreate(LPCREATESTRUCTlpCreateStruct)
if(!
m_ctrlMapX.Create(NULL,WS_VISIBLE,CRect(0,0,100,100),this,IDC_MAP))
return-1;
4)采用同样的方法创建WM_SIZE消息映射函数。
该函数用来调整地图大小使其充满客户区。
具体代码如下:
voidCVCDZDHView:
OnSize(UINTnType,intcx,intcy)
CView:
OnSize(nType,cx,cy);
m_ctrlMapX.MoveWindow(0,0,cx,cy);
//调整地图大小
5)采用同样的方法创建WM_SETFOCUS消息映射函数。
修改函数使得当窗口获得焦点时,地图控件获得焦点。
具体代码如下。
OnSetFocus(CWnd*pOldWnd)
OnSetFocus(pOldWnd);
m_ctrlMapX.SetFocus();
//当窗口获得焦点时,地图控件获得焦点
通过以上步骤,将应用程序编译运行就可显示地图。
如图2.1所示:
图2.1地图的显示
2.2使用地图标准工具
在地图显示出来后,用户通常要以各种比例查看地图的全局、局部或细部,必须提供诸如放大、缩小和漫游等功能。
采用MapX通用工具,可以非常方便地实现上述功能。
设定MapX使用标准工具的方法很简单,只需设定地图对象的CulrentTool属性。
下面的例子是用标准放大工具实现放大功能。
添加新菜单项资源,输入标题“工具”,在“工具”下添加子菜单,输入标题“放大”及ID为ID_ZOOM_IN。
打开类向导,选择视图类CVCDZDHView,为菜单项ID_ZOOM_IN添加COMMAND消息映射函数OnZoomIn(),并编辑代码如下。
OnZoomIn()
m_ctrlMapX.SetCurrentTool(miZoomInToo1);
//miZoomInTool为放大工具的常量
编译运行程序,选择“工具>
放大”,就会看到此时光标变为放大镜,单击鼠标就会实现放大功能。
如图2.2所示:
图2.2放大功能演示
可用相同方法实现缩小、漫游、全图等标准工具的功能。
其它的功能跟上面的方法类似,只是需要修改指示常量。
表2.1中列出了部分MapX工具的指示常量[9]。
表2.1部分MapX工具的指示常量
2.3图层控制工具
为了使用户方便查询各个图层,通常要在电子导航系统中设计图层控制工具。
在菜单中建立图层控制菜单,设置图层控制ID为ID_VIEW_LAYERCONTROL,然后建立类向导,选择CVCDZDHView类,添加如下函数:
OnViewLayercontrol()
try
VARIANTvHelpFile,vHelpID;
vHelpFile.vt=VT_ERROR;
vHelpFile.scode=DISP_E_PARAMNOTFOUND;
vHelpID.vt=VT_ERROR;
vHelpID.scode=DISP_E_PARAMNOTFOUND;
CMapXLayerslayers=m_ctrlMapX.GetLayers();
layers.LayersDlg(vHelpFile,vHelpID);
catch(COleDispatchException*e)
{
e->
ReportError();
e->
Delete();
catch(COleException*e)
这样,就添加上了图层控制工具,运行程序,该功能如图2.3所示:
图2.3图层控制工具
第三章自定义工具测量折线距离
MapX提供的地图标准工具能满足一般需要,但在一些特殊地方,用户可能需要某种特殊工具来完成某些特定的地图操作功能。
因此,MapX提供了用户自定义工具的方法,这样可以大大扩展MapX的应用范围。
可使用地图对象的CreateCustomTool方法创建自定义工具。
下面是用自定义工具实现折线距离的计算。
3.1创建用户自定义工具
为了满足用户需要,使用户方便查询两地之间的距离,我们利用自定义工具在电子导航系统中设计了折线距离计算功能。
首先,在VCDZDH.h文件中定义常量。
#defineMYTOOL_DISTANCE1
然后,在VCDZDH.cpp文件中的OnCreate()函数中加入如下代码,从而创建一个用户自定义工具。
OnCreate(LPCREATESTRUCTlpCreateStruct)
if(CView:
:
OnCreate(1pCreateStruct)==-1)
return-1;
……
m_ctrlMapX.CreateCustomTool(MYTOOL_DISTANCE,miToolTypePoly,miCrossCursor);
//MYTOOL_DISTANCE代表自定义工具的常量,miToolTypePoly描述了该工具的行为是画折线,miCrossCursor表示指定光标的形式
return0;
3.2编程实现自定义工具的行为
在创建了用户自定义工具后,需在ToolUsed事件中实现该工具是如何工作的。
要处理MapX事件,首先需要为要处理的事件创建一事件槽,其方法如下。
在VCDZDHView.h文件中,在DECLARE_MESSAGE_MAP()行下面加入如下一行代码。
DECLARE_EVENTSINK_MAP()
然后在VCDZDHView.cpp文件中,加入如下代码。
BEGIN_EVENTSINK_MAP(CVCDZDHView,CView)
ON_EVENT(CVCDZDHView,IDC_MAP,11,OnPolyTooIUsedMap,VTS_I2VTS_I4VTS_DISPATCHVTS_BOOLVTS_BOOLVTS_PBOOL)//11代表PolyToolused,OnPolyToolUsedMap是事件响应函数的名称。
END_EVENTSINK_MAP()
BEGIN_EVENTSINK_MAP(CVCDZDHView,CView)和END_EVENTSINK_MAP()两行代码之间加入的,就是要处理的事件。
切换到VCDZDHView.h文件中,声明事件响应函数,代码如下。
voidOnPolyToolUsedMap(shortToolNum,longFlags,LPDISPATCH
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于vc 的电子导航系统 基于 vc 电子 导航系统