何兴富,李响
(重庆市勘测院,重庆 400020)
反射机制在构建松散GIS系统框架中的应用
何兴富∗,李响
(重庆市勘测院,重庆 400020)
GIS应用系统在城市建设和管理中扮演着越来越重要的角色,成为数字城市的核心。在系统开发过程中,如何提高软件的复用性和扩展性,缩短开发周期,快速构建面向专业应用的GIS系统,是一个迫切需要解决的问题。本文尝试引入.Net框架中的反射机制,通过构建一个松散的GIS基础框架,为应用系统的开发提供灵活的系统配置和有效的数据解耦。然后在该框架上开发一个三维规划管理系统原型,展现引入反射机制用于快速构建系统的可行性和灵活性,为GIS应用系统快速开发探求一种新的途径。
反射机制;GIS;城市规划;软件复用
随着城市建设进程的加快,地理信息系统(GIS)越来越多地被用到城市建设和管理的方方面面。城市GIS成了“数字城市”的核心部分,将政府、企业和社会联结成一个整体,是实现资源共享的基础[1]。随着数字城市这一概念的出现和技术的发展,越来越多的城市管理和决策依靠先进的科学技术手段。城市规划是城市管理的一个重要内容,GIS在城市规划选址、路网设计、管网布设、规划管理等方面已经大量应用。
GIS的核心是数据,是各种分析功能的基础。依国家和行业等一系列标准建立的基础地理信息元数据,使这些基础数据能在各系统之间实现共享。但是,目前面向各行业应用的专业GIS应用系统仍然是面向特定服务,根据用户需求构建系统。这些GIS系统缺乏灵活性,当用户需求发生改变,往往需要修改系统框架,甚至重新设计,造成代码质量控制困难,开发进程控制困难,代码重用率低等问题。
本文尝试将Web开发中常用的反射机制引入GIS应用的开发,拟实现一个松散的GIS基础框架,实现较好的代码重用和灵活的功能配置、用户管理。并在该GIS基础框架之上,实现一个三维规划管理系统的原型,以验证反射机制在提高软件复用性和扩展性上的优势。
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩[2]。
在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。这类应用通过采用某种机制来实现对自己行为的描述(Self-Representation)和监测(Examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。实现了反射机制的系统都具有开放性。一般来说,反射系统除了满足开放性条件外还必须满足原因连接(Causally-Connected)。原因连接是指对反射系统自描述的改变能够立即反映到系统底层的实际状态和行为上的情况,反之亦然。开放性和原因连接是反射系统的两大基本要素[3]。
在.NET中,反射是一种强大的工具。它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码链接。反射允许我们在编写与执行时,使我们的程序代码能够接入装载到可执行程序中的类的内部信息,而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。反射通常具有以下用途[4]:
(1)定义和加载程序集,加载在程序集清单中列出的模块以及从此程序集中查找类型并创建该类型的实例;
(2)了解包含模块的程序集以及模块中的类等;
(3)了解构造函数的名称、参数、访问修饰符等;
(4)了解方法的名称、返回类型、参数、访问修饰符等;
(5)了解字段的名称、访问修饰符,并获取或设置字段值;
(6)了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等,并添加或移除事件处理程序;
(7)了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,并获取或设置属性值;
(8)获取参数的名称、数据类型、参数是输入参数还是输出参数以及参数在方法签名中的位置等。
应用程序与外部程序集之间的关系如图1所示。
图1 GIS基础框架结构图
通过反射的这些特性,就可以在系统运行过程中,动态地加载位于应用程序集中的类型,解析它的结构,提取类型中的方法并进行调用。如果通过一些接口约定,应用程序无需知道类型的具体实现细节,而是将类型实例化为接口的一个实例。同时,由于应用程序知道接口的详细信息,则相当于实现了对类型的透明调用。本文的设计正是基于反射的这些特性进行。
GIS的核心内容是数据,数据访问和数据表现是GIS系统的重要组成部分。在与数据相关的应用程序中,最常用的结构为模型-视图-控制器三层结构模式,本文设计的框架仍然采用该模式。在模型端,数据源的格式对于应用系统来说是透明的。但作为一个应用框架,系统实现了基本的数据访问接口,因此框架可以支持SHP、DWG、DXF等常见的GIS数据格式。在视图端,采用基于Windows窗体的用户界面,由工具栏、二/三维数据表现窗口、状态和控制栏、图层控制窗口等部分组成。在控制端,对应于框架的业务逻辑层,它负责提供数据的输入输出和业务逻辑的实现。框架实现了比较基础的GIS功能,包括漫游、定位、选择查询、测量及基础空间分析等。基础框架的结构如图2所示。
图2 GIS基础框架结构图
GIS基础框架在基础GIS引擎之上建立于一个松散的结构,它更多的是管理界面和提供接口,其组成包括以下几个部分:
(1)基础GIS引擎:框架的基础,GIS数据表现的核心;
(2)系统配置模块:控制系统启动流程,加载并保存配置信息,根据配置信息设置系统的界面及各项参数,负责更改和保存系统配置信息;
(3)数据访问模块:提供基本的GIS数据访问,包括SHP、DXF等,并且以工厂模式设计一系列访问接口,供子系统实现;
(4)界面管理模块:根据系统初始化参数等信息实现界面的管理,包括窗口状态、场景控制等,管理系统中的元素,如菜单、子窗口等;
(5)角色控制模块:提供功能级的角色控制,对系统加载的功能进行角色编码匹配,以确定功能的可用性,由界面管理模块控制功能菜单的可见性。
(6)辅助模块:提供基础函数、文件访问、数学函数、日志输出等;
(7)基础接口:定义工具ITool、命令ICommand等的接口,作为基础框架的功能约束。子系统的功能必须继承自这些接口,使之能被基础框架识别,并使用中介类作为功能的初始化参数。
(8)反射访问模块:框架的核心部分和松散结构的基础。提供访问框架外应用程序集中的类型信息,如果类型实现自基础接口,则可以创建它的一个实例作为功能加载到程序中,并创建该功能的菜单项供用户调用;
(9)中介模块:提供一个中介类,保存当前系统状态、用户状态、功能状态等信息,并作为各模块间传递参数的中介。此外,由于框架建立于一种松散结构,各应用模块间在没有链接的情况下,无法互相访问,因此它们的通信也由中介模块提供的事件消息来实现。
(10)公共设置接口:当在基础框架上构建GIS应用时,需要改变基础框架的一些基础设置,如应用的标题、图标、关于信息等;
其启动流程如图3所示。
图3 基础框架启动流程
在基础框架上进一步封装,则可以生成面向不同应用的专业GIS系统。本文以构建一个规划管理系统为例进行说明,展现反射机制在专业GIS系统开发过程中带来的灵活性。
作为一个系统原型,本文实现了规划管理中常用的几个功能:规划图层管理、用地类型统计、地块的土地性质分析、建筑阴影分析、控高分析等。在基础框架中约定,规划系统中的各项功能须继承自基础接口。其中,图层管理等继承自ICommand,控制规划图层的开与关;分析功能继承自ITool,提供功能与用户的交互操作。这些功能作为插件的模式,被基础框架的检索机制发现后,动态配置到系统菜单中,供用户调用。作为角色控制的一部分,这些功能在进入系统前需要进行配置,以提供诸如菜单路径、权限等级等相关信息。规划管理系统结构如图4所示。
图4 基于GIS基础框架的规划管理系统结构示意图
规划管理系统构建于GIS基础框架之上,其中的功能类继承自基础接口,并使用中介类获取基础框架提供的各项参数以及与系统框架中的子模块使用事件消息机制通信。由于规划管理系统本身需要访问其专业数据,如果基础框架不能提供特定类型数据访问的实现,那么它需要继承数据访问模块中的工厂类,以实现其数据的存取。在实现功能模块后,需要对基础框架进行一些设置,可以通过公共设置接口来实现。规划管理系统需要的一些参数可以通过配置基础框架的配置文件来提供,在该配置文件中除保存系统参数外,还保存了一个基于“键—值”对的参数列表。最后,规划管理系统调用基础框架的启动函数,启动系统。系统运行界面如图5所示。
图5 规划管理系统原型运行界面
基于反射机制的GIS基础框架大大增加了GIS应用系统开发的灵活性,通过XML配置应用程序的各项参数,在系统启动时加载到配置表中,达到了类似于Web开发中的反射注入。此外,由于各功能模块与系统框架之间没有链接编译,各功能相关性大为降低,实现了软件结构的松散组合。系统框架只提供基础的GIS功能,并且可以通过修改公共设置接口来控制这些功能的显示与否。当需要在GIS基础框架上开发专业GIS应用时,只需要继承自基础接口,开发工具并生成相应的应用程序集(可执行文件或动态链接库)。通过对这些应用程序集进行配置,可以进一步控制它们在基础框架中的状态(例如相对于当前用户,某项功能是否可用),从而实现在运行阶段而不是编译阶段动态配置系统的目的。通过反射机制,GIS基础框架并不需要与这些具体功能的应用程序集编译连接,而是运行时由反射访问模块通过反射的方式获取具体功能的实例,由系统进行调用。
现如今,GIS应用系统大量服务于数字城市建设的各个层面,在得到开发任务后,如何快速构建出面向专业应用的专业GIS应用系统,而不是每次都针对不同的应用去构建不同的基础框架。反射机制为这个构想提供了一种解决方案,它大大提高了软件的复用性和扩展性,让开发者可以专注于专业应用,提高基础代码的重用效率,从而达到快速开发的目的。
[1] Esri中国(北京)有限公司.基于网格化管理的数字化城市管理信息系统ArcGIS解决方案[D].p3
[2] 百度百科.反射机制[L].http://baike.baidu.com/view/ 3454964.htm
[3] 赵利宏,李秀冰,李大林.基于反射机制的插件系统软件设计[J].计算机工程与设计,2010.2(2),P349
[4] MSDN.反射概述[D].ms-help://MS.MSDNQTR.v80.chs /MS.VisualStudio.v80.chs/dv_fxadvance/html/d1a58e7ffb39-4d50-bf84-e3b8f9bf9775.htm
The Application of Reflection Mechanism for Creating Loose GIS System Framework
He XingFu,Li Xiang
(Chongqing Survey Instituted,Chongqing 400020,China)
GIS application System now plays more and more important role in city construction and management,and becomes the core of digital city.How to improve the reusability and expansibility of software,shorten development periods,and create GIS system for spatial application quickly in system development process,it′s an issue that needed to be resolved imminently.This paper introduces the reflection mechanism provided by.Net frameworks,try to supply flexible system config and effective data unbinding for application system by creating a loose GIS system framework.And develops a 3D planning management system prototype,exhibits the feasibility and flexible in system quick development by using reflection mechanism,explores a quick way for developing GIS application system.
reflection mechanism;GIS;city planning;software reusability
1672-8262(2011)02-49-04
P208
B
2010—08—09
何兴富(1982—),男,工程师,主要研究方向为GIS应用系统开发。