基于 MapObjects开发电子海图系统的研究与实现

目前电子海图系统的开发普遍采用传统的软件开发模式,这种模式存在开发难度较大、开发周期长、系统维护复杂、功能扩展困难等弊端.随着电子海图系统的应用越来越广泛,这种模式已经不适应电子海图的发展,迫切需要一种制图与GIS功能相结合的组件来定制和扩展应用软件已有的应用功能.MapObjects正是为了满足这种需求而开发出来的一种GIS组件.它是一套制图软件集,包括一个OLE控件(OCX)和一组OLE目标(Objects).通过MapObjects,开发人员可灵活地建立适合用户的地图接口.在小内存空间中,可以用多种工业标准程序环境之一去建立应用程序,可以联合使用MapObjects与其他软件以实现电子地图与用户信息的联系.把MapObjects应用到电子海图系统的开发中必将提高系统的开发效率,促进电子海图的进一步发展

1MapObjects研究

MapObjects是由美国的环境系统研究所(environmentsystemresearchInstitute,ESRI)开发的当今比较流行的组件式GIS开发软件,简称MO.它可以用在多种符合工业标准的开发环境中,利用MapObjects可以在普通的编程语言上实现主要的电子地图的功能.

MapObjects由一个称为MapControl的ActiveX控件和46个功能对象组成.其中MapControl中包括15个消息、24个方法和40个属性设置函数,这46个对象按功能可分为6大类.MapObjects组成及6大类功能对象的关系如图1所示.

2基于MapObjects开发电子海图系统的可行性分析

传统的电子海图开发不依赖任何GIS工具组件,所有的算法都由开发者独立设计.这种开发模式主要有软件开发难度较大、开发周期长、多为低水平重复开发;系统各部分联系紧密,导致一系列诸如系统维护复杂、版本升级困难,不利于系统功能的扩展、费用昂贵、用户掌握困难等弊端.利用MapObjects可以简单快速地在应用系统中嵌入地图化功能,增强用户应用的空间分析能力,实现用户应用的增值.另外,利用MapObjects开发电子海图系统还具有以下优点:

1)MapObjects可容易地用OCXS建立程序,它提供了许多GIS功能接口,可以免去编写冗长的代码;

2)MapObjects应用软件占用内存空间少,利用它可以大大节省内存开支,提高系统运行速度;

3)MapObjects可直接建立在MFC库上执行,使用户可以灵活性地建立用户接口;

4)MapObjects把与显示相关的操作封装成独立的模块,便于系统维护和功能的扩展.

由以上分析可知,基于MapObjects开发电子海图系统更符合面相对象的软件开发思想.下面将通过基于MapObjects电子海图显示平台的设计与实现来研究MapObjects在电子海图系统开发中的使用方法.

3基于MapObjects的电子海图显示平台设计

3.1系统总体设计

本系统软件的设计采用客户端/服务器端(Client/Server)模式.系统的客户端是前台应用程序,服务器端有2个:MapObjects控件支持的Shapefiles文件系统和MicrosoftAccess数据库.MapObjects控件为空间数据和前台应用程序提供了桥梁.

电子海图数据利用COM技术嵌入MapObjects控件,将MapObjects作为服务器端管理空间数据.系统属性数据管理由前台应用程序作为客户端,Access作为后台服务器.系统通讯示意图如图2所示.


3.2系统功能设计

根据IMO标准,电子海图显示平台主要用来实现海图的显示以及与显示相关的功能,具体包括以下4大基本功能.

海图基本操作:包括海图的放大、缩小、漫游、中心显示等.

图层管理:包括单个图层的显示控制;点、线、面图层的显示控制以及显示类型控制.

图层绘制:用来向系统中添加新的海图图层,主要包括点、线、多边形、矩形、椭圆、文本等6种图层的绘制.

要素查询:用来查询某一位置的海图要素信息,可以通过画线、画矩形或者画多边形来实现对点、线和面要素的分别查询和集中查询.

4系统关键技术研究

4.1海图的显示

电子海图文件是Shapefile文件格式,每个Shapefile文件由3种文件组成.主文件(*.shp)包含几何图形,索引文件(*.shx)包含数据的索引,数据库文件(*.dbf)包含图形的属性.每幅海图把不同的元素封装在不同的图层中.海图的显示有2种方式,一种是通过MapObjects控件的属性表单中加入,另外一种方法是通过代码加入.图层加入时要注意相互之间的顺序.一般情况下应该先加入面物标,再加入线物标,最后加入点物标,这样可以避免点线物标被面物标覆盖掉,电子海图显示平台界面如图3所示.

4.2海图基本操作

海图操作主要包括海图的放大、缩小、中心显示、漫游.MapObjects中有一些可以直接利用的接口,通过它们可以方便地实现上述操作.在MapObjects的消息响应函数OnMouseDownMap()中实现海图的点击放大的方法如下:

mmap.SetMousePointer(51);//改变鼠标为放大镜形状

mCenterPoint=mmap.ToMapPoint(float(X),float(Y));//把点击点坐标转换为海图坐标

rectExtent(mmap.GetExtent());//获得图幅范围

rectExtent.ScaleRectangle(0.5);//放大2倍

mmap.SetExtent(rectExtent);

mmap.CenterAt(mCenterPoint.GetX(),mCenterPoint.GetY());//以点击点为中心显示海图

4.3图层管理

电子海图是按图层组织的,每个图层包含了海图的不同方面.由于图层较多,所有图层都显示在窗口中比较混乱.为了实现对图层显示的有效控制,设计了图层管理功能.

图层管理分为单个图层控制、点线面图层控制以及显示类型控制3个基本功能模块.单个图层控制可以控制每个图层的显示与否;点线面图层控制可以实现点、线或者面物标的单一显示或者任意组合显示.在显示类型图层控制中,根据图层的性质,把所有图层分为标准显示、基础显示与扩展显示3种类型,工作界面如下图所示


每幅地图都有图层Layers集合,Layers集合由Layer对象组成,Layers集合中有用于从集合中操作Layer对象的方法和属性.利用它们实现图层管理的主要方法如下:

加入图层:mLayers.Add(图层对象);

删除图层:mLayers.Remove(图层索引号);

移动图层:mLayers.Move(图层索引号,图层索引号);

隐藏图层:mLayer.SetVisible(FALSE).

4.4图层绘制功能

图形绘制功能所画图形均在跟踪层,即在所有图层之上.MapObjects提供了点、线、矩形、椭圆、多边形、文本等6种图形工具供用户使用.用户可以完成点、线、面等图形的绘制,以及对所画图形的编辑,最后生成Shapefiles存储到硬盘.

在系统中,利用MapObjects控件和MFC实现了该模块,可以产生和编辑Shape格式的矢量图形数据,生成新的Shapefile文件.创建新的点类型图层的步骤如下所示:

1)创建CMoDataConnection对象,并指定其DataBase属性.

pMoCon.SetDatabase((LPCTSTR)"C:Demo航路点层");

2)创建新的图层描述CMoTableDesc对象.设置图层的字段个数及属性

desc.SetFieldCount(2);

desc.SetFieldType(0,moString);

desc.SetFieldName(0,"Number");

desc.SetFieldLength(0,10);

3)利用CMoDataConnection的AddGeoDataset方法产生空的图层.

pMoCon.AddGeoDataset(“航路点层”,moShapeTypePoint,(LPDISPATCH)desc,vt,vt);

4)设置图层记录集,利用CMoRecordset对象的AddNew方法产生一个空的几何和属性记录.

CMoRecordsetrecs(layer.GetRecords());

CMoFieldsfields(recs.GetFields());

recs.AddNew();

mpoint.SetX(mLonArray.GetAt(i));

mpoint.SetY(mLatArray.GetAt(i));

SetValue(fields,"Shape",mpoint);

SetValue(fields,"Number",mNumber.GetAt(i);

SetValue(fields,"Name",mChname.GetAt(i));

recs.Update();

5)设置航路点的颜色,并加入地图.layer.GetSymbol().SetColor(moLightYellow);

CMoLayerslayers(mmap.GetLayers());

4.5海图要素的查询

在MapObjects中,可以通过3种方法来选择地理特征,并将要素的信息以一个记录集的形式返回.这3种方法分别是:

1)SearchByDistance:按相对位置的范围搜索特征.

2)SearchExpression:按逻辑查询,即按照SQL语句的条件从句查询.

3)SearchShape:根据某个或某些图形特征查询其它相联系的特征.

本系统采用SearchByDistance实现了点击查询.在图形上点击鼠标,设置搜索距离,调用SearchByDistance实现查询功能.采用SearchShape实现了画线查询.


5结束语

随着GIS的不断发展,结合GIS工具软件与可视化开发语言的集成二次开发方式已经成为GIS应用开发的主流.MapObjects作为流行的GIS组件已经广泛应用到地理信息系统开发中.把MapObjects组件应用到电子海图系统的开发中,可以提高系统的开发效率,并且有利于系统的维护和功能的扩展.VisualC++6.0下基于MapObjects组件的电子海图显示平台的实现,验证了利用MapObjects开发电子海图系统的可行性,并为开发基于MapObjects的电子海图显示与信息系统(ECDIS)打下了基础.