浅谈VC++ 环境下MAPGIS 二次开发的实现

   2024-01-18 互联网1270
核心提示:  【摘 要】目前,利用VC++基于MAPGIS平台已经研发出很多适合各领域的应用软件,包括神舟六号返回搜救系统。本文简要介绍了目

  【摘 要】目前,利用VC++基于MAPGIS平台已经研发出很多适合各领域的应用软件,包括神舟六号返回搜救系统。本文简要介绍了目前MAPGIS二次开发的四种开发方式,并将详细介绍两种方式的VC++具体实现方法,以供开发者选用适当的二次开发方式开展应用开发工作。

  【关键词】VC++;MAPGIS二次开发;API;MFC;COM;ActiveX

  0.引言

  MAPGIS 为支持用户进行二次开发,提供了包括从最基本数据单元的读取、保存、更新和维护到地图库的建立和漫游,以及空间分析、图象处理等一系列功能完整的二次开发函数库, 用户完全可以在MAPGIS 平台上开发面向各自领域的应用系统。 神舟六号返回搜救系统———“载人航天任务主着落场搜救辅助决策系统”就是以 MS-VisualC++ 5.0 为开发语言,利用 Win32 API 函数和 MAPGIS API 函数,基于MAPGIS 地理信息系统平台开发研制的。

  1. MAPGIS二次开发方式成熟实用的地理信息系统的重要标志就是它能够提供给用户二次开发的能力。 目前,二次开发库以 API 函数、MFC 类库、COM 组件、

  ActiveX 控件四种方式提供[1]。

  1.1 API(Application Program Interface)即微软提供的 Windows 操作系统下应用程序的编程语言接口。 MAPGIS 二次开发库的实现被封装于若干动态连接库(DLL)中,是独立于开发工具的。

  1.2 MFC(Microsoft Foundation Class) 微软提供的基础类 ,MAPGIS为运用 MFC 的开发者提供了多个基于 MFC 的可重用基类 (如图 1),将应用程序所需的常见基本功能作了封装,开发者从这些基类下派生即自动获得了从窗口显示控制到图形查询编辑的各项功能, 使用便利,改动灵活。 这些类的功能及继承关系如下[2]:

  CGisView 类是 MAPGIS 类库中大多数类的基类。它封装了窗口管理的各种功能及操作,还支持窗口的保护和快速恢复等;CGisEditView类封装了 MAPGIS 编辑处理的基本数据对象和方法。 CGisEditView 类及其基类组成了十分强大的图形编辑函数库;CPrjEditView 类集成了对工程文件进行编辑处理所必需的数据对象的方法,具有对整个工程文件的各个文件编辑处理功能;CPrjListView 类集成了对工程文件进行控制处理所必需的数据对象的方法,具有对整个工程文件的各个文件编辑处理功能。

  1.3 COM 组件 (Component Object Model) 开发的基本思想是把MAPGIS 的各大功能模块划分为几个控件 , 每个控件完成不同的功能,在软件开发中实现功能重用,开发者只需简单调用功能接口即可。基于 COM 技术的 MAPGIS 组件被包含在一系列 Windows 动态连接库(.dll)文件里。

  1.4 ActiveX 控件是一种更高层次和更加通用的应用接口,使得在可视化程度很高的开发环境(如 VB 和 DELPHI)下进行二次开发更加方便,代码的可复用性更高。

  2.具体实现方法

  VC++语言功能强大,具有代码执行效率高等优点,而且还可以在VC++中灵活地调用 MAPGIS 中各个层面的二次开发方法。 在此将常用的两种开发方式(MFC 类库和组件)详细叙述:

  2.1 MFC 类库方式具体实现[2]

  首先安装 MAPGIS 二次开发库, 这些库函数是使用 VC++开发MAPGIS 应用程序最快速有效的方法。 下面创建一个简单的 MAPGIS图形编辑窗口。

  第一步:利用 VC++的程序向导(AppWizard)创建一个工程(名为Test),点击 FiNIsh 即可。

  第二步:对 VC++的工作环境进行必要的设置。 分以下三个部分:

  (1)字节设置 :选择 Project 菜单下的 Settings 命令 ,在 C/C++页面上 Category 一栏选择 CODe Generation, 将 Struct Member Alignment 设定为 1 Byte。

  (2)输出目录设置 :选择 Project 菜单下的 Settings 命令 ,在 General页 面 上 Output files 一 栏 , 填 写 mapgis 应 用 程 序 目 录 , 如 :c:mapgis66program。 这样就把生成的可执行文件输出到 MAPGIS 动态连接库所在的目录下。

  (3)包含库设置:选择 Tools 菜单下的 Options 命令 ,在 Directory 页面上 Show directories for 一栏选择 include files, 在 Directories 下填写MAPGIS 二次开发库头文件目录 ,如,C: mapgis66include;然后 ,在此页面上的 Show directories for 一栏再选择 library files,在 Directories 下填写 MAPGIS 二次开发库目录,例如,C: mapgis66lib。 这样就设置了头文件及库文件的路径。

  第三步:应用 MAPGIS 中的类和函数。 首先在工程的视图类定义(即 TestView.h 文件 )前加入 #include “CGisView.h”,然后将视图类从CView 派生改为从 MAPGIS 中的 CGisView 类派。 方法是:分别在视图类的头文件(TestView.h)和实现文件(TestView.cpp)中,用 VC++ 的查找替换功能(Edit 菜单下的 replace 命令或是热键 Ctrl+H )在弹出的替换对话框中选中左边三个复选框,然后点击“replace All”即可。 替换完成后就实现了视图类从 CGisView 的继承。第四步: 为了完成绘图工作的预处理, 调用 CGisView 类中的OnDraw (pDC) 函数 。 在其中加入这样一条语句 CGisView::OnDraw(pDC)。编译连接并执行, 在客户区单击鼠标右键会出现一个放大窗口、缩小窗口、移动窗口、显示范围、显示比例、坐标转换等 MAPGIS 功能的快捷菜单,在此基础上我们还可以随意地添加自己想要的功能。

  2.2 组件方式具体实现[3]

  在使用 MAPGIS 组件之前,必须先注册,运行 MAPGIS 二次开发包中的 setup.exe 可以自动安装、注册组件。或进行手工注册:将要注册的组件拷贝到 MAPGIS 的 program 目录下,选择 Windows 操作系统开始菜单的运行,输入“regsvr32 组件地址”进行组件的注册。 在 VC++中使用 MAPGIS 组件对象的步骤如下:

  (1)嵌入 MAPGIS 对象和 COM 头文件,并链接到 COM 库。MAPGIS对象完整的 C 语言说明包含在一系列 *.h 文件中, 对应的组件类 ID和接口 ID 则包含在 *.c 文件中。 VC++项目的 Library 设置或 LIB 环境变量应指向含有这些文件的目录。 选择 Tools 菜单下的 Options,在Directories 页 中 Show directories for 一 栏选择include files, 在Directories 下填写文件目录,如 C: mapgis66include。

  (2)初始化 COM 库。 在调用任何 MAPGIS 组件对象之前,MAPGIS应用程序必须使用 CoInitialize 函数初始化 COM 库。 如:hr=CoInitialize(NULL)。

  (3) 建立 MAPGIS 对象。 声明 MAPGIS 对象指针变量, 然后使用COM 的 CoCreateInstance 函数建立 MAPGIS 对象的 IPntArea *ptPAi;

  Hr =CoCreateInstance (CLSID_PntArea, NULL,CLSCTX_INPROC_SERVER,IID_IPntArea,(void**)&ptPAi);其中,第一个参数是 MAPGIS 对象的类ID;第四个参数是MAPGIS 对象的接口 ID;最后一个参数是 MAPGIS“对象指针 ”变量的地址。

  (4)使用 MAPGIS 对象和其它对象。 至此,就可以象使用任何对象一样调用对象的属性、方法和事件。

  (5) 释放 MAPGIS 对象。 当程序使用完它所创建的 MAPGIS 对象后,必须使用 Release 函数释放该对象。

  (6)解除 COM 库的初始化。完成 MAPGIS 或 COM 函数的全部使用后,程序须调用 CoUninitialize 函数解除对 COM 库的初始化。

  3.结语

  在四种开发方式中,API 函数方式是基础, 其编程灵活但技巧性高、编程量也大;MFC 类库则是把一些 API 功能进行封装,屏蔽了基于 MAPGIS API 之上开发程序的许多复杂性,可灵活地增加自己特定的功能,编程量中等。在实际应用中,类库也不可能包括用户要实现的所有操作,仍使用 MAPGIS API 对底层的功能进行补充,将类库和 API混合起来进行开发;组件开发速度快,占用资源少,具有二次开发方便、易于集成、无限扩展等特点,而且易实现许多底层的编程和开发,从一定意义上说它代表了 GIS 的发展方向;ActiveX 控件和组件的共同点是可以用来增强软件的功能和提高代码的复用性,且当前的组件式 MAPGIS 就是将控件与组件结合进行二次开发。不同的开发方式各有优缺点,可满足不同行业、不同层次具体工作的需要。应用者可根据应用工程的具体要求及本部门开发人员的编程技术水平,采用适当的二次开发方式,开发符合行业需要的应用型GIS 系统。

  【参考文献】

  [1]解华明,陈守余.基于 MAPGIS 的钻孔柱状图绘制软件的编制[J].物探化探计算技术2004,26(1):85-90.

  [2]中国地质大学(武汉)信息工程学院.MAPGIS 地理信息系统开发手册[M].武汉华地图形数据公司,1998.

  [3]中地软件丛书编委会. MAPGIS 组件开发手册 [M].武汉中地信息工程有限公司,2002.


 
举报收藏 0打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  隐私政策  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  RSS订阅