劉天堯,趙宇鵬,萬佳馨,劉善偉*
(1.中國石油大學(xué)(華東),山東 青島 266580;2.中海石油環(huán)保服務(wù)(天津)有限公司博士后科研工作站,山東 青島 266061;3.東華理工大學(xué),江西 南昌 330013)
S-57海圖的SLD符號渲染研究
劉天堯1,趙宇鵬2,萬佳馨3,劉善偉1*
(1.中國石油大學(xué)(華東),山東 青島 266580;2.中海石油環(huán)保服務(wù)(天津)有限公司博士后科研工作站,山東 青島 266061;3.東華理工大學(xué),江西 南昌 330013)
隨著海洋事業(yè)的發(fā)展,以S-57海圖為底圖的海洋WebGIS應(yīng)用需求日益增多,但由于S-57海圖數(shù)據(jù)格式和海圖符號規(guī)則的特殊性,缺乏簡單通用的WebGIS符號化渲染方法。分析S-57海圖符號的渲染復(fù)雜度,利用SLD進(jìn)行海圖符號化渲染,以多個典型海圖符號為例,探討海圖符號的屬性值運(yùn)算渲染、復(fù)雜線型渲染、依屬性渲染等相關(guān)問題,并給出對應(yīng)的SLD渲染方法。通過實(shí)驗(yàn)結(jié)果對比,表明SLD可以滿足S-57海圖WebGIS通用符號化渲染的需求,并且擁有較好的渲染效果。
SLD;S-57海圖;WebGIS;符號化
目前,海洋WebGIS系統(tǒng)需求日益增長,AIS船訊信息系統(tǒng)[1]、港口貨物調(diào)配分析系統(tǒng)、海洋溢油應(yīng)急系統(tǒng)[2]等相繼建立起來。S-57海圖是重要的數(shù)據(jù)源,但在數(shù)據(jù)結(jié)構(gòu)、符號表示和渲染規(guī)則上與陸地地形圖差別顯著[3],傳統(tǒng)渲染方式在經(jīng)濟(jì)性、可擴(kuò)展性、通用性等方面存在諸多不足,因此,建立一種簡單通用且適合于WebGIS系統(tǒng)的S-57海圖渲染方法,對于海洋GIS的應(yīng)用和發(fā)展具有重要意義。在WebGIS開發(fā)中對S-57海圖的調(diào)用一般采用2種方式:一是由專用海圖繪制軟件渲染S-57海圖生成柵格圖像金字塔切片進(jìn)行調(diào)用[4],但專用海圖渲染軟件和服務(wù)一般價格昂貴,而且柵格切片在海圖矢量拓?fù)潢P(guān)系操作或運(yùn)算上會表現(xiàn)出明顯的局限性;二是在瀏覽器端編寫符號渲染規(guī)則進(jìn)行實(shí)時渲染[5],雖然能夠保留S-57海圖的矢量性,但由于海圖符號規(guī)則異常復(fù)雜,會給瀏覽器帶來沉重的負(fù)擔(dān),而且通用性不強(qiáng)。作為GIS領(lǐng)域中一種重要的GIS符號共享方法[6],OGC(open GIS consortium)的SLD(Styled Layer Descriptor)以其豐富的擴(kuò)展性和良好的開放性[7]在專題圖的繪制[8]、三維城市渲染[9]、SLD標(biāo)準(zhǔn)改進(jìn)等多方面擁有眾多研究成果。而且SLD最初提出時就是為了描繪WMS(Web Map Service)、WFS(Web Feature Service) 和 WCS(Web Coverage Service)等WebGIS服務(wù),在WebGIS符號渲染方面有著其他渲染方式無法比擬的優(yōu)勢。作為XML的擴(kuò)展,SLD具有很強(qiáng)的通用性,既可以在服務(wù)器端進(jìn)行編寫,對S-57海圖進(jìn)行渲染生成切片,也可以在客戶端進(jìn)行編寫并傳回服務(wù)器端,還可以直接由客戶端根據(jù)SLD進(jìn)行渲染,多種方式靈活組合能夠有效平衡前后臺負(fù)載。不僅如此,SLD還擁有豐富的功能函數(shù)、邏輯判斷能力和靈活的語法規(guī)則,非常適合復(fù)雜符號的渲染工作,是一種通用性好且功能強(qiáng)大的WebGIS渲染方式。
本文在參考SLD多方面研究的基礎(chǔ)上,嘗試使用SLD進(jìn)行S-57海圖符號化渲染工作,以多個典型海圖圖層為例,重點(diǎn)論述屬性值運(yùn)算渲染、復(fù)雜線型渲染、依屬性渲染等S-57海圖渲染關(guān)鍵問題,對S-57海圖的SLD渲染進(jìn)行適用性評價,給出不同類型海圖圖層對應(yīng)的SLD渲染方法。
本文采用的S-57海圖數(shù)據(jù)是由中國電子海圖發(fā)行中心發(fā)行的中國近海及周邊海域的部分S-57海圖,選用的海圖涉及多種比例尺,海域位置分散,具有代表性,具體圖號及描述如表1所示。
表1 S-57海圖數(shù)據(jù)列表
實(shí)驗(yàn)軟件主要有3個:GDAL/OGR1.9.2、GeoServer2.5和eLaneViewer2.0。GDAL/OGR是著名的GIS開源庫,支持眾多矢量、柵格數(shù)據(jù)的格式轉(zhuǎn)換,可以直接解析S-57海圖,并將其轉(zhuǎn)換成shpfile格式;GeoServer是著名的開源WMS、WFS地圖服務(wù)發(fā)布軟件,以SLD作為符號渲染方式,對SLD各功能特性具有良好的支持。eLaneViewer是一款免費(fèi)的S-57/S-52海圖瀏覽器,支持S-57海圖及海圖更新數(shù)據(jù),顯示符合IHO S-52標(biāo)準(zhǔn)。
本文使用GDAL/OGR進(jìn)行數(shù)據(jù)預(yù)處理,將S-57海圖轉(zhuǎn)化為GIS通用格式shpfile數(shù)據(jù),利用GeoServer加載轉(zhuǎn)換后的海圖數(shù)據(jù),編寫對應(yīng)海圖圖層的SLD渲染樣式,發(fā)布WMS服務(wù)并進(jìn)行預(yù)覽,將顯示結(jié)果與eLaneViewer直接加載S-57數(shù)據(jù)的顯示效果進(jìn)行對比分析。
2.1 屬性值運(yùn)算渲染
水深點(diǎn)圖層(SOUNDG_point)是S-57海圖中計算能力需求最高的圖層之一。本文以此圖層為例,檢驗(yàn)SLD的計算能力是否滿足海圖渲染需求。具體渲染規(guī)則如下:當(dāng)水深值小于或等于30 m時,為該字段整數(shù)部分在左上角、小數(shù)部分在左下角所構(gòu)成的圖形,如果小數(shù)部分為0,則小數(shù)部分不顯示;當(dāng)水深值大于30 m時,只顯示整數(shù)部分。
水深點(diǎn)圖層渲染的關(guān)鍵問題是如何將水深字段中的屬性值的整數(shù)與小數(shù)部分拆離,這需要屬性值計算的功能,而SLD語言本身并沒有定義該功能,我們可以通過加入ogc擴(kuò)展引入四則運(yùn)算功能和功能函數(shù)。ogc擴(kuò)展屬于SLD官方擴(kuò)展,SLD解析器默認(rèn)進(jìn)行支持,可以滿足絕大部分計算需求。
對于水深點(diǎn)的整數(shù)和小數(shù)部分,由于位置不同,需要分別構(gòu)建文字符號標(biāo)簽〈TextSymbolizer〉,真正的賦值工作需要在〈Label〉標(biāo)簽中完成,因此計算功能也需要在此標(biāo)簽中進(jìn)行。
整數(shù)部分計算主要使用2個功能函數(shù),將字段DEPTH屬性值利用功能函數(shù)floor(向下取整)得到Double型的整數(shù)部分,再用功能函數(shù)parseInt(Integer強(qiáng)制類型轉(zhuǎn)換)將其轉(zhuǎn)化為Integer型,以避免出現(xiàn)小數(shù)點(diǎn),即可得到整數(shù)部分。
小數(shù)部分使用了Mul(乘法)和Sub(減法)四則運(yùn)算,首先DEPTH與整數(shù)部分相減獲得實(shí)際小數(shù)值,然后將小數(shù)乘以10獲得小數(shù)部分?jǐn)?shù)值(floor型),再利用功能函數(shù)round(四舍五入,返回值為Integer,一定程度可以替代功能函數(shù)parseInt)將其轉(zhuǎn)化為Integer型,即可獲得整數(shù)部分。
對于小數(shù)部分的偏移,可以為其嵌套〈sld:DisplacementX〉和〈sld:DisplacementY〉標(biāo)簽分別對X方向和Y方向進(jìn)行按像素偏移。水深值在大于30 m和小于30 m時渲染規(guī)則并不相同,但涉及到的是依屬性值渲染相關(guān)內(nèi)容(如圖1),將實(shí)際渲染結(jié)果與海圖軟件渲染結(jié)果進(jìn)行對比可以看出,擁有靈活嵌套的、具備四則運(yùn)算能力和豐富功能函數(shù)的SLD,可以滿足S-57海圖計算要求最高的水深圖層計算需求。
圖1 水深點(diǎn)渲染效果對比
海圖屬性值運(yùn)算方法總結(jié)如下:同一字段屬性值的整數(shù)與小數(shù)顯示規(guī)則不同時,可利用SLD符號可疊加特性構(gòu)建2個符號層,分別進(jìn)行取整數(shù)和取小數(shù)運(yùn)算,再進(jìn)行相關(guān)樣式規(guī)則的編寫;同一符號層中可利用四則運(yùn)算和數(shù)學(xué)功能函數(shù)進(jìn)行嵌套組合,完成運(yùn)算需求。通過對其他需要屬性運(yùn)算的S-57海圖圖層進(jìn)行實(shí)際渲染檢驗(yàn)表明,以上運(yùn)算方法對S-57海圖渲染規(guī)則具有良好的適用性。
2.2 復(fù)雜線型渲染
S-57海圖中很多線圖層和面圖層的邊線是由2種或3種圖形按一定規(guī)則構(gòu)成的,線型結(jié)構(gòu)比較復(fù)雜。海底電纜線圖層(CBLSUB_line)是一個典型的由3種圖形構(gòu)成的線圖層,其海圖軟件渲染效果如圖3c所示。
SLD可以利用〈GraphicStroke〉標(biāo)簽定義位圖格式的線型,但只能使用單一圖片,如果圖片沿線條路徑方向上的長度過長,則會造成直線在彎曲處有明顯斷裂,如圖3a所示,電纜線單張節(jié)點(diǎn)圖片長達(dá)85 px,在彎曲處按切線進(jìn)行渲染,造成線段不連貫。為了保證線型的平滑連貫,本文將大節(jié)點(diǎn)拆分,將每個小圖形皆當(dāng)作一個小節(jié)點(diǎn),然后利用SLD符號層的可疊加性按插空的方式進(jìn)行疊加。
對海底電纜線圖層而言,一個大節(jié)點(diǎn)中擁有5個小節(jié)點(diǎn),因此將其分為5條線的疊加,方法如下:對于第n條線,通過〈OnlineResource〉引入該線的節(jié)點(diǎn)圖片,利用〈CssParameter name="stroke-dasharray"〉XnLXn〈 CssParameter 〉和 〈CssParameter name="strokedashoffset"〉Yn〈 CssParameter 〉標(biāo)簽控制筆繪長度和偏移量,其中Xn為當(dāng)前小節(jié)點(diǎn)圖片的像素長度,L為大節(jié)點(diǎn)像素長度,Yn為第n個小節(jié)點(diǎn)筆觸起點(diǎn)相對大節(jié)點(diǎn)末端的左偏移量,如圖2所示。
圖2 SLD多線疊加示意圖
按照上述方法構(gòu)建5個〈LineSymbolizer〉,在同一規(guī)則〈Rule〉中進(jìn)行疊加,效果如圖3b所示。由渲染效果對比可以看出,使用SLD 5線疊加方式渲染的電纜線自然平滑,可以滿足S-57海圖電纜線圖層的渲染需求。
圖3 電纜線渲染效果對比
復(fù)雜線型渲染方法如下:首先將線要素進(jìn)行節(jié)點(diǎn)劃分,找出最大重復(fù)節(jié)點(diǎn),判斷節(jié)點(diǎn)長度是否大于20 像素。如果小于20像素,則進(jìn)行單線渲染,如果大于20像素則將該大節(jié)點(diǎn)拆分為n個小節(jié)點(diǎn)(n為大節(jié)點(diǎn)所包含的小節(jié)點(diǎn)個數(shù)),利用n線疊加的方式進(jìn)行渲染。大量實(shí)驗(yàn)表明,該方法對S-57海圖的SLD渲染具有普適性。
2.3 依屬性值渲染
S-57海圖中許多圖層的渲染需要依照某一個或幾個字段的屬性值的取值范圍分別進(jìn)行對應(yīng)的樣式渲染。以深度范圍面圖層(DEPARE_polygon)為例,有2個字段DRVAL1和DRVAL2,分別代表該面元素的最大和最小水深,需要根據(jù)水深規(guī)則分別渲染不同的顏色,如表2所示。
表2 深度范圍圖層渲染規(guī)則
使用SLD的屬性值過濾(ogc:Filter)功能、SLD比較運(yùn)算(Comparison Operators)和邏輯運(yùn)算(Logical Operators)功能,可以實(shí)現(xiàn)對單個字段或幾個字段取值的篩選過濾。例如對于第一條水深規(guī)則,可以構(gòu)建2個〈ogc:PropertyIsEqualTo〉(屬性等于)標(biāo)簽,分別構(gòu)建“DRVAL1=1”和“DRVAL2=-5”2個條件,然后利用〈ogc:And〉(且)標(biāo)簽將2條件進(jìn)行連接,對于第5條大于等于條件可使用〈ogc:PropertyIsGreaterT hanOrEqualTo〉(屬性大于等于)標(biāo)簽實(shí)現(xiàn)。每一條水深規(guī)則分別用一個〈Rule〉標(biāo)簽包裹,最后將所有〈Rule〉按順序疊放即可實(shí)現(xiàn)依屬性值渲染,對比效果如圖4所示。
圖4 水深范圍渲染效果對比
依屬性值渲染方法如下:為每一個屬性值范圍構(gòu)建一個規(guī)則標(biāo)簽,分別在每個規(guī)則標(biāo)簽中利用SLD的過濾功能和比較運(yùn)算的靈活嵌套來確定該規(guī)則標(biāo)簽的屬性值范圍,最后將所有規(guī)則標(biāo)簽進(jìn)行疊加。實(shí)驗(yàn)表明,該方法滿足S-57海圖的渲染需要。
2.4 綜合效果預(yù)覽
解決了屬性值運(yùn)算渲染、復(fù)雜線型渲染和依屬性值渲染3個問題之后,可以滿足SLD的S-57電子海圖符號化渲染需要。為了展示SLD海圖渲染的整體效果,圖層渲染后可利用GeoServer將同一海圖文件的圖層合并為一個圖層組并進(jìn)行切片預(yù)覽。鼠標(biāo)點(diǎn)擊可查詢海圖要素屬性值,整體效果如圖5所示。
圖5 GeoServer預(yù)覽效果
針對S-57海圖在WebGIS符號化方面缺少簡單通用的渲染方法的問題,提出利用SLD進(jìn)行海圖渲染,并進(jìn)行適用性分析,討論S-57海圖的屬性值運(yùn)算渲染、復(fù)雜線型渲染和依屬性渲染問題,提出對應(yīng)的SLD編寫方法。通過實(shí)際渲染效果對比分析表明,所給方法可以滿足S-57海圖的渲染需求,并具有良好的渲染效果,為基于S-57海圖的WebGIS符號渲染提供了一種簡單通用的解決方法,為基于S-57電子海圖的海洋GIS系統(tǒng)開發(fā)提供了底圖基礎(chǔ)。參考文獻(xiàn)
[1] 徐建設(shè),史保勇.基于電子海圖的船舶航線顯示與監(jiān)控系統(tǒng)設(shè)計[J].地理空間信息,2008,6(4):46-48
[2] 廖國祥,熊德琪,翟偉康,等.基于WebGIS的海上溢油應(yīng)急信息系統(tǒng)的構(gòu)建[J].計算機(jī)工程,2007,33(12):272-274
[3] 姜鳳輝,李樹軍,王臻.現(xiàn)代海圖符號研究[J].測繪工程,2010(4):16-18
[4] 杜國駿.基于Android的瓦片式電子海圖系統(tǒng)的研究[D].大連:大連海事大學(xué),2013
[5] 王曉.基于Html5的矢量地圖發(fā)布關(guān)鍵技術(shù)研究[D].南京:南京師范大學(xué),2011
[6] 陶陶,閭國年,張書亮,等.GIS地圖符號共享研究進(jìn)展與展望[J].中國圖像圖形學(xué)報,2007,12(8):1 326-1 332
[7] 周玉科,周成虎,馬廷,等.?dāng)?shù)字地圖要素樣式結(jié)構(gòu)化存儲表達(dá)研究與實(shí)現(xiàn)[J].地理與地理信息科學(xué),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
劉天堯,碩士,研究方向?yàn)閃ebGIS應(yīng)用與開發(fā)。
2015-01-16。
項(xiàng)目來源:工信部海洋工程裝備科研項(xiàng)目(201212)。(*為通訊作者)