基于VisualC++环境下MapX的研究与应用
2015-05-15张亚军王川詹家宾
张亚军 王川 詹家宾
摘要:地理信息系统是一项以计算机为基础的新兴技术。该文首先概述了地理信息系统的基本概念,然后介绍了地理信息系统软件MapInfo MapX及其开发技术。最后,通过一个具体的示例演示了MapX在Visual C++环境进行开发的过程。
关键词:地理信息系统;MapInfo MapX;Visual C++
中图分类号: TP311 文献标识码 A 文章编号:1009-3044(2015)08-0086-03
Abstract: Geographic Information System is a new technique based on computer. This paper begins with an overview of GIS; then details the MapInfo MapX and; finally gives an instance of how to develop application using Mapx based on visual C++.
Key words: GIS; MapInfo MapX; Visual C++
1 引言
1.1 地理信息系统GIS简介
地理信息系统(Geographic Information System, GIS),system)直译为地理信息系统,是一种处理地理空间数据的信息系统[1],是一项以计算机为基础的新兴技术,它是在计算机硬、软件系统支持下,对整个或部分地球表层(包括大气层)空间中的有关地理分布数据进行采集、存储、管理、运算、分析、显示和描述的技术系统。地理信息系统处理、管理的对象是多种地理空间实体数据及其关系,包括空间定位数据、图形数据、遥感图像数据、属性数据等,用于分析和处理在一定地理区域分布的各种现象和过程,解决复杂的规划、决策和管理问题[2]。地理信息系统的出现,改变了地理信息交换的方式,并为地理学的研究注入了新活力,正如陈述彭先生所说:“ 如果说地图是地理学的第二代语言, 那么地理信息系统就是地理学的第三代语言。” [3]
地理信息系统按内容分为两类:应用型GIS与工具型GIS。应用型GIS是以某一专业、领域或工作为主要内容,而工具型GIS是支撑软件,包括空间数据输入、存储、管理、分析与输出等基本功能。目前开发应用型GIS是开发者最关心的问题。二次开发有以下三种实现方式:
独立开发。独立开发不依赖于任何GIS工具软件,从空间数据的采集、编辑到数据的处理分析及结果输出,所有的算法都由开发者独立设计,然后选用某种程序设计语言,在一定的操作系统平台上编译实现。独立开发的优点是:不依赖任何商业GIS工具软件,可减少开发成本。不足之处是:对大多数开发者来讲,开发出来的产品很难在功能上与商业GIS工具软件相比,且在GIS工具软件上省下的钱,可能抵不上开发者在开发过程中绞尽脑汁所付出的代价。
单纯二次开发。单纯二次开发完全借助于GIS工具关键提供的开发语言进行应用系统开发。GIS工具软件大多提供了可供用户进行二次开发的宏语言,如ArcView提供了Avenue语言,MapInfo公司研制的MapInfo Professional提供了MapBasic语言等。用户可以利用这些宏语言,以原GIS工具软件为开发平台,开发出针对不同应用对象的应用程序。这种方式虽省时省心,但进行二次开发的宏语言作为变成语言智能算是二流语言,功能极弱,用它们来开发应用程序仍然不尽如人意。
集成二次开发。集成二次开发指利用专业的GIS工具软件,如ArcView、MapInfo等,实现GIS的基本功能,以通用软件开发攻击尤其是可视化开发工具,如Delphi、Visual C++、Visua Basic、PowerBuilder等为开发平台,进行二者的集成开发。
1.2 MapInfo MapX简介
MapInfo MapX是美国MapInfo公司开发的低价高效、强大的ActiveX组件,可以很方便的集成到使用标准可视化编程工具开发的商业应用中。MapInfo MapX支持将地图功能添加到任何应用中,提供了一种高度可视化的方法,来显示和分析基于位置的数据,从而更好的为客户服务,更好的进行商业决策,更好的管理资产和运营。
MapInfo MapX支持开发商方便快捷的将地图功能集成到新的或已有的应用中。可以使用标准的编程语言——Visual Basic、Visual C++、Delphi、PowerBuilder和Oracle Express Objects。因为不需要学习新的或高难度的编程语言,开发者可以快速展开工作,方便的适合和实现地图功能和特性。
MapInfo MapX提供了大量的方法和事件以及其他向导来帮助简化应用开发。
2 Visual C++中创建MapX地图
在Visual C++中使用MapX,项目当中必须包含MapX.cpp和MapX.h两个文件,可以在MapX的示例当中找到这两个文件。在Visual C++中创建MapX地图,可以根据需要在主视图或对话框中创建。下面分别对这两种方式进行简单介绍。
2.1 在主视图中创建地图
首先,用Visual C++创建一个工程。通过菜单File->New,在Projects窗口选中MFC AppWizard(exe),在右侧填写项目名称。在接下来的第一步,选择Single document,其他步骤选择默认设置。
工程建立完毕以后,为了使用MapX,将MapX.cpp、MapX.h兩个文件复制到工程的根目录里面,然后使用菜单Project->Add To Project->Files,选择MapX.cpp和MapX.h两个文件,将其加入到成当中。添加到工程以后,Visual C++中的ClassView当中会显示MapX提供的类,如图1所示。所有MapX相关类都以“CMapX”开头,后面为具体的类名。不要选择“项目”->“组件和控件”命令。这样做将会创建一个 .cpp 文件,但该文件将是不完整的[4]。
1)为在工程中使用MapX,在自己创建的视图类CMapView的头文件中,添加如下代码:
3 简单开发实例
本节通过在对话框插入MapX,然后开发工具测量地图上任意两点间的距离,演示采用Visual C++进行MapX开发的基本方法。
3.1 为对话框添加快捷菜单
通过菜单Project->Add To Project->Components and Controls …打开Components and Controls Gallery对话框,选择“Visual C++ Components”文件夹里面的“Pop-up Menu”,双击和点击“Insert”插入快捷菜单,在弹出的Pop-up Menu对话框中,在“Add pop-up menu to:”里面选择MapX所对应的对话框。
然后在ResourceView窗口选中新建的快捷菜单进行编辑,保留“开始测距”和“结束测距”两个菜单,ID分别为ID_MAP_BDIS和ID_MAP_EDIS。运行程序,右键点击地图,即可得到快捷菜单。
3.2 开发地图上任意两点间距离的计算
在MapX当中,提供了计算两点间距离的函数double CMapX::Distance(double X1, double Y1, double X2, double Y2),其中(X1,Y1)、(X2,Y2)分别对应了地图上两点的经纬度。但是,用鼠标获取的点的坐标都是屏幕坐标,不能直接用该函数计算距离,必须转化成地图上的经纬度。MapX提供了一个经纬度和屏幕坐标间相互转化的函数,void CMapX::ConvertCoord(float* ScreenX, float* ScreenY, double* MapX, double* MapY, short Direction),从参数名称可以对其功能一目了然,Direction则是一个标志位,表示转化是由屏幕坐标转换到地图坐标,还是由地图坐标转换到屏幕坐标,取值为miMapToScreen=0,或miSceeenToMap=1。
为了保存鼠标点击位置,为对话框类CMapdlgDlg增加四个成员变量,double StartX、double StartY、double EndX、double EndY,分别保存鼠标按下和弹起时地图坐标的经纬度。之后再增加成员变量double Distance保存计算得到的两点间的距离。
通过View->ClassWizard打开ClassWizard对话框,在Class name选择对话框类“CMapdlgDlg”,然后在Object IDs选择MapX对应的资源符号“IDC_MAP1”,在Message选择“MouseDown”和“MouseUp”,点击“Add Function”。
4 结束语
本文首先概述地理信息系统GIS,然后介绍了在Visual C++下引入MapX的方法,最后通过一个简单的示例说明了在Visual C++下采用对话框的方式开发MapX的方法。限于篇幅,该示例非常简单,但涵盖了在Visual C++下MapX开发常用的技术,具有一定的借鉴意义。
参考文献:
[1] 犁夏,刘凯.GIS 与空间分析原理与方法[M].北京:科学出版社.2006
[2] 尹旭日,张武军.Visual C++环境下MapX的開发技术[M].北京:冶金工业出版社,2009.
[3] 李连营,李清泉,李汉武,等.基于MapX的GIS应用开发[M].武汉:武汉大学出版社,2003.
[4] Troy. MapX开发人员指南[M].纽约:MapInfo公司,2002.