基于SLD 的IHO S-52 开源解决方案

2022-01-17 05:39亢孟军吴雨锟张开硕苏世亮
测绘地理信息 2022年1期
关键词:海图水深开源

亢孟军 吴雨锟 张开硕 苏世亮 翁 敏

1 武汉大学资源与环境科学学院,湖北武汉,430079 2 城市空间信息工程北京市重点实验室,北京,100038 3 黑龙江地理信息工程院,黑龙江哈尔滨,150081

电子海图是开展各种海上航行活动的数据基础,是极其重要的海洋信息及数据源。其图示表达在行业和研究中具有重要意义。但电子海图的发展与传统GIS 的发展不相适应,具体表现在:①现行电子海图显示标准—— 国际海道测量组织(International Hydrographic Organization,IHO)发布的S-52[1]只面向电子航海图,缺乏一个面向海洋地理信息全域的显示标准[2];②S-52 符号化过程过于复杂,难以集成在常规GIS 软件中;③S-52 与S-57[3]的 耦 合 表 达 方式限制了其开放性和可扩展性。 构建S-52 的开放解决方案,使其便于被开源GIS 软件集成和渲染是一项亟待解决的工作。

当前对S-52 渲染解决方案的研究主要集中在符号库的设计和渲染引擎的开发方面。其中,符号库设计的相关研究热点在于选择通用、便捷的符号组织载体存储海图符号,如PostScript、TrueType、可缩放矢量图形(scalable vector graphics,SVG )以及在ArcGIS 符号体系基础上的扩展[4-8],采用栅格图片存储符号也是一种备选方法,但是局限性大,仅适用于静态的点状符号[9]。SVG 作为一种开放标准的矢量图形语言,具有良好的交互功能,非常适用于表达电子海图符号[10],本文选择此方式组织图元。

S-52 渲染引擎主要有两种实现方式:①底层开发。解析S-57 数据,依照S-52 符号标准,对其进行实现及优化改造[11,12],并设计渲染算法[13]及其他多种功能,集成构建海图综合显示平台[14,15]。②开源渲染解决思路。主要基于XML 构建开放式海图符号的表达规则,并通过OpenLayers、Canvas 等开源类库在开源WebGIS 软件上搭建相关功能模块[16],运用矢量瓦片提高渲染速度。底层开发的渲染引擎通常内嵌于系统,不具备良好的开放性、共享性和数据的互操作性。而目前的开源解决方案注重总体设计思路,对符号化规则的实现细节不足,并且其与现有开源GIS 软件结合不够,技术落地仍有差距。

本文提供了一种基于开放式地理信息系统协会(Open GIS Consortium,OGC)定义的图层样式描述规范(styled layer descriptor,SLD)的S-52 开源解决方案,通过建立S-52 与SLD 的映射及符号转换规则,实现开源GIS 软件对S-52 符号的规则的渲染。同时,采用一张海图配合一份SLD 配置文件的思路,在uDig 中实现了标准电子海图的集成显示。

1 SLD 与S-52 的 映 射 关 系

IHO S-52 规范符号演示库中的复杂符号主要有4 种:①点符号或者是以面状图形中心点渲染的点符号;②复杂线型符号,线由两个或多个不同图元构成;③复杂面型,以特定条纹或者图像填充整个面状区域;④注记符号。

SLD 是一种基于XML 的样式描述语言,具有丰富的扩展性和良好的开放性,是一种重要的GIS符号共享方法,适用于描述复杂S-52 显示规范符号库[17]中的复杂符号样式,能实现跨平台的调用渲染。SLD 定义的渲染规则均包含在标签下,利用其子标签 分别实现点状符号、线状符号、面状符号及注记符号的渲染。其相关标签与属性对应情况如表1 所示。

表1 S-52 符号属性与SLD 对应关系Tab.1 Correspondence Between S-52 SymbolicProperties and SLD

S-52 中的复杂符号往往需要使用一个图形或者图形的有序组合来完成符号渲染,一个独立的图形称为图元。将S-52 转换为SLD 并配置出电子海图的技术流程,如图1 所示。

图1 S-52 与SLD 映射的技术流程Fig.1 Flow Chart of Mapping S-52 to SLD

2 关键S-52 符号的SLD 定义

1)简单类型。简单类型符号包括简单点符号、单色线符号、纯色填充面符号。这些符号可使用简单的SLD 语句定义,它们分别由 标签完成渲染,并可以使用子标签等指定图像及定位、虚线参数及拐角类型、填充颜色及透明度等属性。

2)特殊点符号。特殊点符号是指将特定图像渲染在某一点状目标上或其周围的符号类型。S-52 主要通过符号样式、锚点坐标等属性描述对其进行定义。可使用SLD 中的及其子标签通过加载 或 者 标 签 设 定 的 资源对象将符号渲染在指定位置,并可设置透明度、大小、旋转角、锚点、偏移量以调整其显示细节。

3)复杂线型符号。复杂线型符号是指用多个不同或同一图元等间距沿线状目标渲染的符号类型。S-52主要通过符号样式、线宽等属性描述对其进行定义。可使用SLD 中的多个标签完成渲染。其子标签通过标签指定标签加载图元;通过标签设置起始显示位置及显示间隔。其中,使用设置当前图元宽度与该图元渲染间隔宽度;使用设定当前图元的左偏移量大小。例如,ACHARES51符号由两种图元组合而成,其渲染效果见图2。

图2 复杂线型渲染对比(比例尺1∶25 000)Fig.2 Comparison of Complex Linestyles Rendering(Scale 1∶25 000)

4)复杂面状符号。复杂面状符号指边界线是复杂线型或者需要填充点符号的符号类型。S-52主要通过图元样式、填充规则等属性描述对其进行定义。可使用SLD 中的标签填充面状符号,此时点状符号会被渲染至中心点,通过标签设置图片的偏移量;使用SLD中的标签渲染其边界。例如,ENTRES51 符号由两种图元叠加的复杂线型符号和一个中心点符号叠加而成,其渲染效果见图3。

图3 复杂面型渲染对比(比例尺1∶50 000)Fig.3 Comparison of Complex Area Rendering(Scale 1∶50 000)

5)属性依赖渲染。属性依赖渲染是指各种符号类型需要根据物标具体的属性值指定不同渲染规则的渲染模式。在SLD 中控制符号渲染方式的所有标签需放置于一个标签下,标签可以指定标签,利用OGC 提供的3 种类型操作(空间操作、比较操作、逻辑操作)实现条件控制。可仅渲染满足条件的目标,因此,通过设定多个不同的标签,可实现按照属性值渲染的目的。面状水深渲染结果见图4。

图4 面状水深渲染结果对比(比例尺1∶250 000)Fig.4 Comparison of Area Water Depth Rendering(Scale 1∶250 000)

6)注记运算渲染。注记运算渲染是指直接渲染注记或根据属性渲染注记的渲染模式。SLD 中包括OGC 标准提供的四则运算和丰富的功能函数,四则运算通过标签

实现,功能函数使用标签实现。复杂的注记通常需要用到唯一的控制函数“if_then_else”,该函数能够并列与互相嵌套。使用标签调用属性表中数据,利用标签渲染注记,设置字体、偏移量、标签等多种属性,在其子标签