<轉>
現在越來越多的桌面應用轉向Web平臺,而人們也一直希望日益豐富的Web應用能夠做到簡單易用、高效并具有良好的交互性能。隨著Google推出Google Maps、GMail等一系列服務讓人們看到了曙光,感受到一種全新的Web使用體驗。這種體驗的顯著特點就是無需下載、安裝,操作響應速度快,具有良好的互動性,尤其是再也沒有出現以往那種在等待返回結果期間由于瀏覽器刷新而造成的白屏現象。
這種令人欣喜的體驗源自服務中所采用的Ajax方法。Ajax(Asynchronous JavaScript + XML)并不是一種新的技術。正如它的名字所表現的那樣,Ajax是由幾種蓬勃發展的技術以新的方式組合而成:使用XMLHttpRequest進行異步數據傳輸;利用XML和XSLT技術進行數據的交換與處理;以XHTML和CSS作為顯示標準,通過DOM實現動態顯示和交互;而這一切都通過JavaScript串聯銜接起來。正是這些傳統技術看似簡單的重組卻給Web應用開發帶來新的活力。
對于WebGIS而言,這種良好的用戶體驗是其應用一直缺乏的,研究與開發人員總是難以在性能和使用體驗之間找到合適的平衡點。針對這個問題,本文探討了Ajax方法在WebGIS客戶端實現中的應用,以期改善用戶體驗。
AJAX客戶端分析
傳統客戶端分析
經過多年的發展,WebGIS的系統架構已趨于成熟穩定,通常采用三層B/S(Browser/Server)結構,即由瀏覽器、GIS應用服務器、空間數據庫等三部分構成。其中,瀏覽器對應于傳統C/S(Client/Server)結構中的客戶端。
客戶端是聯系用戶與GIS服務的橋梁,作用重大,但先天受制于瀏覽器,后天則深受系統所采用開發技術的影響。初期的WebGIS采用CGI方式,交互操作完全依賴瀏覽器處理,用戶體驗很差,經常遇到白屏狀況。研究人員隨即引入Plug-In技術擴展瀏覽器的GIS 功 能,但收效并不顯著。而隨著Java、DCOM 等技術的大規模應用,主流GIS廠商紛紛采用Applet、ActiveX等技術開發客戶端。它們嵌入網頁運行,功能較強,但與服務端耦合度高,初次使用前還要下載并安裝相應程序。不同之處在于:Applet可以跨平臺運行,前提是有Java運行環境的支持;而ActiveX只適用于Windows平臺,安裝時還需安全認證與注冊。這些額外的要求對普通用戶是種負擔。因而,除Applet與ActiveX外,ArcIMS等商業WebGIS軟件同時提供了基于JavaScript和DHTML等技術的客戶端實現。雖然簡便,但效果不甚理想,用戶常陷入等待之中。
此外,WebGIS所采用的空間數據傳輸模式對客戶端的開發也有較大影響,一直存在著矢柵數據之爭。地圖可在服務器端完成處理與繪制,以JPG等圖像形式通過HTTP協議傳輸給客戶端。這種柵格地圖是靜態的,缺乏交互性,傳輸占用網絡帶寬大,但可直接通過瀏覽器查看,客戶端功能因而比較簡單而對服務器的要求高。相關工作也可部分移至客戶端完成,Applet和ActiveX方式中常采用。矢量數據通常基于TCP/IP協議傳輸,由于數據量相對較小,所以速度快。這種客戶端在本地繪制地圖,可以實現即時互動,甚至完成一些較復雜的分析工作。權衡利弊,開發人員不得不在客戶端和服務端之間進行平衡,或采用胖客戶端模式,或是瘦客戶端模式,抑或是混合模式。
隨著OGC(Open GIS Consortium)共享標準的出臺與不斷完善,WebGIS逐步向著信息共享的方向發展:矢量數據統一采用GML作為交換格式,可以和柵格數據一樣通過HTTP協議進行傳輸;所提供的服務也逐步細化、標準化。只要遵循OGC各類服務規范即可在異構環境下完成相關空間數據處理任務,降低了服務端與客戶端的耦合度。這些變化對基于瀏覽器的客戶端提出了新的要求,同時也帶了機遇。
Ajax模型
傳統Web應用模型的運行流程為:用戶的操作觸發提交給Web服務器的HTTP請求,服務器接到請求后執行相應操作,然后返回一個HTML頁面給客戶端。這個過程不斷重復直到用戶退出。整個過程是同步的,前一步結束才能進入下一環節,因而導致用戶在發出請求后,得到返回結果前的這段時間里一直處于等待狀態。瀏覽器同樣因為等待而無法響應用戶的進一步操作,并由于頁面刷新引發白屏現象。
Ajax模型與傳統模型的不同之處在于服務應答的異步性(圖1)。這是通過在客戶端與服務端之間引入一個中間層——Ajax引擎(Ajax Engine)實現的。Ajax引擎將客戶端的頁面剝離為數據層、控制層和表現層:瀏覽器中的各類數據被組織成一棵DOM樹;針對操作觸發的各種事件,利用JavaScript處理DOM數據并依據XHTML和CSS規范進行界面的繪制。結構的明晰為異步應答奠定基礎,所有與服務端的通訊都被集中提交給XmlHttpRequest對象處理。該對象封裝了XML-RPC協議,支持異步請求,相當于提供了獨立用戶交互線程之外,與服務端通訊的專用線程。簡而言之,通過XmlHttpRequest可以使用JavaScript向服務器提出請求并處理響應,而不阻塞用戶。這種異步通訊機制是Ajax模型的核心。這種特性決定了它適用于需要與服務端頻繁交互,操作即時響應要求高的環境。
這里以IE環境為例說明XmlHttpRequest的基本運用。創建XmlHttpRequest對象request,以GET方法向服務器提交參數url,收到回應后調用callback函數。代碼如下:
request = new ActvieXObject(“Microsoft.XMLHTTP”);
if (request!= null)
{
url = “http://localhost/q?x=1 ”;
request.onreadystatechange = callback;
request.open (“GET”, url, true);
request.send ( );
}
基于Ajax和OGC規范的WebGIS框架
通過客戶端的發展回顧和Ajax機制分析,我們不難發現WebGIS具備采用Ajax開發的基本特征:需要即時的交互響應,大量、頻繁地與服務器通訊并以GML或圖片形式傳輸數據。實際上,ArcIMS早已徘徊在Ajax大門外了。它的HTML Viewer模式可傳輸ArcXML數據與圖片,利用JavaScript腳本控制操作同時采用DHTML技術顯示地圖,只缺異步傳輸這關鍵一環。所以,Ajax完全可以擔當起WebGIS客戶端實現的重任,提升用戶體驗。
在符合OGC規范的WebGIS中采用Ajax實現客戶端是極其合適的,顯而易見的好處就是以極自然的方式實現了空間信息共享所需要的通用客戶端。人們無需安裝額外的程序,僅依靠瀏覽器本身就可以從網上獲取空間信息,系統開發的焦點僅需集中在提高服務端性能。Google Maps已為我們展現了這種場景。
Google Maps可以看作是OGC規范中WCS 服務(Web Coverage Service)與WFS服務(Web Feature Service)的應用,分別提供圖像與興趣點查詢服務。地圖是渲染好的,和衛星影像一樣以圖像形式存放在服務器端,并被切片按金字塔方式組織。含有地理坐標的興趣點數據則單獨存放在數據庫中。在客戶端,整個交互過程為:
1、Ajax引擎響應用戶操作得到當前比例尺、視場范圍以及鼠標所在屏幕位置;
2、將屏幕坐標換算為地理做標,以異步方式讀取相關數據;
3、將返回的興趣點坐標換算為屏幕坐標,在客戶端完成繪制并疊加在地圖與影像上。 Google Maps作為一種面向大眾的地圖發布系統不失為一個好的解決方案,但對于WebGIS應用來說是遠遠不夠的,地圖在這里只是一個簡單的參照系統,用戶無法完成更多的空間數據處理與分析工作。
一個基本的WebGIS應該提供WMS服務(Web Map Service)和WFS服務。WMS允許用戶以指定方式繪制地圖并輸出為圖像,主要支持GetCapabilities,GetMap和GetFeatureInfo三種接口調用,由GetMap接口實現制圖功能。WFS提供關于實體的各項檢索服務,如相鄰查詢等。擴展的WFS-T服務額外支持數據編輯、更新操作。調用OGC服務可采用兩種方式:一種是把參數寫成URL形式,通過GET方式提交給服務端;或是將請求命令封裝成XML以POST方法提交。柵格地圖常采用GET方法獲取,如
http://wms.jpl.nasa.gov/wms.cgi?&VERSION=1.1.1&REQUEST=GetMap&STYLES=&LAYERS=global_mosaic&FORMAT=image/png&SRS=EPSG:4326&BBOX=73,18,135,53&width=800&height=456,
表示向JPL(Jet Propulsion Laboratory)請求制圖服務,采用WGS84坐標系統,范圍為北緯18-53度與東經73-135度之間,包含global_mosaic圖層的地圖輸出格式為png,大小為800*456。而復雜的WFS調用則將服務請求封裝成XML格式,采用POST方式提交,返回的GML結果用XPATH與XSLT技術分離出實體的地理坐標和屬性信息,最終在地圖上繪制實體,以列表的形式表示屬性。