基于.NET的插件式GIS应用框架

时间:2022-10-13 04:34:18

基于.NET的插件式GIS应用框架

摘要: 本文以.NET为开发平台,以C#为开发语言。首先分析了开发GIS软件中存在的问题,然后介绍了一种新的二次开发方式――插件式GIS应用框架。在此基础上,设计了MYGIS框架。设计过程主要包括框架插件引擎、框架宿主程序、框架插件三大部分。利用插件式应用框架进行二次开发具有灵活、扩充性好,功能模块之间聚合性高、耦合性低等特点。本文主要探讨以下问题①宿主程序如何识别插件对象。②插件的UI对象如何被初始化。③插件对象如何产生它们的UI对象。④插件的UI对象被触发时如何与插件产生互动。

Abstract: The thesis' development platform is .NET and development language is C#. The thesis analyzes firstly the existent problems in developing GIS software, and then introduces a new secondary development scheme――Pluggable GIS Application Framework. On the basis of the introduction, MYGIS framework is to be designed. The design process includes three main parts, Plug-in Engine, Host Application and Plug-in. Secondary development that use Pluggable Application Framework, which has the characteristics of flexibility, convenience, and extendibility.The problems settled in this thesis are as follows:①How the Host Application to distinguish the Plug-in. ②How initialize the User Interface of the Plug-in. ③How the Plug-in to produce their User Interface. ④How the User Interface of Plug-in to interact with Plug-in when it is been triggered.

关键词: 插件;框架;二次开发;宿主程序

Key words: Plug-in;Framework;secondary development;Host Application

中图分类号:TP39 文献标识码:A文章编号:1006-4311(2011)05-0175-03

0引言

本文旨在设计一个能够体现基于.NET的GIS图形生成技术的应用,而这项技术,我们通过搭建一个GIS应用框架实现出来。GIS开发是一种典型的“因势而变”工程,由于不同类型的用户在地理数据的存储、使用和部署方式上都有很大差别,根据实际需求定制开发是不可避免的。而插件式GIS框架,则是满足定制要求的最好方式之一――扩展方便、部署简单和高度可重用。为了开发这个框架,本文使用了C#2005语言、.NET Framework 2.0基础类库、ESRI的Arcgis Engine 9.2组件库和Janus WinForm Controls第三方组件库。

1插件式GIS应用框架

“框架(FrameWork)是一个系统全部或部分的可复用设计,通常由一组抽象类和类之间的协作组成”。

1.1 应用框架简介应用框架的特点:模块化、可重用性、可扩展性、简单性和可维护性。与其他应用框架不同,GIS类型的应用框架注定需要一个可视化的应用,在地理信息数据管理中,数据的可视化与存储同样重要。GIS框架最基本的功能使显示地理数据并能在此基础上进行一系列数据分析、处理和输出工作。GIS框架的可视化功能一般通过某些商业控件实现而很少有人自己亲自从底层开发开始,如使用Arcgis Engine的地图控件MapControl、PageLayoutControl和TOCControl等。为了提高工作效率和产品的可靠性、降低项目开发成本,许多GIS二次开发商都会组织公司核心程序员开发一个GIS应用框架,将一些通用的核心功能进行封装,这些框架使用的技术和策略可能各不相同,但其目的都是一样的:降低重复编码的工作量,提高编程效率,给项目人员的开发工作提供一个良好的平台和工作流程。这就是本文将要讨论的内容。

1.2 插件式应用框架插件技术是在软件的设计和开发过程中,将整个应用程序划分为宿主程序和插件对象两部分,宿主程序能够调用插件对象,插件对象能够在宿主程序上实现自己的逻辑,而两者的交互基于一种公共的通信契约。插件式GIS应用框架是插件式应用框架的一种具体类型,为了不同的目的,可以产生多种不同形式的应用框架。GIS应用框架主要用于实现某些GIS功能,例如对地理数据的访问、浏览和编辑等操作。为了让本文设计的插件式应用框架具有这些功能,我选择了ESRI的Arcgis Engine9.2组件库,使用它来建构本文的插件式应用框架的GIS部分。但是,本文的主要目标是插件式应用框架的设计思路和方法,使用GIS组件只是为了让这个框架功能丰富化和实例化,以便最终能实现本文的课题任务――基于.NET的GIS图形生成技术。为了让本文设计的插件式GIS应用框架界面更加丰富和实现某些特殊功能,我选择使用第三方界面控件Janus WinFroms Controls,它可以为.NET Windows窗体程序提供一个漂亮的界面和优雅的UI对象管理机制。

2框架总体分析

通常一个插件式应用框架包括3个组成部分,如图1所示:

①宿主程序:插件式框架的宿主程序是插件的依附对象。②框架插件:插件类型保存在插件程序集中,可以件引擎解析和宿主程序使用,是插件式框架具体功能的承载着。③附加的组件库:并不是插件式框架必要的部分,它是为了辅助框架更好地运行而开发的各种工具集和类库,如通过包装的查询类、符号化类能。

本文预备设计的插件式GIS应用框架MYGIS将以ESRI的ArcMap软件为模拟对象。既然是选择以插件式应用框架进行GIS二次开发,就不能同传统Windows程序那样,用我们熟悉的同步代码,通过对UI对象与事件的简单绑定来实现各种功能,这样两个类型之间的耦合性太强,一个类型的改变总要影响其他类型。于是,种种问题便会接踵而来,插件式架构的核心在于框架宿主程序与插件对象的通信,而宿主程序该如何识别插件对象并与插件对象建立事件关联将是本文主要探讨的问题。

2.1 宿主程序如何识别插件对象本书所指的插件,是指可以形成用户界面(User Interface,UI)并能够与用户进行人机交互的组件,他们在MYGIS中表现为命令按钮、工具按钮、工具条、菜单栏等。如图2所示,这些在界面上出现的按钮、工具条等UI对象都是根据插件对象的属性生成的,它们是各自插件对象的UI层表现形式。每个插件对象都有一个身份标识――接口,这个标识在框架设计中被称为“通信契约”。接口可以被看做是一种定义了必要的方法和属性的类型,因此宿主程序就可以通过这种契约来生成具体的UI对象并对外界操作做出事件反应。

2.2 插件的UI对象如何被初始化当宿主程序MYGIS.exe从插件程序集中获得插件对象的信息并在内存中生成插件对象时(注意,此时还是插件对象而非插件对象的UI对象),才开始根据插件对象产生各自的UI对象。插件UI对象的初始化包括3个方面,第一是宿主程序根据插件对象携带的UI信息生成实际的UI层对象,以ICommand插件对象为例,宿主程序获得这个对象的Icon、ToolTip、Name、Category、Message和HelpFile等信息后,在宿主程序的UI层面上生成一个可以供交互的UICommand命令对象。

第二是宿主程序将创建两个公共变量,它们将携带宿主程序的信息和交互方法。初始化函数如下:

Private void ICommand_Oncreate(IApplication hook)

{ ‘hook参数是一个指向宿主程序的指针

‘m_pApp供插件使用宿主程序的变量,插件可以通过这个变量获得主程序的信息

set { m_pApp=hook; }

}

第三是宿主程序将一个插件对象的UI对象与插件对象之间的交互通道建立起来,当用户在UI界面上点击一个插件UI对象后,宿主程序能够通过函数指针和回调函数调用正确的插件对象,以完成特定的操作。

2.3 插件对象如何产生它们的UI对象插件对象以不同的UI 形式出现在宿主程序上,这是插件UI对象初试化工作的一部分。由于MYGIS中的可视化组件分为ICommand、ITool、IToolBarDef、IMenuDef和IDockableWindow等类型,当宿主程序获得一个插件组件的信息后,它会依据这些插件对象的类型的差别和各自定义的属性来生成不同的UI层组件。这些UI层解析和生成的过程都将由宿主程序负责进行,插件开发人员无须考虑这个问题。

2.4 插件的UI对象被触发时如何与插件产生互动在COM机制中,通过绑定函数指针和回调函数的方式,宿主程序将指导当某个按钮按下时,需要调用哪一个对象的函数来实现该事件需要执行的功能。在.NET Framework中,事件关联被一种称为“委托”(Delegate)的机制来完成,如图3所示。

3插件式GIS应用框架MYGIS的搭建

作为一款简易的GIS二次开发软件,本文预备设计的插件式GIS应用框架MYGIS将以ESRI的ArcMap软件为模拟对象。但ArcMap并不是基于.NET机制开发的程序,它使用c++开发而成,但除了在插件识别时,.NET框架与COM插件框架有所差别外,其他步骤都非常类似,因此它可以为我们在设计一个插件式GIS应用框架时提供借鉴。

3.1 MYGIS介绍MYGIS是采用插件式GIS应用框架设计和实现的,它可以实现某些GIS功能,例如对地理数据的访问、浏览和编辑的操作。本文的主要目标是通过这个产品描述一个插件式应用框架的设计思路和方法,而并不仅仅在于这款软件本身。

3.2 具体搭建过程开发这个框架之前。机器上必须首先安装:①.NET 2.0 Framework。毫无疑问是MYGIS的基础,MYGIS直接调用了2.0框架的续作组件,如泛型等。并且后两种组件都是基于.NET 2.0 Framework开发的。②ArcGIS Engine 9.2Developer Kit。③Janus WinForms Controls(.NET版本)V3.5。

3.2.1 设计插件引擎库插件引擎库包括3个部分,一是插件式应用框架的契约设计,这些作为契约的接口用于定义MYGIS的插件对象类型,它们都继承自IPlug-in接口,这些接口包括:①ICommand接口:实现该接口的插件类型在框架UI层上会表现为一个命令按钮。②ITool接口:实现该接口的插件对象在UI层表现为一个工具按钮。③IMenuDef接口:定一个菜单栏。④IToolBarDef接口:定义一个工具条。⑤IDockableWindowDef接口:定义浮动窗体。为了宿主程序的信息能够传递给插件对象,还需定义主程序接口IApplication和它的实现类Application;同时,为了正确描述菜单栏和工具条的组成项,也要定义IItemDef接口机器实现类ItemDef。二是插件容器的设计。继承CollectionBase产生强类型容器,用来存储IPlug-in类型插件对象。三是插件的动态加载和插件分类。使用自己设计的Plug-inHandle类和ParsePlug-inCollection类。插件的动态加载使用了.NET的反射机制,它能根据一个插件类型的描述信息产生插件对象。

3.2.2 设计框架宿主程序在插件式框架的层次结构中,宿主程序是当之无愧的主角,它是一个EXE格式的可执行程序,也是整个框架的运行入口,它负责调用插件集合中的所有插件对象并将其以正确的UI形式展示,同时还负责协调这些插件对象、宿主程序上的GIS控件和其他的UI控件的交互工作。设计框架宿主程序的内容包括:①在主界面上通过拖拽控件的方式进行UI设计,如主菜单、状态栏和各种面板对象,由于它们不依赖插件的存在与否,也不是插件对象的UI形式,因此只须静态设计即可实现。如图4。②插件UI对象的动态生成,解析插件对象并根据这些对象生成UI对象。先产生出ICommand和ITool对象的UICommand,然后产生工具条和菜单栏,并将UICommand放置在后者之上。③各种UI事件与插件对象函数的绑定。这时采用事件和委托机制,它采用一种异步方式,将两个类型的交互工作“委托”给一个“中间人”实现,这种处理方式使得两个类型避免了出现交叉引用和强耦合的情况,两个类型的通信完全通过第三方,这种方式契合了本文追求的“高聚合低耦合”原则。

3.2.3 设计框架插件插件式框架的另一端是插件对象,它们是框架舞台上的主角和功能扩展的执行者,对用户而言,这才是最重要的部分。前阶段设计了框架层的通信契约和承载插件的宿主程序,这一阶段设计的就是几个具有代表性的插件类型供插件式框架MYGIS使用,即ICommand、ITool、IToolBarDef、IMenuDef和IDockableWindowDef的插件。一些实用功能如添加地图数据、放大缩小、漫游、全图和绘制编辑等都在此阶段实现。除此之外,插件式应用框架的优势在此阶段也完全显示出来,即ArcGIS Engine自身的组件和扩展框架能够无缝地衔接到本文设计的插件式GIS应用框架中。除了自己开发组件外,还能非常简单地继承ArcGIS Engine自己的扩展方式。

4结论

本文基于.NET框架,通过对组件式GIS技术的分析,还比较了Arc GIS Engine和C#等技术和语言,选择设计和实现一个插件式GIS应用框架,开发一个简易GIS产品,生成GIS图片,从中体现基于.NET的GIS图形生成技术的应用。阈于文章篇幅之限详细的代码实现及设计中采用的一些技术原理将在后期另文向大家介绍。

本文的意义在于它并不只是介绍了一个GIS开发产品,况且Arcgis Engine也仅仅是Arcgis产品大家族中的一个小成员,笔者主要是希望通过本文的完成来剖析一种GIS二次开发原理的过程,为我们开启一扇解决类似问题的知识之窗。

参考文献:

[1]兰小基,刘德儿.ArcObjects GIS应用开发――基于C#.NET[M].江西理工大学,2006年9月.

[2]蒋波涛.插件式GIS应用框架的设计与实现――基于C#和ArcGIS Engine 9.2[M].电子工业出版社,2008年10月.

[3]马骏.C#网络应用编程基础[M].人民邮电出版社,2006年10月.

[4]韩鹏.地理信息系统开发[M].武汉大学出版社,2004年9月.

[5]毛锋等.地理信息系统理论与应用丛书Arc GIS 8 开发与实践[M].科学出版社,2002-04.

[6]汤国安等.Arc View地理信息系统空间分析方法[M].科学出版社,2002-10.

上一篇:基于VAR的金融业支持对新疆中小企业发展的影响... 下一篇:基于层次分析法的数字图书馆成本衡量研究

被举报文档标题:基于.NET的插件式GIS应用框架

验证码:

点击换图

举报理由:
   (必填)
紧急删除:

 13882551937、13808266089 服务时间:8:00~21:00 承诺一小时内删除

免责声明
发表评论  快捷匿名评论,或 登录 后评论
评论