基于GIS的船舶监控系统的设计和实现
2009-01-05欧涛程论
欧 涛 程 论
摘要 本文首先介绍了基于GIS的船舶监控系统的需求和总体设计。系统的设计使用多层体系结构将系统分为5层:包含传统的表示层、业务逻辑层、数据库层,还包含了数据访问层和表示选择层,而且这两层是以组件的方式实现具有很大的通用性;系统的体系结构风格是异构体系风格的“查改有别”模型即混合使用了C/S和B/S体系结构风格,然后在系统的实现部分详细介绍了基于XML的子模块插件化技术的实现,最后简单介绍了系统的特色子模块的实现。
关键词 插件;GIS;异构体系结系;Geomedia;船舶监控;XML
中图分类号 TP273 文献标识码 A 文章编号 1674-6708(2009)07-0051-03
The Design and Development of Ship Monitoring System Base on GIS
OU Tao1,CHENG Lun 2
1.Shanghai Maritime University ,Engineering Training Center,Shanghai 201306,China
2. Department of Electronic and Information Engineering,Tongji University ,Shanghai 200135,China
Abstract This paper introduces the Design and Requirement of a ship monitoring System base on GIS at first. The design of our system is the multi-layer architecture that divides the system into five layers: UI layer, UI locator layer, business layer, data access layer and database layer. The UI locator layer and data access layer was implemented with component can be reused in other system or platform. The software architecture style of our system was designed as isomerous architecture style that uses the C/S style to query module and B/S style to modification module. In the last part of this paper we discuss the implement of plug-in technology base on XML and the implement of special module of our system in detail.
KeyWords Plug-in;GIS;Isomerous architecture;Geomedia;Ship Monitoring;XML
0 引言
随着海运业的发展,各港口进出的船舶数目急剧增加,而传统的船舶管理方式已不能满足中大型港口的要求。随着GIS的发展,GIS在各行业监控系统的应用也越来越广泛,所以开发基于GIS的船舶监控系统,正是为了缓解港口船舶管理强度和提高港口工作效率。基于GIS的船舶监控系统主要是利用GIS将港口的地貌电子地图显示于显示设备,并通过港口的各种设备采集船舶的相关数据,例如,船舶的航速,当前坐标信息等动态信息和船名、船的国籍等静态信息,根据这些信息在电子地图上显示船舶的位置并预计船的航向,还有保存这些信息以供查询。
本文从设计和实现角度介绍笔者开发的系统,首先,描述的是系统的设计:介绍本系统的的需求和实现的目标;然后介绍本系统使用的是多层体系结构,相对传统的三层体系结构中间添加了两层,即表示选择层和数据访问层,而系统的体系结构风格是采用异构体系风格的“查改有别”模型,这种风格混合使用了C/S和B/S结构兼有两种体系结构的优点。其次,描述的是系统的实现:详细介绍系统的子模块的插件化技术。本系统的框架是一个用于存放统一接口插件的容器,而系统的所有子模块是具有指定接口的插件并以相同的方式集成到系统中。最后简单介绍了系统中的特色模块——地图显示及操作模块的实现。
1 系统需求和结构的设计
1.1 系统需求
大多数基于GIS的船舶监控系统的需求比较相似,本系统基本实现了以下功能:
1)数字地图的显示及操作:在数字地图上显示各船舶的实时位置及航行轨迹;
2)设置和管理报警区域、报警策略,根据数字地图中的船舶情况,对处于危险情况的船舶发送报警信息;
3)航行轨迹回放及历史数据调阅,以供事故分析或事故证明;
4)接收并显示业务统计结果和服务信息抽样比对结果;
5)统计用户各类历史使用情况;
6)管理和配置本系统中系统管理员、监控目标、监控员、GIS 管理员的基本信息、权限等。
1.2系统结构总体结构设计
本人所构建的系统是基于Intergraph公司的Geomedia Professional Objects组件技术,使用Microsoft C# 语言和ASP.Net,在Visual Studio.Net 编译器下开发的。系统的总体结构是多层体系结构,总共分为5层,详见系统总体结构图(如图1)。
本系统的体系结构风格是使用异构体系结构风格的“查改有别”模型。在C/S与B/S混合软件体系结构的“查改有别”模型中,不管用户是通过什么方式(局域网或Internet)连接到系统,凡是需要执行维护和修改数据操作的,就使用C/S体系结构;如果只是执行一般的查询和浏览操作,则使用B/S体系结构[2]。本系统使用C/S体系结构的子模块有:矢量图形增删模块、系统安全维护模块、系统配置模块,而其他系统则使用了B/S体系结构实现。
图1系统总体结构图
在第一层表示层和第三层业务逻辑层之间有一层是表示选择层,该层是实现异构风格的“查改有别”模型的关键点,通过这一层可以配置和修改系统业务子模块的表示方式,该层的主要作用是根据下层模块的特点和用户的要求,选择该模块的表示方式。种种模块的表示方式分为两种:一种是Windows Form 风格对应于C/S结构;一种是Web Form 风格对应于B/S结构。系统中的业务逻辑层的每个子模块可以实现一种或两种表示方式供用户使用。如,对于一些远程用户只是查询和浏览的功能模块,其表示层可以使用B/S或C/S结构;而需要维护和修改或数据交换量比较大的功能模块,其表示层仅使用C/S结构,而且限于局域网内拥有相应权限的用户使用,以提高系统的安全性。
在第四层数据访问层中,有两种类型的数据访问对象模型,一种是Geomedia Professional Objects 的GDO, GDO是Intergraph公司专门针对地图数据库操作而封装的一系列数据操作类,提供了一系列的接口,通过这些接口简化了对地图数据库的所有操作;另外一种是Microsoft 的ADO.Net,其功能是用于对事务数据库的操作,包含数据库中所有对象的创建、查询和修改,提供对事务数据库的访问功能。
最后一层数据库层中,将 GIS的地图数据库与事务数据库分离。这两种数据库甚至可以使用不同的数据库管理系统。由于GIS数据库中主要保存的是静态的地图矢量数据,而且地图数据库一般不需修改,规模也不大;整个系统的其他模块保存的数据是传统的事务数据,而且数据量也很大,对并发要求也比较高,所以将两种数据库分离,GIS数据库可以使用较小的数据库管理软件以节约成本,事务数据库可以使用较大型的数据库以提高效率,如:SQL Server,Oracle等。
2 子模块的插件化技术的实现
系统的扩展性是任何系统设计必须考虑的重要因素。从本系统的模块划分中看到,系统拥有港口管理信息系统的基本信息:港口地貌信息,港口所有船舶的动静态信息,而利用这些信息构建新的功能模块。例如,引航子系统正是基于上述两个信息再根据港口的天气信息,海洋的潮汐等信息而构建的。所以,在本系统的设计过程中,使用了基于XML的插件框架来支持系统的扩展性。
所谓插件,是系统的扩展功能模块,这个模块是以一个独立文件的形式出现并与系统是相对独立的。当开发人员编译发布系统之后,用户有新的需求或不同用户为满足其特殊需求而需要不同的功能,在修改已有功能模块或添加新的功能模块时,需要重新编译整个系统,此时常常会因为某个模块的错误而导致整个系统的编译生成失败,但是,使用插件技术构建的系统可以达到上述要求而不需要重新编译系统,系统的后续开发能力大大增强。本系统所获得的船舶的动静态信息和港口的地貌信息是许多港口管理子系统的基础信息,。如果将这些信息提供给引航子系统,引航员利用这些信息引航时,可以选择空闲的航道引航;也可以利用船舶的位置和航速信息预计船舶的航向,避免船只在航行过程中碰撞。所以本系统使用插件技术可以极大的提高了系统的扩展性。
插件系统的实现包含两个部分:
1)插件系统的初始化,功能是:在系统启动时,搜索指定插件目录的插件配置文件,然后按配置文件指定的插件代码位置装载代码并运行插件代码。所有的插件是统一的接口的子类,所以可以在系统初始化时遍历运行收集的所有插件,激活所有插件。示例代码如下:
public void InitializeAddin(){
ICommand [] commands = AddInSingleton.AddIns.GetItems(null);
for(int i = 0; i < commands.Length; i++){
commands[i].Run();
}
}
系统在装载所有系统的子模块即系统的初始化时,显示软件系统的主界面是作为最后一个服务启动的,所以显示主界面ShowWindow()函数是在InitializeAddin()函数后被调用。
2)插件的实现:系统中的所有子模块为一个插件,每个插件是由两个文件构成,一个是代码文件(Assembly),另一个是插件的配置文件(XML文件)。本系统是基于windows操作系统的,每个功能模块的代码是存放在一个动态连接库文件中,而且每个功能模块的都继承至一个接口(本系统中是ICommand接口),这个接口使模块有一个唯一的运行入口点。以下是ICommand接口和地图操作模块的简要代码描述:
public interface ICommand{
void Run();
}
public class MapOperation : ICommand{
public void Run(){
….
}
}
系统的配置文件是使用XML编写的,格式如下
author = "Chenglun" copyright = "SMU-CS-CL" url = "-" description = "Operat the map module" version = "1.0.0">
其中的DLLFile标签的字段内的路径是该模块的代码文件的相对于插件配置文件的相对位置,Module标签的path属性是标志下面的子标签MenuItem描述的项是在主界面中的位置,MenuItem的Label是在界面上显示的文字。
3 地图显示及操作模块的实现
本系统静态地图的显示功能模块主要是通过过滤器从地图数据源(地图数据库或地图数据文件)读入所需数据至内存,之后按照一定的坐标系统显示地图若干或全部图层。地图显示中的地图数据是使用Geomedia的GDO组件将数据从地图数据库(Access 或者 SQL Server 等)中读出,再通过过滤器OriginatingPipe类读入所需数据,送至MapView组件在屏幕显示。在实现过程中,数据库的连接使用了简单工厂模式,编写了GDataAccessFactory类,根据不同参数自动选择创建相对应的数据库连接。
静态地图的操作模块的实现中使用Observer模式,Observer模式由主体类和观察者类组成。主体类GOpEventHandler封装了某种操作功能对应的一个鼠标事件的处理过程,观察者类GEventControl封装了事件捕获组件并包含了一个主体对象的容器GEventContainer。观察者从系统捕获事件后,通知在主体对象容器中与该事件有关的所有主体对象,并把执行权按顺序交给主体对象来处理事件响应。
4 结论
基于GIS的船舶监控系统是港口管理系统中一个基本和重要的子系统。该子系统中获取了港口所有船舶的动静态信息,港口地貌信息。这些信息是很多港口管理系统其它子系统的必须信息,如引航子系统,锚地管理子系统,危险区域管理子系统,还有航道管理子系统等等。系统的后续开发中可以将其他的子系统做为本系统的子模块逐步添加到系统中,利用系统的插件框架,在系统部署运行后添加的新子模块,既使得多个系统共享相同的数据源,减少数据在不同系统之间的交换,增加系统的实时性,又可以降低客户对软件成本的投入。
系统中的动态船舶监控模块对信息的实时性要求比较高,特别是在大型和超大型港口中同时刻的船舶的数目很多时,数据的采集和采集后的实时显示对系统的效率要求特别高。为避免显示刷新时间太长,提高系统的实时性,可以通过暂时的系统硬件升级,而使用并行处理技术处理过滤显示数据才是我们认为的一个极有潜力的方向。
参考文献
[1]Eric gamma,Richard helm,Ralph Johnson,John Vlissides.Design Patterns:The Element of Reusable Object-Oriented Software.Addison Wesley,Massachusetts, 1995.
[2]张友生.软件体系结构.北京:清华大学出版社,2004.
[3]James Rumbaugh,et al.Object-Oriented Modeling and Design.北京:中国电力出版社,2004.
[4]Sherif M.Yacoub,Hany H.Ammar.Pattern-Oriented Analysis and Design Composing Patterns to Design Software Systems(影印版).北京:中国电力出版社,2004.
[5]Tom Archer,Andrew Whitechapel.马朝晖,等译.C# 技术揭密.北京:机械工业出版社,2003.
[6]Christian Holm,Mike Kruger.Dissecting a C# Application Inside SharpDevelop.Apress L.P.Berkely,2003.