基于MapServer的电子海图数据读取方案研究电子海图系统是一种集成式导航信息系统,它在使用电子海图的基础上,将导航信息、海图信息和雷达信息集成在一起处理和显示,以图像、声音、语音等多种多媒体形式提示航海人员,从而大幅度提高航海的自动化水平。电子海图系统的网络发布和共享实质是在Internet或Intranet网络环境下的一种存储、处理、分析和显示与应用电子海图地理信息的WebGIS系统。目前市场上已有很多商用的WebGIS软件,我们选取开源软件MapServer来实现电子海图的读取。除了MapServer本身强大的功能和出色的效率不比商业软件逊色外,MapServer还具有WebGIS分布式、互操作的特征以及开源GIS免费、开放的优势。同时,通过这个技术路线,我们可以发展和掌握较多的自主知识产权,对长期发展更加有利。1.电子海图及MapServer简介1.1电子海图简介随着世界航运业日新月异的发展,安全航行倍受航运界关注。近年来出现的电子海图显示及信息系统给船舶的安全航行提供了强有力的保障。简单的说电子海图可以分为两部分,一部分是电子海图数据(ElectronicNavigationChaa,简称ENC),另一部分是各种基于电子海图数据的应用系统。电子海图和电子海图显示及信息系统一起为航海人员提供一个海图信息平台,使使用者能够非常直观、方便地了解到所处海域的状况。电子海图之所以引起高度重视,是因为它具有传统纸海图无法比拟的优点。电子海图系统可以进行自动航线设计、航向航迹监测、自动存储本船航迹、历史航程重新演示、航行自动警报(如偏航、误入危险区等)、快速查询各种信息(如水文、港口、潮汐、海流等)、船舶动态实时显示(如每秒刷新船位、航速、航向等),将雷达/ARPA的回波图像叠显在海图上,数千幅海图的自动更正只需几分钟。IMO(国际海事组织)关于电子海图S一57标准规定,基于S一57标准的海图格式为*.000。但这种格式海图引擎昂贵,且发布、更新一般仅限于海事部门,给船用电子海图的推广带来困难,因此市场上存在着非s—57标准的电子海图。1.2MapServer简介MapServer是由美国明尼苏达大学(UniversityofMinnesota)开发的开源WebGIS软件,它具有强大的空间数据的网络发布功能。MapServer有两种操作模块:CGI和MapScfipt。MapServer支持多种数据格式,使得在WebGIS中整合空间数据和非空间数据变得更加容易。相比众多地商业WebGIS解决方案,MapServer是开源项目,这就意味着你可以免费使用MapServer,并具有自行修改、复制以及再分发的权利。同时MapServer还有很多的优点:1)支持多种矢量、栅格格式数据,支持分块的(tiled)矢量和栅格数据,并可以对shapefile文件建立四元树空间索引。2)地图元素(如比例尺、图例,参照图等)自动控制,图像比例自动调节。3)支持微软和Apple公司共同研制的字型标准TrueType,并解决了标注冲突问题。4)对OpenGeospatialConsortium若干网络规范的支持。5)完全支持定制的template的输出。6)利用逻辑或正则表达式生成专题地图。2.基于mapserver和OGR的电子海图数据读取方案在MapServer中,Mapfile文件起到工程配置作用,同时又扮演着空间数据组织者的角色,MapServer通过MapFile组织各图层之间的关系以及图层的显示。在Mapfile文件中,定义了地图要素之间的关系、绘制模式和地图数据存放的路径等信息。通过Mapfile的组织,MapServer可以直接访问多个空间数据库和多种格式的地图文件,包括矢量类型和栅格类型,避免了不同数据格式转换所造成的信息丢失。MapFile以图层(layer)为单位管理多源数据,因此MapFile中最重要的就是layer对象的配置。在配置layer对象时还要注意顺序问题,在MapServer生成地图时先配置的layer在地图的底部,最后配置的layer显示在地图的最上部,因此这其中会有一些覆盖的问题,一般是按照面,线,点的顺序来配置。OGR库为编程人员提供了通用的数据模型,它是一个读取和处理GIS矢量数据的C++开源类库。这个库可以读取和处理多种流行的矢量数据。OGR提供对矢量数据格式的读写支持,它所支持的文件格式包括:ESRIShapefiles,s一57,SDTS,PostGIS,OracleSpatial,Mapinfomid/mif,MapinfoTAB。OGR的Geometry模型是建立在OpenGIS的简单要素数据模型之上的,如图1所示。图1OGR的Geometry模型关系图MAPSERVER是通过OGR来读取电子海图数据的,需要在MapFile中配置Layer对象的DATA,CONNECTION,CONNECTIONTYPE等几个属性。例如:LAYER...CONNECTIONTYPEOGRCONNECTIONdatasource_nameDATAlayer_definition...ENDMapServer读取海图数据流程图如图2所示:图2MapServer读取海图数据流程图笔者曾参与的一个项目完成了对s57格式电子海图数据的读取,读取效果如图3所示:图3S57格式电子海图读取效果图3.基于MapServer和OGR的电子海图数据读取关键技术3.1海图符号的定义及使用海图符号又称为海图语言,由点、线、几何图形和注记等组成,是制图者和用图者通过海图进行信息传输和交流的载体、工具和桥梁,是连接符号学与海图制图学的有机知识整体【6】。在MapServer中使用海图符号需要在MAPFILE配置中将符号定义写入其中,不过推荐的做法是单独写一个后缀为SYM的符号文件,然后在MAPFILE中通过SYMBOLSET引用此符号文件,这样便于管理庞大的符号库,使层次更清晰。在MapFile中添加文件引用示例如下:FONTSETC:\ESRI\S57DATA\fonts\fonts.listSYMBOLSETC:\ESRI\S57DATA\Symbols.symMAPSERVER中可以定义及使用多种点状符号,这里主要介绍TRUETYPE字体符号。TrueType是由AppleComputer公司和Microsoft公司联合提出的一种新型数学字形描述技术。由于它是由指令对字形进行描述,因此它不随符号自身的放大缩小而失真,而且Truetype字体符号所占用的空间与图片等其他各式要小的多,所以采用字体符号作为海图符号是一个很好的选择。将要使用的TRUETYPE文件(.ttf文件)与font.list文件放在同一目录下,然后将font.list文件中添加刚放入同一目录的新TRUETYPE文件。MapServer中创建SYMBOL示例如下(#后为注释):SYMBOL#定义TRUETYPESYMBOLSNAMETTSTYPETRUETYPEFONTsymbolShip#font.list中定义的新添加的TRUETYPE文件名称CHARACTER,#引用字体文件中的确切符号ANTIALIASTRUEGAP10END其中最为关键的就是CHARACTER属性的使用,在fontcreator软件(一种字体读取工具)中可以取得CHARACTER的值。另外,font.list文件中定义的TTF文件名不能有空格,如果有空格将会产生错误,这一点是很容易被忽视的,也是十分重要的。3.2s-57及tab格式数据读取MAPSERVER在读取S57数据时需要引用s57attributes.csv和s57objectclasses.csv两个文件,所以需要加一个路径提供地址,这可以在MAP对象中通过配置CONFIGGDAL_DATA来实现,例如:CONFIGGDAL_DATAC:\ms4w\gdaldata配置S57数据再一个关键点就是要知道数据中各属性的含义及用法,及选用哪个属性来对图元进行分类显示,这是最重要的一个问题,常见的分类属性有:FIDS,COLOUR,及水深度最大值最小值DRVAL1,DRVAL2等等。在CLASS中通过EXPRESSION来进行区分时可以使用“STRING”,“正则表达式”,“MAPSERVER本地表达式”等方式。再一个就是注意对图元符号的显示样式的调整。基本步骤为:1.借助OGRINFO及CARISEasyView工具,并参考S57数据标准,获取S57数据文件中含有整个海图的信息以及每个图层信息。2.根据每个图层信息,配置MapFile文件:1)必须将每个海图图层的连接类型为:CONNECTIONTYPEOGR2)读取S57数据时,需要57objectclasses.csvands57attributes.csv两个文件的支持,因此要配置文件MapFile中,设置CONFIGGDAL_DATA=“这两个文件所指向的目录”3)为每个图层按照S52标准配置样式。3.通过MapServer加载图层的方式,将S57海图中各个图层读取并显示。一个海图中某层的配置片断示意如下(#后为注释内容):LAYER#层的开始NAMEBOYLAT#层名称TYPEPOINT#层类型STATUSONDATABOYLATPROJECTIONinit=epsg:4326ENDCONNECTIONTYPEOGRCONNECTIONC:\US5PR44M.000CLASSITEM'COLOUR'#用于区分不同颜色的图元LABELITEMOBJNAM#用于添加标注CLASSEXPRESSION('[COLOUR]'eq'2')#颜色值为2的图元的显示STYLESYMBOLsymBOYLATheidian#引用在SYMBOLSET指定目录下的.sym文件中的符号ENDLABEL#添加标注TYPEBITMAPSIZESMALLCOLOR000POSITIONAUTOENDENDCLASSEXPRESSION('[COLOUR]'eq'3')#颜色值为3的图元的显示STYLESYMBOLsymBOYLATrsjSIZE32ENDLABELTYPEBITMAPSIZESMALLCOLOR000POSITIONAUTOENDENDEND另外,MAPSERVER对tab数据提供了强有力的支持,可以使用“STYLEITEM‘AUTO’”直接从地图数据中读取样式信息。有两个需要注意的问题:一个是MapServer中文标注显示乱码问题。解决方法是在配置文件中添加ENCODEING属性,必须用TRUETY字体,示例配置如下:LABELCOLOR000SIZE9TYPEtruetypeFONTsimsunEncodinggb18030END另一个是关于使用STYLEITEM“AUTO”后,无法加标注的问题。解决方法是:重新配置一层和原来有相同NAME的标注层,第一层用STYLEITEM“AUTO”自动获得样式,第二层手动用LABELITEM和label获得标注。值得说明的是,在分析S57数据时我们强烈推荐CARISEasyView,这是一款很好的免费的数据读取显示工具,支持多种空间数据格式,当然也支持S-57文件(*.000)。CARISEasyView中的“按图元名称筛选显示图元”和“查看图元属性”等功能使我们可以很快地了解S57数据,为后续配置MapFile作准备。3.3系统性能优化技术对于频繁请求服务器端数据并在客户端显示图元的系统,内存开销会非常大,此时系统性能就成了一个瓶颈。可以动态检测浏览器显示的地图的经纬度范围,并请求在相应范围内的数据并显示,这样就大大减小了系统开销,避免了系统每次都请求多余的数据,达到了提高系统性能的目的。图层数量对系统性能有明显影响,特别是在图层数超过100个以后,较少的图层数量对系统速度的提升有明显的帮助,缩减图层数量是提升系统性能的有效途径。因此,在条件允许的情况下,应尽可能合并图层。4.总结与展望电子海图的发展和使用是航海领域的