基于 MapFile 的电子海图数据访问和制图表达

0引言

Web电子海图具有资源共享、访问范围广泛、拓展性良好、平台独立性等诸多优点,正在逐步取代传统桌面电子海图系统,在航运管理领域迅速普及.

鉴于Web页面功能的局限性,众多Web电子海图应用采用了在客户端浏览器安装插件的胖客户端方案来显示海图和实现业务应用功能,其代表技术主要有ActiveX、Flash和JavaApplet等.潘明阳等[1]利用COM组件和ActiveX技术研究和实现了一种能够在Web网页上链接GPS/AIS等导航设备以电子海图为基础的船舶导航和监控系统.以海图为背景提供船舶动态查询服务的网站如船讯网等则大多利用Flash技术在Web端实现电子海图的显示.彭国均等[2]基于JavaApplet技术实现了一种网络电子海图显示系统.由于插件安装的不便和安全性隐患等问题,功能强大的胖客户端Web电子海图一直没有获得普遍应用.随着WMS等OpenGIS规范的制定,在ArcGIS、GeoServer、MapServer等商业和开源软件的推动下,基于CGI的栅格WebGIS技术得到了迅速发展.采用同样方案的栅格Web电子海图由于能够满足基本的海图显示和浏览需求,成为了当前主要的应用形式.

ArcGIS、GeoServer、MapServer等是目前栅格WebGIS开发和发布的主要平台,也是栅格Web电子海图应用的主要技术手段.ArcGIS是ESRI公司开发的、包含了众多重要组件、功能强大的GIS软件,其中的ArcGISServer可方便地实现WebGIS服务.在航海应用方面,侯妍[3]利用ArcGIS10.0新增的航海解决方案实现了海图数据的存储与管理,并利用ArcGISServer进行了海图服务的发布,利用Flex实现了Web端的海图显示及船舶监控功能.然而,作为一个优秀的商业软件,ArcGIS高昂的费用对于普通企业是一笔不小的负担.GeoServer和MapServer则是免费、开源的WebGIS服务平台.聂涛[4]以GeoServer为平台设计了一种Web电子海图制作与显示方案,对海图进行切割并且分层储存,然后通过异步请求技术实现了Web端电子海图的快速显示和基本操作.与基于Java语言的GeoServer不同,MapServer的内核利用C++编写,具有更好的效率和响应速度,而且MapServer可以利用GDAL、Pro4j等众多开源函数库的支持,具有更好的拓展性、开放性和开发效率.李法云等[5]利用MapServer建立了沈阳市机械化除雪道路网络管理信息系统,

实现了机械化除雪的动态管理和实时更新.郑逢令等[6]利用MapServer建立了新疆和静县家庭牧场网络地理信息系统.2012年,MapServer在6.0版本后开始支持通过OGR直接读取符合S-57标准的电子海图文件,为Web电子海图服务增添了有力的工具.利用这一新的特性,本文研究如何基于MapServer的制图核心MapFile访问电子海图数据并制定各种海图要素以符合海图显示规范的制图表达,为构建一种开源、低成本、高性能的基于MapServer的Web电子海图服务系统奠定基础.

1MapServer与MapFileMapServer

是美国明尼苏达大学开发的开源WebGIS项目,目前作为开源地理空间基金会的项目,由来自世界各地的开发者共同维护和增强.MapServer是一个典型的基于胖服务器端/瘦客户端模式的CGI实时地图发布平台,当客户端发送数据请求时,服务器端基于Mapfile实时处理空间数据,并将产生的地图返回客户端显示.

Mapfile文件包含了数据源、数据格式、地图投影等描述信息,不仅起到工程配置的作用,更重要的还承担着空间数据组织和表达的任务,是MapServer制图的核心.通过Mapfile的组织,MapServer可以直接访问空间数据库,利用GDAL访问栅格地图数据,利用OGR访问矢量地图数据(ShapeFile、SDTS、TAB以及S-57等格式),并以图层为单位管理多源数据,将各种地理要素组织成具有层次关系的对象系统.

图1为MapFile的对象层次组织结构.其根本节点为一个Map对象,其他对象均为Map对象的子节点,描述地图处理的各种参数,如Web对象指定显示页面模板、Projection对象指定整幅地图的投影方式,等等.地图各要素通过一组Layer对象进行层次化的组织.


2MapFile的海图数据访问

S-57是电子航海图数据传输和交换的国际标准.MapFile中利用ORG访问S-57海图数据的步骤如下:

1)在MAP对象中配置CONFIGGDAL_DATA属性,为其指定ORG提供的s57attributes.csv和s57objectclasses.csv文件的所在路径.OGR在读取S-57文件时,需要利用这两个文件来实时地将S57结构的海图物标转换为地图要素,并将所有具有相同物标类别名称的物标组织在同一要素层里.

2)利用Orginfo工具确认S-57数据文件实际包含的海图物标.对不存在的海图要素进行配置将导致MapServer数据访问错误.利用GDAL库中的工具ogrinfo.exe,通过以下的指令即可获取S57文件包含的物标信息:

>ogrinfoCN520BMS.000

3)MapFile中,将每一类海图要素定义为一个Layer,Layer的连接类型属性ConnectionType需定义为OGR,同时将Connection属性指向S-57海图文件路径,并将其Data属性定义为海图要素层名称,如图2所示.

通过上述步骤即可实现MapServer对S-57海图文件的访问,并按照层的形式对相同类型的海图要素进行组织.

3海图显示样式

S-57只提供了存储海图数据的方法,并没有制定用于海图信息显示的任何规则.海图信息的显示与其存储是相对独立的,应该按照IHO颁布的S-52国际标准或区域特色标准如长江电子航道图的CJ-52标准来生成.本文在参照S-52/CJ-52的基础上,通过MapFile的显示样式机制,实现了MapServer中海图的点、线、面、注记各种物标数据层的符号表达.

3.1海图显示符号库

MapFile中,图层中各要素的显示是通过Layer对象包含的Class对象来控制的.一个Layer中往往需要定义多个Class对象来表达层里的所有具有不同属性的要素.一个典型Class对象如图3所示.


Style对象是Class对象的核心,描述一类具有相同属性的要素以什么样的符号、颜色、大小进行显示,其中的Symbol属性值必须是预先定义的符号对象的名称.图4为Symbol符号对象的定义.Symbol对象中涉及的字体参数均必须出现在一个名为fonts.list的字体列表文件中,其内容如图5所示,文件中每一条目的前一项为字体名称,后一项为字体文件名.

Symbol的定义可以直接在MapFile中描述,但为提高灵活性,MapServer专门用一类符号文件(*.sym)来描述.本文利用图5所示的S-52字体文件用于Truetype类型的海图物标符号表达,并进一步以Symbol对象规范形成海图符号库,以S52_Symbol.sym为名存储.图6为其一个片段.


定义好fonts.list和S52_Symbol.sym后,必须在Map对象的FontSet和SymbolSet属性中分别填上其文件路径,以便引用.

3.2点状符号

海图中的点状符号主要是单点定位的符号,如浮标、障碍物、沉船等.MapFile中,这些点状符号表达的重点在于必须根据S-52表示库中的符号化指令组织每一点状物标层Class对象的Expression表达式,并指定其对应的Symbol对象以及颜色和大小等Style属性.图7以侧面浮标(BOYLAT)为例展示了点状符号的表达,利用侧面浮标的[BOYSHP]和[COLOUR]属性组织了Class对象的表达式,对符合不同属性条件的浮标用不同的符号对象进行显示.

3.3线状符号

线状符号是指具有两点或两点以上进行定位的地理要素符号,其表达由线状空间物标位置和线型决定.海图中的线状符号分为简单线符号和复杂线符号.简单线符号如等深线、海岸线等,只需指定线型、宽度和颜色即可.图8以等深线(DEPCNT)为例展示了简单线状符号的表达.复杂线符号如渔区、抛锚区等界线一般由图案组合而成.对于复杂线符号,Style对象包含了Pattern(图案)、Gap(符号间隔)、Offset(偏差)等属性,多个Style对象可以组合实现各种线状符号.图9以无线电报告线(RDOCAL)为例展示了复杂线符号的表达.



3.4面状符号

面状符号的显示需要先绘制出区域的边界线,然后进行填充.边界线与线状符号一样分为简单符号和复杂符号,而按填充类型,面状符号的填充方法可分为颜色填充和图案填充.

等深区、陆地、建筑区等面物标利用颜色填充法,只需设定颜色值,即可进行大面积渲染.图10以等深区为例展示了面物标颜色填充的表达.


这类面状符号表达的重点在于根据S-52/CJ52表示库,组织每类面物标层Class对象的Expression表达式,指定其对应的填充颜色值.图10利用等深区的属性DRVAL1(深度范围最小值),对等深区进行分类,为不同深度范围的等深区赋予不同的填充颜色.

对于需要图案填充的面物标,MapFile中可以利用各种类型的Symbol对象包括ellipse、hatch、pixmap、truetype等,配合Style对象的Pattern、Gap等属性,实现各种面状符号填充效果.图11以分道通航隔离带(TSEZNE)为例展示了面物标图案填充的表达,其中利用圆点符号对象填充了分道通航隔离带.


3.5注记

海图注记是指海图上的名称注记、说明注记和数字注记.下面以水深注记为例,描述MapFile中海图注记的表达.海图水深是2.5维空间数据,包括经度、纬度和深度.MapFile目前还不能支持直接从S-57文件访问这种多维的空间数据,因此需要将海图水深数据转换为ShapeFile格式,将经度和纬度组成点物标,而深度值处理为点物标的属性如DEPTH中.

在MapFile中,文本信息的绘制主要通过Label对象和Text属性来实现.一个Label对象包含color、size、font、expression和position等众多属性,可以较好地满足各种文本绘制的需求.Label对象将对Layer中由LabelItem项指定的属性信息的显示进行控制.图12为水深点注记的表达.


3.6显示效果及存在问题

在MapFile中对各种类型海图物标进行制图表达后,由MapServer绘制的海图效果如图13所示,基本正确显示了海图内容.然而,在图13中可以发现,水深值的小数位与整数位平齐,这是由于在Soundg字体中“.”显示为空白,如换其他字体,则会直接显示出小数点,如“9.4”.这显然还不符合海图显示规范中水深小数部分分离显示在整数部分右下角的规定.归纳起来,MapFile的海图制图表达主要存在如下问题:

(1)水深分离显示

海图显示规范中规定:水深浅于31m保留一位小数,同时整数部分与小数部分分离,并且小数部分显示在整数部分的右下角.MapFile对于海图水深的分离显示缺乏直接高效的方法.

(2)面状物标的中心符号

海图的面状符号往往需要显示其中心符号以及物标名称.本文研究中没有找到该问题的合适解决方案.一个妥协的方法是修改海图数据,为每个面状物标添加一个对应的中心点物标.然而该方法破坏海图原始数据,而且也不能满足S-52对中心符号必须显示在面物标显示区域中心而不是单纯的物标范围中心的要求.


(3)条件符号化

在海图显示中,有一些需要根据全局参数进行条件符号化的要求.这些全局参数可由使用者选择安全水深、安全等深线等.本文研究没有寻求到一种在MapFile中利用全局变量的方法,因此对于条件符号化的妥协方法只能是针对不同的全局参数取值准备不同的MapFile文件,然后根据用户选择调用不同的MapFile文件进行显示.显然,这并不是理想的解决方案.

4结语

本文研究MapFile中S-57电子海图数据的访问以及海图中各点状符号、线状符号、面状符号以及注记等的制图表达,旨在为开发一种基于开源MapServer的Web海图服务奠定基础.研究结果表明,利用MapFile的特性可以访问和显示海图的基本内容,进而作为一些非导航类应用的海图背景.然而,在研究中也发现了一些问题和困难:与商业软件ArcGIS等一样,MapServer采用基于样式的灵活制图表达机制,因此其在有着自己表达规范的海图显示方面存在的许多困难都是共性.相比ArcGIS,MapServer的优势在于其开放性.在后续研究中,将进一步分析其特性和源代码,针对海图特点进行定制和完善,以着重解决海图数据访问效率以及制图表达细节的问题.