一、引言
由于GIS可以同时提供表征地理位置的图形信息和空间对象的属性信息,以及其独有的空间分析功能,目前已被广泛应用于测绘、遥感、国土、国防、资源、环境、交通、水利、电力、地质、农业、林业、城市规划与管理、生活信息服务等领域。GIS已经成为一项服务于信息化建设、生产、生活、科研的技术工具,如何快速、低成本地开发出满足应用需求的GIS系统已经引起GIS软件开发商、公司、企业及科研院所的关注。目前许多专业的GIS软件开发商都推出了自己的二次开发产品,如Esri公司先后推出了MapObject、ArcObjects和ArcGISEngine;MapInfo公司推出了MapX;国内的Su-perMap、MapGIS及GeoStar也都具备二次开发的功能。在二次开发平台选型中没有最好的,只有最合适的,各类产品都有自己的优势与劣势。但当前主流的二次开发产品还属于全球GIS行业的领头羊Esri公司的ArcGISEngine产品,它具有简洁、灵活、易用、可移植性强、开发成本低等优点,受到了GIS人员的喜爱。但由于ArcGISEngine开发方式多样、类库庞大、接口众多等原因,使得开发者很难在短期内掌握好,最终导致开发出的系统结构不合理、性能差、界面不美观等。为此,本文基于以往多个GIS项目的开发经验以及对ArcGISEngine的深入研究,由浅入深地介绍了利用ArcGISEngine开发GIS软件的方法。希望给GIS同行们带来有益的借鉴作用。
二、ArcGISEngine概述
ArcGISEngine是美国Esri公司发布的一款GIS二次开发产品,它是目前GIS业界最为著名的组件式GIS开发产品。它是对ArcGISDesktop开发包ArcObjects组件集中的大部分接口、类、库进行封装后构成的独立的嵌入式组件,不依赖ArcGISDesk¬top桌面平台。它由两部分组成:面向开发人员的开发工具包ArcGISenginedeveloperkit和面向最终用户的运行时环境ArcGISengineruntime11。ArcGISEngine可以在不同开发语言环境(COM、.NET、Ja-va、C++)下开发,它提供了一系列可以在ArcGISDesktop框架之外使用的GIS组件和可视化控件,它包含20多个类库,比如Geometry、Display、Geodata¬base、System、Carto等,用户通过引用各个类库中的接口并配合控件的使用,可以方便地实现GIS功能,这使得开发者能够将精力集中到解决应用程序中的业务逻辑中,而不是从头开始开发GIS功能。开发人员可以将定制的GIS功能嵌入到已有的应用软件中或创建自定义应用软件0。
三、ArcGISEngine组件应用方法
1.类库体系结构
ArcGISEngine从功能层次上划分为以下五个部分:①基础服务:由GIS核心ArcObjects构成,几乎所有GIS应用程序都需要;②数据存取:对矢量和栅格数据进行存取;③地图表达:实现地图的标注、符号化及专题图的渲染;④地图分析:提供空间建模与分析功能;⑤开发者组件:用于开发应用程序的界面控件,如制图控件、3D控件、工具条、TOC等。
针对不同方面的功能,ArcGISEngine提供了相图1中,System类库是ArcGIS最底层的组件库,该类库包含为构成ArcGIS的其他类库提供服务的组件;SystemUI库包含用户界面组件接口定义,这些用户界面组件可以在ArcGISEngine中进行扩展,比如ICommand和ITool;Geometry类库包含了核心几何对象,如点、线、多边形等,并且定义和实现坐标系统的空间参考对象;Display类库包含了支持向输出设备绘制符号的组件;Server类库包含允许用户连接并操作ArcGISServer的对象;Output类库用于创建图形输出到诸如打印机和绘图仪等设备,或以文件的方式导出,如导出为栅格图像格式(JPG、BMP等)。Geodatabase类库为地理数据库提供了编程API,支持多种类型对象(如Feature、tables、net-works、TINs)的数据访问;GISClient类库包含了操作ArcIMS或ArcGISServer提供的远程GIS服务的对象;DataSourcesOleDB类库提供了操作基于OleDB的数据源的工作空间;DataSourcesFile类库包含用于基于文件数据源的GeoDatabaseAPI实现。这些基于文件的数据源包括shapefile、coverage、TIN、CAD、SDC、StreetMap和VPF;DataSourcesGDB库包含了存储在关系数据库管理系统中基于地理数据库模型的矢量和栅格数据格式的工作空间工厂和工作空间;DataSourcesRaster库包含了适用于基于文件的栅格数据格式的工作空间工厂和工作空间;GeoDatabaseDistributed库包含了支持分布式地理数据库的检出/检入操作所必需,的对象。Carto类库包含了用于显示数据的对象,如PageLayout和Map对象,以及maplayers和renders可作用于所有支持的数据类型。Location类库包含了与位置数据操作相关的对象,位置数据可以是路径事件或地理编码位置;NetworkAnalysis类库支持效用网络的创建和分析;GeoAnalyst类库包含了核心空间分析的操作,这些操作可以通过空间分析和三维分析扩展模块;3DAnalyst类库用于数据的三维分析并支持三维数据的显示;GlobeCore类库包含用于进行球体数据分析以及支持球体数据显示的对象;SpatialAnalyst类库包含了在栅格数据和矢量数据上执行空间分析的对象。Controls类库包含用于应用开发的各类控件,如MapControl和PageLayoutControl等,也可以通过创建自定义的操作控件的命令和工具来扩展Con¬trols类库;ArcReaderControl类库支持ArcReader对象模型,用于创建自定义的基于ArcReader的应用。
2.类与接口的使用
在总体了解ArcGISEngine的类库体系结构后,需要进一步认识类库中的类与接口并掌握它们的使用方法。类库可以简单理解为实现各种功能的类的集合,类的主要作用是定义与实现功能,解决怎么去做的问题,类有三种不同的类型(如图2所示):①抽象类(AbstractClass):这种类不能被实例化,即不能用new关键字去产生对象,抽象类的成员一般都是部分实现或者根本不实现;②组件类(CoClass):这种类可以通过new关键字直接实例化对象;③普通类(Class):不能直接使用new关键字创建对象,但它可以作为其他类的一个属性或者从其他类的对象实例化来创建,比如:ArcGISEngine中普通类Work-Space不能用new创建,但可以通过IDataset对象的Workspace属性来创建,或通过IWorkspaceFactory对象的OpenFromFile方法实例化一个对象来创建。
上述三种类之间的关系有四种(如图2所示):
①继承(inheritance):图中的空心三角箭头表示继承关系;②组成(composition):图中的菱形表示组成关系;③关联(association):图中的线表示关联关系;④实例化(instantiation):图中的虚线箭头表示实例化关系。
接口定义了一个对象能做什么,它实现了一组功能的属性、方法及事件。ArcGISEngine中,一个接口由一个或多个类来实现,而一个类可以实现一个或多个接口。接口的命名都以“I”字母开头,容易识别,比如IMap。同属于一个类的接口,通过查询接口(QueryInterface)可以实现不同接口之间的切换H,即实现一个接口对另一个接口定义的属性和方法的调用,比如IMap与IActiveView同属于Map类,IMap接口通过查询接口就可获得IActiveView接口中定义方法。在工程开发中,接口使用的基本过程如下:首先在工程中引用相应的类库,然后在程序函数或过程定义接口变量并实例化,最后调用接口的属性、方法或触发接口中的事件,从而实现程序设计中定义的功能。
四、界面开发框架与功能定制
1.界面开发框架
在了解了类库、类及接口之后,就可以着手搭建GIS软件的主界面了。通常按照C/S结构开发的GIS系统主界面应包括图3所示的七个部分,其中,工具栏、地图数据目录显示区、地图显示与操作区为主要部分,工具栏可由ToolbarControl控件实现,地图数据目录显示区可由TOCControl控件实现,地图显示与操作区通常由MapControl、PageLay¬outControl等地图控件实现。在主窗体界面上添加各类控件后,还要实现ToolbarControl和TOCControl与地图控件的绑定,通过设置ToolbarControl和TOCControl的Buddy属性即可。通过控件之间的绑定,确定了ToolbarControl中的命令与工具操作的对象是地图控件中的地图数据,而地图数据目录显示区的内容也会随着地图控件中的数据变化而变化。鹰眼导航图显示区根据用户需求决定取舍,它也是通过MapControl控件实现的,其主要作用是将地图显示与操作区的地图快速导航到用户感兴趣的区域。
2.GIS功能定制方法
在搭建好系统界面后,就需要进一步实现工具条按钮或菜单按钮的功能了。从是否与地图交互的角度,将功能分为两类:①命令功能:即鼠标不需要在地图显示与操作区操作(鼠标单击、移动、释放等),就可以实现对地图的访问与操作;②工具功能:需要与地图交互才能实现对地图的访问与操作。以上两种功能可分别通过ICommad和ITool的实现来创建,而通过集成多个命令或工具就可以形成工具条或菜单。为此下面着重介绍ICommad和ITool接口的实现方法,以及工具条和菜单的定制方法。
(1)ICommand接口
首先创建一个ActiveXDLL的工程,然后创建—个类并引用SystemUI类库,最后在该类中实现ICommand接口:先在类的代码区前面书写“Imple-mentsICommand”语句,然后在代码区具体实现ICommand接口的属性与方法。ICommand提供了Bitmap、Caption、Category、Checked、Enabled、Help-ContextID、HelpFile、Message、Name、Tooltip十个属性和OnClick、OnCreate两个方法。
(2)ITool接口实现
与ICommand接口类似,首先也要创建一个Ac¬tiveXDLL的工程,然后创建一个类并引用SystemH类库,最后在该类中实现ITool接口:先在类的代码区前面书写“ImplementsITool”语句,然后在代码区具体实现ITool接口的属性与方法。ICommand提供了Cursor属性和Deactivate、OnContextMenu、OnD-blClick、OnKeyDown、OnKeyUp、OnMouseDown、On-MouseMove、OnMouseUp、Refresh九个方法。值得注意的是,要实现工具功能,需要在同一个类中同时实现ICommand和ITool。
(3)IToolbarDef接口与IMenuDef接口
IToobarDef接口用于集成命令和工具功能形成工具条。实现IToobarDef接口也需要在一个Ac-tiveXDLL的工程的新类中实现,它提供了Caption、ItemCount、Name三个属性和GetItemInfo方法。其中ItemCount表示工具条按钮的个数,GetItemInfo用于设置指定索引位置上按钮的CLSID(实现命令或工具功能的类名称)。IMenuDef使用类似IToobarDef,结合使用IToolbarMenu、IToolbarItem等接口可以创建工具条菜单、弹出式菜单、子菜单。最后利用Toolbar¬Control控件的AddToolbarDef、AddItem等方法把上述接口实现的功能集成在ToolbarControl控件上。
五、基于ArcGISEngine的GIS软件开发方法
1.系统开发基本过程与方法
通过对上述ArcGISEngine开发方法的深入研究,并结合笔者以往GIS软件开发的经验,现将VB6.0+ArcGISEngine开发GIS软件的基本过程与方法归纳如下:
1)系统主界面设计。创建一个新的主工程,引用相关部件和类库,根据需要在主窗体上添加地图控件(MapControl或PageLayoutControl等)、框架控件(TocControl和ToolbarControl)及其他控件。通过属性设置进行框架控件与地图控件的绑定,当然也可以在程序中动态绑定。
2)产品的许可认证。所有的应用必须在运行时初始化一个产品许可,可以通过提供的License控件设置完成,也可以利用esriSystem::AoInitialize初始化产品许可。
3)GIS功能模块实现。比如地图浏览、空间查询等分别在ActiveXDLL工程中实现,模块中的每—个小功能点通过类实现ICommand或ITool,然后将多个命令和工具集成实现IToolBarDef或IMenuDef接口。
4)功能集成到工具条控件。在主工程中引用上一步中的ActiveXDLL工程,然后通过Toolbar-Control的AddToolbarDef方法建立IToolBarDef实现类的对象与ToolbarControl的关联,例如程序语句“lbarDefpQueryToolBar”,其中,tbQuery是ToolbarControl控件;pQueryToolBar是IToolBarDef实现类的对象。
5)程序打包与发布。在开发完所有的功能后,就需要进行系统的打包发布,打包时需要配置好所需的数据和符号库等,由于ArcGISEngineRuntime是ArcGISEngine应用程序的运行环境,所以需要和应用程序一起打包。
2.GIS软件开发实例
本文在以上开发方法的指导下,基于VB6.0+ArcGISEngine开发了一个小型的地图浏览与查询系统。该系统主要包括以下功能:①地图浏览:包括地图放大、缩小、固定放大、固定缩小、平移、全屏显示、地图量算、地图书签;②空间查询:选择空间对象查询其属性、一般条件查询空间对象、综合条件查询空间对象;③图层管理:包括显示、关闭、移除所有图层,显示、关闭、移除当前图层,当前图层可选与不可选等功能;④地图鹰眼。系统主界面如图4所示。
六、结束语
由于ArcGISEngine具有简洁、灵活、易用、可移植性强、开发成本低等优点,已成为当前GIS软件二次开发的主流产品。但由于ArcGISEngine开发方式多样、类库庞大、接口众多且关系复杂,使得许多初学者无所适从,甚至一些有开发经验的程序员也对其中的概念比较懵懂,短期内很难开发出优秀的GIS产品。为此,本文从技术的角度,对ArcGISEngine的关键与难点技术进行了阐述与分析,介绍了利用ArcGISEngine开发GIS软件的基本方法。期盼本文能引领GIS二次开发人员尽快进入基于ArcGISEngine的GIS软件开发领域,尽快开发出成果,以支持他们的科研或生产应用。
中国论文网(www.lunwen.net.cn)免费学术期刊论文发表,目录,论文查重入口,本科毕业论文怎么写,职称论文范文,论文摘要,论文文献资料,毕业论文格式,论文检测降重服务。 返回通信学论文列表