S-57海图的SLD符号渲染研究
2016-12-26刘天尧赵宇鹏万佳馨刘善伟
刘天尧,赵宇鹏,万佳馨,刘善伟*
(1.中国石油大学(华东),山东 青岛 266580;2.中海石油环保服务(天津)有限公司博士后科研工作站,山东 青岛 266061;3.东华理工大学,江西 南昌 330013)
S-57海图的SLD符号渲染研究
刘天尧1,赵宇鹏2,万佳馨3,刘善伟1*
(1.中国石油大学(华东),山东 青岛 266580;2.中海石油环保服务(天津)有限公司博士后科研工作站,山东 青岛 266061;3.东华理工大学,江西 南昌 330013)
随着海洋事业的发展,以S-57海图为底图的海洋WebGIS应用需求日益增多,但由于S-57海图数据格式和海图符号规则的特殊性,缺乏简单通用的WebGIS符号化渲染方法。分析S-57海图符号的渲染复杂度,利用SLD进行海图符号化渲染,以多个典型海图符号为例,探讨海图符号的属性值运算渲染、复杂线型渲染、依属性渲染等相关问题,并给出对应的SLD渲染方法。通过实验结果对比,表明SLD可以满足S-57海图WebGIS通用符号化渲染的需求,并且拥有较好的渲染效果。
SLD;S-57海图;WebGIS;符号化
目前,海洋WebGIS系统需求日益增长,AIS船讯信息系统[1]、港口货物调配分析系统、海洋溢油应急系统[2]等相继建立起来。S-57海图是重要的数据源,但在数据结构、符号表示和渲染规则上与陆地地形图差别显著[3],传统渲染方式在经济性、可扩展性、通用性等方面存在诸多不足,因此,建立一种简单通用且适合于WebGIS系统的S-57海图渲染方法,对于海洋GIS的应用和发展具有重要意义。在WebGIS开发中对S-57海图的调用一般采用2种方式:一是由专用海图绘制软件渲染S-57海图生成栅格图像金字塔切片进行调用[4],但专用海图渲染软件和服务一般价格昂贵,而且栅格切片在海图矢量拓扑关系操作或运算上会表现出明显的局限性;二是在浏览器端编写符号渲染规则进行实时渲染[5],虽然能够保留S-57海图的矢量性,但由于海图符号规则异常复杂,会给浏览器带来沉重的负担,而且通用性不强。作为GIS领域中一种重要的GIS符号共享方法[6],OGC(open GIS consortium)的SLD(Styled Layer Descriptor)以其丰富的扩展性和良好的开放性[7]在专题图的绘制[8]、三维城市渲染[9]、SLD标准改进等多方面拥有众多研究成果。而且SLD最初提出时就是为了描绘WMS(Web Map Service)、WFS(Web Feature Service) 和 WCS(Web Coverage Service)等WebGIS服务,在WebGIS符号渲染方面有着其他渲染方式无法比拟的优势。作为XML的扩展,SLD具有很强的通用性,既可以在服务器端进行编写,对S-57海图进行渲染生成切片,也可以在客户端进行编写并传回服务器端,还可以直接由客户端根据SLD进行渲染,多种方式灵活组合能够有效平衡前后台负载。不仅如此,SLD还拥有丰富的功能函数、逻辑判断能力和灵活的语法规则,非常适合复杂符号的渲染工作,是一种通用性好且功能强大的WebGIS渲染方式。
本文在参考SLD多方面研究的基础上,尝试使用SLD进行S-57海图符号化渲染工作,以多个典型海图图层为例,重点论述属性值运算渲染、复杂线型渲染、依属性渲染等S-57海图渲染关键问题,对S-57海图的SLD渲染进行适用性评价,给出不同类型海图图层对应的SLD渲染方法。
1 实验数据及软件
本文采用的S-57海图数据是由中国电子海图发行中心发行的中国近海及周边海域的部分S-57海图,选用的海图涉及多种比例尺,海域位置分散,具有代表性,具体图号及描述如表1所示。
表1 S-57海图数据列表
实验软件主要有3个:GDAL/OGR1.9.2、GeoServer2.5和eLaneViewer2.0。GDAL/OGR是著名的GIS开源库,支持众多矢量、栅格数据的格式转换,可以直接解析S-57海图,并将其转换成shpfile格式;GeoServer是著名的开源WMS、WFS地图服务发布软件,以SLD作为符号渲染方式,对SLD各功能特性具有良好的支持。eLaneViewer是一款免费的S-57/S-52海图浏览器,支持S-57海图及海图更新数据,显示符合IHO S-52标准。
本文使用GDAL/OGR进行数据预处理,将S-57海图转化为GIS通用格式shpfile数据,利用GeoServer加载转换后的海图数据,编写对应海图图层的SLD渲染样式,发布WMS服务并进行预览,将显示结果与eLaneViewer直接加载S-57数据的显示效果进行对比分析。
2 海图符号渲染分析
2.1 属性值运算渲染
水深点图层(SOUNDG_point)是S-57海图中计算能力需求最高的图层之一。本文以此图层为例,检验SLD的计算能力是否满足海图渲染需求。具体渲染规则如下:当水深值小于或等于30 m时,为该字段整数部分在左上角、小数部分在左下角所构成的图形,如果小数部分为0,则小数部分不显示;当水深值大于30 m时,只显示整数部分。
水深点图层渲染的关键问题是如何将水深字段中的属性值的整数与小数部分拆离,这需要属性值计算的功能,而SLD语言本身并没有定义该功能,我们可以通过加入ogc扩展引入四则运算功能和功能函数。ogc扩展属于SLD官方扩展,SLD解析器默认进行支持,可以满足绝大部分计算需求。
对于水深点的整数和小数部分,由于位置不同,需要分别构建文字符号标签〈TextSymbolizer〉,真正的赋值工作需要在〈Label〉标签中完成,因此计算功能也需要在此标签中进行。
整数部分计算主要使用2个功能函数,将字段DEPTH属性值利用功能函数floor(向下取整)得到Double型的整数部分,再用功能函数parseInt(Integer强制类型转换)将其转化为Integer型,以避免出现小数点,即可得到整数部分。
小数部分使用了Mul(乘法)和Sub(减法)四则运算,首先DEPTH与整数部分相减获得实际小数值,然后将小数乘以10获得小数部分数值(floor型),再利用功能函数round(四舍五入,返回值为Integer,一定程度可以替代功能函数parseInt)将其转化为Integer型,即可获得整数部分。
对于小数部分的偏移,可以为其嵌套〈sld:DisplacementX〉和〈sld:DisplacementY〉标签分别对X方向和Y方向进行按像素偏移。水深值在大于30 m和小于30 m时渲染规则并不相同,但涉及到的是依属性值渲染相关内容(如图1),将实际渲染结果与海图软件渲染结果进行对比可以看出,拥有灵活嵌套的、具备四则运算能力和丰富功能函数的SLD,可以满足S-57海图计算要求最高的水深图层计算需求。
图1 水深点渲染效果对比
海图属性值运算方法总结如下:同一字段属性值的整数与小数显示规则不同时,可利用SLD符号可叠加特性构建2个符号层,分别进行取整数和取小数运算,再进行相关样式规则的编写;同一符号层中可利用四则运算和数学功能函数进行嵌套组合,完成运算需求。通过对其他需要属性运算的S-57海图图层进行实际渲染检验表明,以上运算方法对S-57海图渲染规则具有良好的适用性。
2.2 复杂线型渲染
S-57海图中很多线图层和面图层的边线是由2种或3种图形按一定规则构成的,线型结构比较复杂。海底电缆线图层(CBLSUB_line)是一个典型的由3种图形构成的线图层,其海图软件渲染效果如图3c所示。
SLD可以利用〈GraphicStroke〉标签定义位图格式的线型,但只能使用单一图片,如果图片沿线条路径方向上的长度过长,则会造成直线在弯曲处有明显断裂,如图3a所示,电缆线单张节点图片长达85 px,在弯曲处按切线进行渲染,造成线段不连贯。为了保证线型的平滑连贯,本文将大节点拆分,将每个小图形皆当作一个小节点,然后利用SLD符号层的可叠加性按插空的方式进行叠加。
对海底电缆线图层而言,一个大节点中拥有5个小节点,因此将其分为5条线的叠加,方法如下:对于第n条线,通过〈OnlineResource〉引入该线的节点图片,利用〈CssParameter name="stroke-dasharray"〉XnLXn〈 CssParameter 〉和 〈CssParameter name="strokedashoffset"〉Yn〈 CssParameter 〉标签控制笔绘长度和偏移量,其中Xn为当前小节点图片的像素长度,L为大节点像素长度,Yn为第n个小节点笔触起点相对大节点末端的左偏移量,如图2所示。
图2 SLD多线叠加示意图
按照上述方法构建5个〈LineSymbolizer〉,在同一规则〈Rule〉中进行叠加,效果如图3b所示。由渲染效果对比可以看出,使用SLD 5线叠加方式渲染的电缆线自然平滑,可以满足S-57海图电缆线图层的渲染需求。
图3 电缆线渲染效果对比
复杂线型渲染方法如下:首先将线要素进行节点划分,找出最大重复节点,判断节点长度是否大于20 像素。如果小于20像素,则进行单线渲染,如果大于20像素则将该大节点拆分为n个小节点(n为大节点所包含的小节点个数),利用n线叠加的方式进行渲染。大量实验表明,该方法对S-57海图的SLD渲染具有普适性。
2.3 依属性值渲染
S-57海图中许多图层的渲染需要依照某一个或几个字段的属性值的取值范围分别进行对应的样式渲染。以深度范围面图层(DEPARE_polygon)为例,有2个字段DRVAL1和DRVAL2,分别代表该面元素的最大和最小水深,需要根据水深规则分别渲染不同的颜色,如表2所示。
表2 深度范围图层渲染规则
使用SLD的属性值过滤(ogc:Filter)功能、SLD比较运算(Comparison Operators)和逻辑运算(Logical Operators)功能,可以实现对单个字段或几个字段取值的筛选过滤。例如对于第一条水深规则,可以构建2个〈ogc:PropertyIsEqualTo〉(属性等于)标签,分别构建“DRVAL1=1”和“DRVAL2=-5”2个条件,然后利用〈ogc:And〉(且)标签将2条件进行连接,对于第5条大于等于条件可使用〈ogc:PropertyIsGreaterT hanOrEqualTo〉(属性大于等于)标签实现。每一条水深规则分别用一个〈Rule〉标签包裹,最后将所有〈Rule〉按顺序叠放即可实现依属性值渲染,对比效果如图4所示。
图4 水深范围渲染效果对比
依属性值渲染方法如下:为每一个属性值范围构建一个规则标签,分别在每个规则标签中利用SLD的过滤功能和比较运算的灵活嵌套来确定该规则标签的属性值范围,最后将所有规则标签进行叠加。实验表明,该方法满足S-57海图的渲染需要。
2.4 综合效果预览
解决了属性值运算渲染、复杂线型渲染和依属性值渲染3个问题之后,可以满足SLD的S-57电子海图符号化渲染需要。为了展示SLD海图渲染的整体效果,图层渲染后可利用GeoServer将同一海图文件的图层合并为一个图层组并进行切片预览。鼠标点击可查询海图要素属性值,整体效果如图5所示。
图5 GeoServer预览效果
3 结 语
针对S-57海图在WebGIS符号化方面缺少简单通用的渲染方法的问题,提出利用SLD进行海图渲染,并进行适用性分析,讨论S-57海图的属性值运算渲染、复杂线型渲染和依属性渲染问题,提出对应的SLD编写方法。通过实际渲染效果对比分析表明,所给方法可以满足S-57海图的渲染需求,并具有良好的渲染效果,为基于S-57海图的WebGIS符号渲染提供了一种简单通用的解决方法,为基于S-57电子海图的海洋GIS系统开发提供了底图基础。参考文献
[1] 徐建设,史保勇.基于电子海图的船舶航线显示与监控系统设计[J].地理空间信息,2008,6(4):46-48
[2] 廖国祥,熊德琪,翟伟康,等.基于WebGIS的海上溢油应急信息系统的构建[J].计算机工程,2007,33(12):272-274
[3] 姜凤辉,李树军,王臻.现代海图符号研究[J].测绘工程,2010(4):16-18
[4] 杜国骏.基于Android的瓦片式电子海图系统的研究[D].大连:大连海事大学,2013
[5] 王晓.基于Html5的矢量地图发布关键技术研究[D].南京:南京师范大学,2011
[6] 陶陶,闾国年,张书亮,等.GIS地图符号共享研究进展与展望[J].中国图像图形学报,2007,12(8):1 326-1 332
[7] 周玉科,周成虎,马廷,等.数字地图要素样式结构化存储表达研究与实现[J].地理与地理信息科学,2012,28(3):7-10
[8] Rautenbach V,Coetzee S,Iwaniak A.Orchestrating OGC Web Services to Produce Thematic Maps in a Spatial Information Infrastructure[J].Computers, Environment and Urban Systems, 2013(37):107-120
[9] Over M,Schilling A,Neubauer S,et al.Generating Webbased 3D City Models from OpenStreetMap:The Current Cituation in Germany[J].Computers, Environment and Urban Systems,2010,34(6):496-507
P208
B
1672-4623(2016)04-0062-03
10.3969/j.issn.1672-4623.2016.04.021
刘天尧,硕士,研究方向为WebGIS应用与开发。
2015-01-16。
项目来源:工信部海洋工程装备科研项目(201212)。(*为通讯作者)