基于ArcGIS Engine的GIS软件开发方法

2010-09-28 01:19吴建华
测绘通报 2010年11期
关键词:类库控件组件

吴建华

(江西师范大学地理与环境学院,江西南昌330022)

基于ArcGIS Engine的GIS软件开发方法

吴建华

(江西师范大学地理与环境学院,江西南昌330022)

介绍ArcGIS Engine体系结构、类与接口的应用方法,以及ArcGIS Engine界面开发框架与功能定制方法,最后阐述利用ArcGIS Engine组件开发GIS软件的基本过程与方法,并给出地图浏览与查询系统开发实例。希望对相关GIS系统的开发者具有较好的指导和借鉴作用。

GIS;ArcGIS Engine;组件技术;软件开发

一、引 言

由于GIS可以同时提供表征地理位置的图形信息和空间对象的属性信息,以及其独有的空间分析功能,目前已被广泛应用于测绘、遥感、国土、国防、资源、环境、交通、水利、电力、地质、农业、林业、城市规划与管理、生活信息服务等领域。GIS已经成为一项服务于信息化建设、生产、生活、科研的技术工具,如何快速、低成本地开发出满足应用需求的GIS系统已经引起GIS软件开发商、公司、企业及科研院所的关注。目前许多专业的GIS软件开发商都推出了自己的二次开发产品,如Esri公司先后推出了MapObject、ArcObjects和ArcGIS Engine;MapInfo公司推出了MapX;国内的SuperMap、MapGIS及GeoStar也都具备二次开发的功能。在二次开发平台选型中没有最好的,只有最合适的,各类产品都有自己的优势与劣势。但当前主流的二次开发产品还属于全球GIS行业的领头羊Esri公司的ArcGIS Engine产品,它具有简洁、灵活、易用、可移植性强、开发成本低等优点,受到了GIS人员的喜爱。但由于ArcGIS Engine开发方式多样、类库庞大、接口众多等原因,使得开发者很难在短期内掌握好,最终导致开发出的系统结构不合理、性能差、界面不美观等。为此,本文基于以往多个GIS项目的开发经验以及对ArcGIS Engine的深入研究,由浅入深地介绍了利用ArcGIS Engine开发GIS软件的方法。希望给GIS同行们带来有益的借鉴作用。

二、ArcGIS Engine概述

ArcGIS Engine是美国Esri公司发布的一款GIS二次开发产品,它是目前GIS业界最为著名的组件式GIS开发产品。它是对ArcGIS Desktop开发包ArcObjects组件集中的大部分接口、类、库进行封装后构成的独立的嵌入式组件,不依赖ArcGIS Desktop桌面平台。它由两部分组成:面向开发人员的开发工具包ArcGIS engine developer kit和面向最终用户的运行时环境ArcGIS engine runtime[1]。ArcGIS Engine可以在不同开发语言环境(COM、.NET、Java、C++)下开发,它提供了一系列可以在ArcGIS Desktop框架之外使用的GIS组件和可视化控件,它包含20多个类库,比如Geometry、Display、Geodatabase、System、Carto等,用户通过引用各个类库中的接口并配合控件的使用,可以方便地实现GIS功能,这使得开发者能够将精力集中到解决应用程序中的业务逻辑中,而不是从头开始开发GIS功能。开发人员可以将定制的GIS功能嵌入到已有的应用软件中或创建自定义应用软件[2]。

三、ArcGIS Engine组件应用方法

1.类库体系结构

ArcGIS Engine从功能层次上划分为以下五个部分:①基础服务:由GIS核心ArcObjects构成,几乎所有GIS应用程序都需要;②数据存取:对矢量和栅格数据进行存取;③ 地图表达:实现地图的标注、符号化及专题图的渲染;④地图分析:提供空间建模与分析功能;⑤ 开发者组件:用于开发应用程序的界面控件,如制图控件、3D控件、工具条、TOC等。

针对不同方面的功能,ArcGIS Engine提供了相应的组件类库,类库体系结构如图1所示。

图1 类库体系结构

图1中,System类库是ArcGIS最底层的组件库,该类库包含为构成ArcGIS的其他类库提供服务的组件;SystemUI库包含用户界面组件接口定义,这些用户界面组件可以在ArcGIS Engine中进行扩展,比如ICommand和ITool;Geometry类库包含了核心几何对象,如点、线、多边形等,并且定义和实现坐标系统的空间参考对象;Display类库包含了支持向输出设备绘制符号的组件;Server类库包含允许用户连接并操作ArcGIS Server的对象;Output类库用于创建图形输出到诸如打印机和绘图仪等设备,或以文件的方式导出,如导出为栅格图像格式(JPG、BMP等)。Geodatabase类库为地理数据库提供了编程API,支持多种类型对象(如Feature、tables、networks、TINs)的数据访问;GISClient类库包含了操作ArcIMS或ArcGIS Server提供的远程GIS服务的对象;DataSourcesOleDB类库提供了操作基于OleDB的数据源的工作空间;DataSourcesFile类库包含用于基于文件数据源的GeoDatabase API实现。这些基于文件的数据源包括 shapefile、coverage、TIN、CAD、SDC、StreetMap和VPF;DataSourcesGDB库包含了存储在关系数据库管理系统中基于地理数据库模型的矢量和栅格数据格式的工作空间工厂和工作空间;DataSourcesRaster库包含了适用于基于文件的栅格数据格式的工作空间工厂和工作空间; GeoDatabaseDistributed库包含了支持分布式地理数据库的检出/检入操作所必需,的对象。Carto类库包含了用于显示数据的对象,如PageLayout和Map对象,以及map layers和renders可作用于所有支持的数据类型。Location类库包含了与位置数据操作相关的对象,位置数据可以是路径事件或地理编码位置;NetworkAnalysis类库支持效用网络的创建和分析;GeoAnalyst类库包含了核心空间分析的操作,这些操作可以通过空间分析和三维分析扩展模块; 3DAnalyst类库用于数据的三维分析并支持三维数据的显示;GlobeCore类库包含用于进行球体数据分析以及支持球体数据显示的对象;SpatialAnalyst类库包含了在栅格数据和矢量数据上执行空间分析的对象。Controls类库包含用于应用开发的各类控件,如MapControl和PageLayoutControl等,也可以通过创建自定义的操作控件的命令和工具来扩展Controls类库;ArcReader Control类库支持ArcReader对象模型,用于创建自定义的基于ArcReader的应用。

2.类与接口的使用

在总体了解ArcGIS Engine的类库体系结构后,需要进一步认识类库中的类与接口并掌握它们的使用方法。类库可以简单理解为实现各种功能的类的集合,类的主要作用是定义与实现功能,解决怎么去做的问题,类有三种不同的类型(如图2所示):①抽象类(AbstractClass):这种类不能被实例化,即不能用new关键字去产生对象,抽象类的成员一般都是部分实现或者根本不实现;②组件类(CoClass):这种类可以通过new关键字直接实例化对象;③普通类(Class):不能直接使用new关键字创建对象,但它可以作为其他类的一个属性或者从其他类的对象实例化来创建,比如:ArcGIS Engine中普通类Work-Space不能用new创建,但可以通过IDataset对象的Workspace属性来创建,或通过IWorkspaceFactory对象的OpenFromFile方法实例化一个对象来创建。

图2 对象模型图

上述三种类之间的关系有四种(如图2所示):①继承(inheritance):图中的空心三角箭头表示继承关系;② 组成(composition):图中的菱形表示组成关系;③关联(association):图中的线表示关联关系;④实例化(instantiation):图中的虚线箭头表示实例化关系。

接口定义了一个对象能做什么,它实现了一组功能的属性、方法及事件。ArcGIS Engine中,一个接口由一个或多个类来实现,而一个类可以实现一个或多个接口。接口的命名都以“I”字母开头,容易识别,比如IMap。同属于一个类的接口,通过查询接口(QueryInterface)可以实现不同接口之间的切换[3],即实现一个接口对另一个接口定义的属性和方法的调用,比如IMap与IActiveView同属于Map类,IMap接口通过查询接口就可获得IActiveView接口中定义方法。在工程开发中,接口使用的基本过程如下:首先在工程中引用相应的类库,然后在程序函数或过程定义接口变量并实例化,最后调用接口的属性、方法或触发接口中的事件,从而实现程序设计中定义的功能。

四、界面开发框架与功能定制

1.界面开发框架

在了解了类库、类及接口之后,就可以着手搭建GIS软件的主界面了。通常按照C/S结构开发的GIS系统主界面应包括图3所示的七个部分,其中,工具栏、地图数据目录显示区、地图显示与操作区为主要部分,工具栏可由ToolbarControl控件实现,地图数据目录显示区可由TOCControl控件实现,地图显示与操作区通常由MapControl、PageLayoutControl等地图控件实现。在主窗体界面上添加各类控件后,还要实现ToolbarControl和TOCControl与地图控件的绑定,通过设置 ToolbarControl和TOCControl的Buddy属性即可。通过控件之间的绑定,确定了ToolbarControl中的命令与工具操作的对象是地图控件中的地图数据,而地图数据目录显示区的内容也会随着地图控件中的数据变化而变化。鹰眼导航图显示区根据用户需求决定取舍,它也是通过MapControl控件实现的,其主要作用是将地图显示与操作区的地图快速导航到用户感兴趣的区域。

图3 界面开发框架

2.GIS功能定制方法

在搭建好系统界面后,就需要进一步实现工具条按钮或菜单按钮的功能了。从是否与地图交互的角度,将功能分为两类:①命令功能:即鼠标不需要在地图显示与操作区操作(鼠标单击、移动、释放等),就可以实现对地图的访问与操作;② 工具功能:需要与地图交互才能实现对地图的访问与操作。以上两种功能可分别通过ICommad和ITool的实现来创建,而通过集成多个命令或工具就可以形成工具条或菜单。为此下面着重介绍ICommad和ITool接口的实现方法,以及工具条和菜单的定制方法。

(1)ICommand接口

首先创建一个ActiveX DLL的工程,然后创建一个类并引用SystemUI类库,最后在该类中实现ICommand接口:先在类的代码区前面书写“Implements ICommand”语句,然后在代码区具体实现ICommand接口的属性与方法。ICommand提供了Bitmap、Caption、Category、Checked、Enabled、Help-ContextID、HelpFile、Message、Name、Tooltip十个属性和OnClick、OnCreate两个方法。

(2)ITool接口实现

与ICommand接口类似,首先也要创建一个ActiveX DLL的工程,然后创建一个类并引用SystemUI类库,最后在该类中实现ITool接口:先在类的代码区前面书写“Implements ITool”语句,然后在代码区具体实现ITool接口的属性与方法。ICommand提供了Cursor属性和 Deactivate、OnContextMenu、OnD-blClick、OnKeyDown、OnKeyUp、OnMouseDown、On-MouseMove、OnMouseUp、Refresh九个方法。值得注意的是,要实现工具功能,需要在同一个类中同时实现ICommand和ITool。

(3)IToolbarDef接口与IMenuDef接口

IToobarDef接口用于集成命令和工具功能形成工具条。实现 IToobarDef接口也需要在一个 ActiveX DLL的工程的新类中实现,它提供了Caption、ItemCount、Name三个属性和GetItemInfo方法。其中ItemCount表示工具条按钮的个数,GetItemInfo用于设置指定索引位置上按钮的CLSID(实现命令或工具功能的类名称)。IMenuDef使用类似IToobarDef,结合使用IToolbarMenu、IToolbarItem等接口可以创建工具条菜单、弹出式菜单、子菜单。最后利用Toolbar-Control控件的 AddToolbarDef、AddItem等方法把上述接口实现的功能集成在ToolbarControl控件上。

五、基于ArcGIS Engine的GIS软件开发方法

1.系统开发基本过程与方法

通过对上述ArcGIS Engine开发方法的深入研究,并结合笔者以往GIS软件开发的经验,现将VB 6.0+ArcGIS Engine开发GIS软件的基本过程与方法归纳如下:

1)系统主界面设计。创建一个新的主工程,引用相关部件和类库,根据需要在主窗体上添加地图控件(MapControl或PageLayoutControl等)、框架控件(TocControl和ToolbarControl)及其他控件。通过属性设置进行框架控件与地图控件的绑定,当然也可以在程序中动态绑定。

2)产品的许可认证。所有的应用必须在运行时初始化一个产品许可,可以通过提供的License控件设置完成,也可以利用esriSystem::AoInitialize初始化产品许可。

3)GIS功能模块实现。比如地图浏览、空间查询等分别在ActiveX DLL工程中实现,模块中的每一个小功能点通过类实现ICommand或ITool,然后将多个命令和工具集成实现 IToolBarDef或IMenuDef接口。

4)功能集成到工具条控件。在主工程中引用上一步中的ActiveX DLL工程,然后通过Toolbar-Control的AddToolbarDef方法建立IToolBarDef实现类的对象与ToolbarControl的关联,例如程序语句“tbQuery.AddToolbarDefpQueryToolBar”,其中,tbQuery是 ToolbarControl控件;pQueryToolBar是IToolBarDef实现类的对象。

5)程序打包与发布。在开发完所有的功能后,就需要进行系统的打包发布,打包时需要配置好所需的数据和符号库等,由于ArcGIS Engine Runtime是ArcGIS Engine应用程序的运行环境,所以需要和应用程序一起打包。

2.GIS软件开发实例

本文在以上开发方法的指导下,基于VB 6.0+ ArcGIS Engine开发了一个小型的地图浏览与查询系统。该系统主要包括以下功能:① 地图浏览:包括地图放大、缩小、固定放大、固定缩小、平移、全屏显示、地图量算、地图书签;② 空间查询:选择空间对象查询其属性、一般条件查询空间对象、综合条件查询空间对象;③ 图层管理:包括显示、关闭、移除所有图层,显示、关闭、移除当前图层,当前图层可选与不可选等功能;④地图鹰眼。系统主界面如图4所示。

图4 地图浏览与查询系统界面

六、结束语

由于ArcGIS Engine具有简洁、灵活、易用、可移植性强、开发成本低等优点,已成为当前GIS软件二次开发的主流产品。但由于ArcGIS Engine开发方式多样、类库庞大、接口众多且关系复杂,使得许多初学者无所适从,甚至一些有开发经验的程序员也对其中的概念比较懵懂,短期内很难开发出优秀的GIS产品。为此,本文从技术的角度,对ArcGIS Engine的关键与难点技术进行了阐述与分析,介绍了利用ArcGIS Engine开发GIS软件的基本方法。期盼本文能引领GIS二次开发人员尽快进入基于ArcGIS Engine的GIS软件开发领域,尽快开发出成果,以支持他们的科研或生产应用。

[1] 朱政.通过ArcGIS Engine构建GIS应用[R].北京:2004年第六届 ArcGIS暨 ERDAS中国用户大会,2004.

[2] 杨海燕,周荣福,谷双喜.基于ArcGIS Engine的GIS开发的系统设计与实现[J].国土资源信息化,2008(1):16-18.

[3] 史永忠,曹全龙.基于ArcGIS Engine的三维地形可视化系统的研究与开发[J].现代测绘,2007,30(3):37-41.

Development Methods of GIS Software Based on ArcGIS Engine

WU Jianhua

0494-0911(2010)11-0054-04

P208

B

2009-11-10

江西师范大学博士启动基金(2644)

吴建华(1981—),男,江西鄱阳人,博士,讲师,主要从事GIS应用与开发、空间数据集成与更新研究工作。

猜你喜欢
类库控件组件
无人机智能巡检在光伏电站组件诊断中的应用
新型碎边剪刀盘组件
U盾外壳组件注塑模具设计
用Java编写客户机/服务器端应用程序
Python在数据可视化中的应用
关于.net控件数组的探讨
数据结构课程教学改革方案和应用效果
数据结构可视化类库的设计与实现
风起新一代光伏组件膜层:SSG纳米自清洁膜层
ASP.NET服务器端验证控件的使用