劉天堯,趙宇鵬,萬佳馨,劉善偉*
(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渲染方法。
本文采用的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.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預覽效果
針對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)。(*為通訊作者)