[HTML5-SVG]基於SVG技術進行WebGIS開發淺析
SVG(Scalable Vector Graphics)是W3C組織為適應InternetWeb應用的飛速發展需要而制定的一套基於XML語言的二維可縮放向量圖形語言描述規範。傳統的HTML靜態頁面描述語言的採用的標記固定、有限且無內涵、不支援向量圖形等缺點日益暴露出來,已經越來越滿足不了WebGIS發展要求。目前網路上滸的MacroMiedia公司提出的SWF檔案格式以其影象向量化,檔案較小及具有互動性而倍受青睞,但它相比於SVG,還是有一些不足之處。XML作為公認的世界未來統一格式標準已經為越來越多的領域所應用。SVG作為XML的一個描述向量圖形的子集的出現,為解決WebGIS面臨的靜態性,資料格式多樣性,平臺相關的Web內容表現和缺乏互動性,網路傳輸慢等問題提供了一個全新的解決方法。
1 SVG與HTML的比較
SVG與HTML相比,具有如下優點:
(1)突破了HTML固定標記集合的約束,使檔案的內容更豐富、更復雜、更容易組成一個完整的資訊體系;
(2)SVG是向量影象格式,非常適合在網路中傳輸和應用。一般而言,SVG影象要比其他網路影象格式(如GIF,JPEG)更小,下載速度更快;
(3)由文字構成向量影象。其文字性使得SVG檔案有良好的跨平臺性和可以通過DOM(Document Object Model)方便的對其進行編輯,修改。另外一個很突出的優點就是SVG檔案中的文字也可以被網路搜尋引擎作為關鍵詞搜尋到。
(4)具有動態互動性。SVG影象能對使用者動作做出不同響應,例如高亮、聲效、特效、動畫等。另外,由於Microsoft的IE6.0中已經集成了瀏覽SVG檔案的外掛,這使得SVG的瀏覽更加方便,容易。
2 SVG與SWF的比較
SWF與SVG相比,其不足體現為:
(1)SWF標準的非開放性。SWF是一個相對封閉的技術,與其他的開放標準之間沒有一個完全融合的方案。隨著XML及其他開放標準的發展,SWF的不協調性將日益突出。
(2)SWF較差的可編輯性。SWF是Flash的輸出檔案格式,作為最終的動畫生成格式,其創作過程封閉在SWF檔案中,無法再進行二次編輯。對於SVG來說,因為它是一種文字格式,用普通的編輯工具就可以開啟並進行編輯。
(3)SWF無法進行影象搜尋。由於SWF為非文字格式,文字不能獨立於影象而存在,因此無法建立類似於SVG的影象搜尋功能。
鑑於SVG的以上特性和優點,在WebGIS應用領域,如果將地理空間資料用SVG格式來儲存、傳輸和顯示,那麼對於獲得WebGIS服務的非專業的大眾使用者群,一方面可以通過各種SVG工具來組織,釋出自己的地理空間資料,從而使地理資訊資源和網上其他資源一樣可以被整修Internet共享;另一方面,由於SVG的互動性,他們也將得到更具表現力和吸引力的WebGIS服務。
3 SVG與VRML的比較
虛擬現實建模語言是用來描述三維互動場景和實體的一種檔案格式。用於聯接全球網(WWW)。它可以用於建立複雜場景的三維表示,如裝飾影象,產品設計和虛擬現實實現。同Java 3D一樣,VRML也是遵循OpenGL標準的。OpenGL是近年來發展起來的一個性能卓越的三維圖形標準,它是在SGI等多家世界聞名的計算機公司的倡導下,以SGI的GL三維圖形庫為基礎制定的一個通用共享的開放式三維圖形標準。VRML在其描述中也採用了節點樹的表達方式。與VRML不同的是,SVG是專門針對二維場景而推出的一種基於是XML標準的標記言語,對三維場景它顯然無能為力。另一方面,VRML並不是基於XML標準的,這對我們實現三維OpenGIS也是一個不利因素。
4 SVG與GML、VML、PGML的比較
向量標識語言(VML),精度影象標識語言(PGML)都是作為W3C的向量影象初始標準在1998年提出的。VML和PGML在很多地方非常的類似,但VML比較適合一些普通向量影象,而PGML可以做出更加豐富多彩,適合專業設計和公眾出版的影象。為了進一步促進影象標準的發展,W3C成立了SVG工作組。SVG工作組將VML和PGML的優勢結合在了一起,重新推出了新的標準向量格式,這就是SVG。GML、SVG、VML都與向量圖形有著密切的關係:GML在表示實體的空間資訊的同時加入了實體的其他屬性資訊,是表示實體的空間資訊和屬性的編碼標準,但它並不支援直接顯示圖形。而VML和SVG是在表示圖形的向量資訊同時加入了圖形的顯示資訊(即以什麼樣的樣式顯示向量圖形),是顯示向量圖形的兩種比較好的格式。相比之下,SVG是綜合了VML的優點後推出的,是國際標準,它比VML具有更多的優點,也有更廣闊的前景。
基於SVG的系統主要由Web服務、GIS服務和資料儲存三部分的關鍵技術構成,採用基於B/S方式的三層體系結構,整個工作流程如下:
(1)客戶端向Web伺服器發出服務請求;Web伺服器接收到請求後,分析呼叫請求。如果只是普通的網頁服務就由Web伺服器直接處理;如果是GIS服務請求,則向下連線GIS伺服器。
(2)在GIS伺服器中,根據呼叫請求,在其中完成空間資料到GML檔案的格式轉換,以及GML檔案到SVG檔案的轉換,並轉回Web伺服器。
(3)Web伺服器把GIS伺服器傳回的SVG檔案傳送給客戶端,在客戶端的瀏覽器中進行顯示,利用JavaScript指令碼語言實現地圖的操作和互動功能。
整個系統功能的實現主要分為伺服器端和客戶端的技術實現,在伺服器端主要由Web伺服器和GIS伺服器組成。其中,Web伺服器主要負責與客戶端的連線,並提供普通的Web服務,當客戶端需要GIS服務時才連線GIS伺服器;GIS伺服器主要負責與空間資料的連線與管理。對於多源異構的空間資料,在GIS伺服器中進行資料格式的轉換,最終生成SVG檔案並傳回給Web伺服器,由Web伺服器再傳回到客戶端進行顯示。本文主要討論了客戶端的SVG影象展示和互動操作的實現。
在客戶端安裝Adobe公司的SVG外掛,在客戶端使用SVG技術,結合JavaScript指令碼語言實現基本的Web GIS功能,包括地圖平移、放大、縮小、圖層的管理、地圖的互動性顯示以及對圖層屬性的查詢等。整個系統基於向量圖形,在放大和縮小的情況下,圖形顯示質量好;能無級放大和縮小,實現了對測線屬性和測線二維反演圖的查詢;能分別管理各個圖層的顯示與隱藏,並實現了對工作區的互動顯示。
1 地圖的平移
地圖向左平移功能的實現程式碼,與其他平移方法程式碼類似,主要是利用currentPosition變數的增加和減少進行平移操作。
- function hori-move(evt){
- viewBox=SVGRoot.getAttribute(′viewBox′);
- var viewVals=viewBox.split(′ ′);
- currentPosition=parseFloat(viewVals[0]);
- if (goLeft==true){//地圖向左移動
- if (currentPosition<0.1){
- currentPosition=currentPosition+0.1;
- }
- goLeft=false;
- }
- viewVals[1]=currentPosition;
- SVGRoot.setAttribute(′viewBox′,viewVals.join(′ ′));
- }
2 地圖的縮放
地圖放大/縮小的實現程式碼,主要利用currentScale變數進行圖形的擴大和縮小變化。
- function zoomIn(){
- if (SVGRoot.currentScale<5){ //地圖放大
- SVGRoot.currentScale=SVGRoot.currentScale*1.5;
- }
- }
- function zoomOut(){
- if (SVGRoot.currentScale>0.3){ //地圖縮小
- SVGRoot.currentScale=SVGRoot.currentScale*0.5;
- }
- }
3 圖層的人機互動
SVG採用基於XML的DOM文件管理結構可以很方便地實現層次管理。〈g〉〈/g〉代表一個組, GIS中的一個專題圖層儲存在一個組中,每個組都有一個唯一標誌ID屬性。根據這個ID屬性就可以通過JavaScript控制不同圖層的顯示和隱藏,並且SVG圖形支援事件程式設計,可以很容易地實現對onclick()或onmouseover()等事件的程式設計。
圖層的隱藏和顯示功能主要是利用setAttribute函式對visibility引數賦予hidden屬性或visible屬性。部分實現程式碼如下:
- function vis_hid(id){ //顯示或隱藏圖層獲得所選圖層物件
- var SVGstyle=SVGDoc.getElementById(id);
- if(SVGstyle.getAttribute("visibility")=="visible")
- {
- //隱藏該圖層
- SVGstyle.setAttribute("visibility","hidden");
- } else {
- //顯示該圖層
- SVGstyle.setAttribute("visibility","visible");
- }
- }
4 查詢功能的實現
這裡假設對測線編號進行查詢,查詢測線的屬性欄位主要根據測線的ID號,利用getElementById()函式進行查詢;利用getAttribute ()函式得到測線的屬性欄位內容。結果如圖3和4所示,分別為查詢測線的反演圖和測線的資料說明。
- //從表單中獲得要查詢的ID號
- function showattrib(value){
- //獲得符合ID號內容的物件
- var SVGid=SVGDoc.getElementById(value)
- var new_window=window.open("","query" ,"height=133,
- width=450");
- //顯示該物件的describe欄位內容
- new_window.document.writeln(SVGid.getAttribute("describe"));
- new_window.focus();
- }
SVG技術不僅用於地圖的展示,任何向量圖形都可以使用該技術。基於該技術的影象具有圖形美觀、檔案標準統一、可讀性強、靈活易用等特點。個人覺得SVG技術在WebGIS及網際網路上的向量圖形釋出中將具有廣闊的應用前景。