2024年1月1日发(作者:)

网络出版时间:2010-12-31 10:51网络出版地址:/kcms/detail/cEngine插件式GIS二次开发框架的设计与实现

孙 丽,高 飞,胡小华,马传松

(①合肥工业大学 土木与水利工程学院,合肥 230009;②合肥市国土资源局,合肥 230000;③广东南方数码科技有限公司,广州 510665)

【摘 要】本文针对GIS实际二次开发模式中存在的一些问题,提出了一种更易于开发应用程序的框架模式,框架基于ArcEngine与.NET平台进行开发,采用插件式开发技术,按照ArcObjects框架接口规范,在ArcEngine下实现、重写框架类并进行封装而成,通过动态配置管理方式动态地生成菜单、停靠窗体和工具栏等,可以方便地定制应用程序界面。本文通过实例演示了该架构设计在国土GIS应用系统中的实现与应用。

【关键词】GIS;ArcEngine;插件式;动态配置管理;宿主程序

【中图分类号】P208 【文献标识码】A 【文章编号】1009-2307(2011)05- -

①①①②③Design and realization of framework for plug-in GIS secondary development based on

ArcEngine

Abstract: In the actual secondary development pattern of GIS, some problems still exist. For

resolving them, this paper put forward a framework pattern of plug-in GIS secondary development which

would be more prone to developing and applying. This application framework is based on ArcEngine

and .NET development platform, using plug-in development techniques, according to the specification of

ArcObjects interface, realizing the ArcObjects interface, rewriting main framework class and forming

encapsulation. To achieve the purpose of easily customizing the application, using XML Configuration

Management, the application framework can dynamically create the menu, toolbar, floating panels and so

on. In the end, an example of land GIS application was illustrated the technology route for realizing the

framework.

Key words: GIS; ArcEngine; plug-in; dynamic configuration management; host environment

SUN Li①, GAO Fei①, HU Xiao-hua①②, MA Chuan-song③(①School of Civil Engineering, Hefei

University of Technology, Hefei 230009, China; ②Hefei Municipal Bureau of Land and Resources, Hefei

230000, China; ③Guangdong South Digital Technology Company, Guangzhou 510665, China)

1 引言

GIS是一种采集、存储、管理、分析、显示与应用地理信息的计算机系统[1]。同时,GIS也是一门以应用为目的的信息产业,它除了具有基础性和公益性特点外,还具有实际应用并创造价值的广阔市场[2]。目前,随着计算机技术的高速发展,GIS的应用已经深入到各个领域,形成诸如资源GIS、农林牧副渔GIS、国土GIS等。在我国基于GIS组件的集成二次开发逐渐成为GIS应用系统开发的主流开发模式,其优点也已为业界普遍认可,然而实际的二次开发模式,往往存在下面的情况:每一个行业应用都要经历一次完整的二次开发过程,这样大部分时间都浪费在菜单建立、工具栏按钮设计、停靠窗体设计、增加映射代码等的上面,而且对于一个开发完成的应用系统,在后续的维护中,每升级一个功能,就需要将几个程序的代码都打开、复制、粘贴、编辑、再编译、再测试,这样的工作十分繁杂。因此,很必要设计一个插件式GIS应用程序二次开发框架。另外,经分析,在各种各样的GIS应用中,常用到的一些基本GIS功能几乎是固定不变的,如视图控制中的放大、缩小等。这样在构建GIS框架时有必要将这些常用的基本功能抽象成独立的模块,以便供其他的系统共用,而避免重构。开发用户只需在应用程序框架中加入行业应用功能,这样一个行业GIS应用软件就可以快速的搭建起来。

2 插件式GIS二次开发框架设计方案

2.1 框架总体设计

基于框架模式开发的应用程序可分为两层:框架层和应用层,框架层本身是由一些更基础的类库或框架开发而成的[3]。本框架设计中,处于基础组件中最底层的是系统软件层,包括Windows2003

等操作系统与SQLServer、Oracle等商用关系数据库等系统软件,他们除了提供对硬件设备的访问外,还提供了必要的API供位于其上的所有层进行访问。位于系统软件层上,采用.NET Framework与ArcEngine组件作为基础框架层,基础框架层提供了基于系统软件层的最一般化的功能和组件,它们以编程模型的形式被提供。基础框架层之上就是自定义框架层(GIS二次开发框架层),在此自定义框架层上,提出通用逻辑,并对应用层的需求进行分析、开发与实现。框架总体设计如图1所示。

图1 框架总体设计

2.2 插件式框架模型

开发过程中,设计的主要思想是将待开发的目标软件分为两部分:①宿主程序或主框架;②功能扩展或补充模块,可定义为插件。宿主程序包含插件的程序,插件通过宿主程序进行统一管理,在宿主程序内部提供框架和插件之间以及不同插件之间完备的消息机制,对不同扩展功能进行分类并定义标准接口,插件必须实现宿主程序定义的这些标准接口,由宿主程序在与插件通信时调用,并能够在宿主程序上实现自己的逻辑,从而把不同的功能插件有机地集成到一起,有效地协同工作。同时又能把扩展功能从框架中剥离出来,降低了框架的复杂度,让框架更容易实现,使扩展功能与框架以一种很松的方式耦合,也就是实现真正意义上的“即插即用”软件开发。这样当插件的接口公开给开发人员后,开发人员就可以在不修改宿主程序的情况下对软件功能进行扩展与加强,快速的搭建行业应用系统。

框架应用程序中提供了一个框架类库,用来维护和管理框架界面元素(主菜单、工具条、导航条、停靠窗体等)的生成,提供应用系统中菜单、工具栏、地图控件(MapControl、PageControl、Toc等)的事件处理和回调,提供界面与插件、插件与插件之间的通信。另外,框架应用程序还提供配置管理单元,负责系统的界面风格设置等信息。框架模型见图2所示。

图2 框架结构模型图

2.3 框架的运行管理

框架中提供了菜单和工具栏容器接口用于兼容各种类型的界面控件,通过工具栏容器类实现工具栏容器接口,通过实现创建工具栏方法,读取指定的菜单配置文件(XML配置文件),动态生成菜单和工具条。在ArcEngine中,为命令和工具开发定义了ICommond与ITool接口,两接口中定义了生成命令和工具按钮所必须的属性和鼠标事件、键盘事件的处理方法,本框架中的所有插件都是从

ArcEngine所提供的BaseCommand和BaseTool的基础上派生出来的,因此,只要在插件类中实现这两个接口,并调用相应的接口方法,就可以实现插件类,通过封装后即可插入到应用框架中。

在对插件进行识别和管理后,宿主程序需要准确地调用插件,框架是基于事件驱动的,应用框架通过事件监视器来捕获主应用系统或插件所引发的事件,并调用相应处理程序完成事件处理,如用户在主应用系统中点击菜单项或工具按钮时,框架类库将捕获到该事件,并根据点击的菜单项名称从命令池中查找到对应的功能插件,然后调用插件中的方法完成事件处理。

3 实现技术路线

3.1 开发工具

框架基于ArcEngine9.2与微软的.NET Framework2.0平台进行开发,采用C#编程语言,按照ArcObjects框架接口规范,在ArcEngine下实现并进行封装而成。ArcEngine9.2开发工具包是一套完备的嵌入式GIS组件库和工具库,可以从底层GIS功能的层面保证系统的先进性、稳定性,能够构建独立的应用系统或者集成到第三方的应用体系中。ArcEngine对.NET开发平台有很好的支持,.NET

Framework提供了一个跨语言的统一编程环境,是一个多语言组件开发和执行环境。C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言,以其语言特性成为.NET开发的首选语言。

3.2 插件管理技术

框架设计采用. NET程序集作为插件的载体,并使用. NET的反射机制来对插件进行调用。在.NET中,要使程序集对用户有效,只要简单地把它们放在一个目录中就行了。当客户程序请求一个组件时,.NET 运行时在同一个目录搜寻程序集,找到后分析其中描述信息,以取得这个组件所提供的类的信息[4]。. Net反射技术,它通过反射机制获取程序集中的类型信息,这就意味着软件在允许时是可以获得关于类的成员、属性、方法和构造器等许多的信息[5]。根据类型定义产生一个插件实例并加载到插件池中。插件与程序之间的通信则通过定义好的接口来实现。

3.3 动态配置管理技术

框架设计中的主框架功能菜单及工具条采用动态配置管理方式,即采用XML配置文件模板方式进行配置管理。根据用户办公的具体需要,确定需要加载的功能模块,然后利用XML配置文件对框架布局信息进行修改并保存,重新启动应用程序时就会自动加载保存好的界面布局模版,这样主框架在运行时就会根据配置好的功能菜单动态的显示出来。框架的每一个菜单和工具条都有对应的功能插件,每个功能插件就是应用系统工具中最小的一个独立单元,可单独执行。

4 框架设计在国土GIS应用系统中应用

据上述对应用程序框架的研究,在插件式GIS二次开发框架的基础上进行了实际GIS项目开发的实践,开发了城镇地籍管理信息系统。在系统功能方面,将常用的基本GIS功能集成到系统平台内,将地籍GIS应用中的功能按照不同的分类封装入不同的插件中,通过插件集成到应用系统中,构成完整的系统。具体功能模块分类如图3所示。

图3 功能结构图

如果用户有新的需求,需要向系统中增加新的功能,比如增加宗地图打印功能,那么采用以下的步骤即可完成应用系统的功能模块更新:①创建一个地图打印功能的类库,类库名称为PrintManager,添加相应的引用文件(框架设计中的核心库及相应的ESRI组件);②在类库中创建新类PrintZDT,该类通过派生于BaseCommand类进行包装,代码如图4所示;③将其编译为DLL文件,名称为;④将该DLL文件拷贝到相应的文件夹中;⑤在框架菜单工具栏的配置文件中(XML配置文件)中添加如图5所示的项;⑥重新启动应用程序,将在菜单栏或工具栏上出现一个宗地图打印按钮,直接点击该按钮可以实现宗地图打印的功能操作,如图6所示;⑦快速、简单地实现系统功能模块的更新操作。

图4 派生BaseCommand代码 图5 XML配置文件添加项

图6 宗地图打印效果图

5 结束语

本框架设计是基于ArcEngine与C#进行的开发,可以动态加载.NET和Com组件,因此可以使用多种语言(VB、C++等)进行插件类开发,并可以适合任何基于ArcEngine与.NET的平台进行GIS软件的开发领域,具有很好的扩展性与通用性;框架设计通过XML配置文件动态的生成菜单和工具条,因此当用户增加新的需求时,开发人员不需要重新测试整个系统的框架和编译整个框架程序,开发人员只需将新的功能模块设计成该框架的应用插件组件,编译成DLL程序集,放入到指定的文件夹下,即可实现即插即用的效果,具有高度的可维护性;同时也能减少重复工作,降低项目成本,缩短项目周期,从而可以产生较好的经济、技术效益。对于GIS应用系统的用户来说,可以提供更好的用户体验,增加系统的易用性,缩短人与计算机应用系统之间的距离,获得更高的业务处理效率。

参考文献

[1] 陈述彭,鲁学军,周成虎.地理信息系统导论[M].北京:科学出版社,2000:220-238.

[2] 吴秀芹,张洪岩,等.ArcGIS9地理信息系统应用与实践[M].北京:清华大学出版社,2007.

[3] 蒋波涛.插件式GIS应用框架的设计与实现[M].北京:电子工业出版社,2008.

[4] Karli Wantson,等.C#入门经典[M].北京:清华大学出版社,2006.

[5] Hoffman K. VisualC#2005技术内幕[M].北京:机械工业出版社,2007.

[6] 刘仁义,刘南.ArcGIS开发宝典—从入门到精通[M].北京:科学出版社,2006:10-21.

[7] 黄杏元,汤勤.地理信息系统概论[M].北京:高等教育出版社,1990.

[8] 王君,于彩虹,柳清瑞.基于软插件技术和三成C/S结构的高等院校教务管理系统[J].辽宁大学学报(自然科学版),2002,29(2):134-137.

[9] 崔修淘,吴建平,等.插件式GIS的开发[J].华东师范大学学报(自然科学版),2005,(4):50-57.

[10] 张进军,张维勇,等.一种基于插件的软件体系结构[J].合肥工业大学学报,2005,28(4):398-401.

作者简介:孙丽(1983-),女(满族),辽宁抚顺人,测绘助理工程师,合肥工业大学在读研究生,研究方向为数字测绘技术与地理信息系统,侧重于GIS架构设计与应用技术研究。

E-mail:lngdsunli@

收稿日期:2010-03-25