[轉(zhuǎn)載說(shuō)明:本文謝絕非通告轉(zhuǎn)載,特此說(shuō)明。需要轉(zhuǎn)載請(qǐng)聯(lián)系筆者。]
什么是WebGIS?
WebGIS是Internet技術(shù)應(yīng)用于GIS開(kāi)發(fā)的產(chǎn)物。WebGIS,即互聯(lián)網(wǎng)地理信息系統(tǒng),以互聯(lián)網(wǎng)為環(huán)境,以Web頁(yè)面作為GIS軟件的用戶界面,把Internet和GIS技術(shù)結(jié)合在一起,為各種地理信息應(yīng)用提供GIS功能。GIS通過(guò)Web功能得以擴(kuò)展,通過(guò)Web發(fā)布地圖、瀏覽空間數(shù)據(jù),制作專(zhuān)題圖,例如大家熟悉的Go2Map、Google Map、MapBar等等。
[使用的技術(shù):GIS基本開(kāi)發(fā)、.net Remoting、ASP.net開(kāi)發(fā)和控件開(kāi)發(fā)、設(shè)計(jì)模式]
[代碼下載:/Files/maweifeng/WebGIS.rar]
WebGIS的基本原理
WebGIS的原理并不復(fù)雜,主要流程如下(下圖):
(1)首先,設(shè)計(jì)一個(gè)可以交互的Web頁(yè)(可以應(yīng)用ASP、PHP、ASP.net、JSP等,商用WebGIS大多選擇除了PHP的其他語(yǔ)言,而開(kāi)源WebGIS大都選擇了PHP),通過(guò)此Web頁(yè),向Web服務(wù)器提交有關(guān)GIS服務(wù)的請(qǐng)求;
(2)此請(qǐng)求會(huì)包含對(duì)地圖數(shù)據(jù)的請(qǐng)求,包括查詢等,請(qǐng)求會(huì)通過(guò)Web服務(wù)器提交給GIS應(yīng)用服務(wù)器;
(3)GIS應(yīng)用服務(wù)器可以使用幾種技術(shù),CGI、COM、Java Serverlet或者.net技術(shù)、Web Service技術(shù),通過(guò)這些組件包裝已有的GIS軟件,獲取客戶端的請(qǐng)求,將用戶需求轉(zhuǎn)化為具體的操作,返回需求的數(shù)據(jù)(一般是一個(gè)地圖圖片或者查詢的數(shù)據(jù)集),這個(gè)過(guò)程稱為地圖的Render,實(shí)際上也是最為耗時(shí)的操作;
(4)Web服務(wù)器獲取了GIS應(yīng)用服務(wù)器返回的圖片,然后作為一個(gè)Web頁(yè)返回給客戶。
這樣,可以看出,WebGIS的關(guān)鍵是設(shè)計(jì)GIS應(yīng)用服務(wù)器,該服務(wù)器的性能和效率很大程度上決定了WebGIS的性能。
WebGIS的設(shè)計(jì)
接著我們來(lái)設(shè)計(jì)一個(gè)自己的WebGIS系統(tǒng)。我們的需求非常簡(jiǎn)單,可以將一個(gè)地圖以固定的分辨率顯示在Web瀏覽器,可以放大、縮小和移動(dòng)。這個(gè)功能雖然簡(jiǎn)單但五臟俱全,大概可以一窺WebGIS的基本原理。
我們選擇使用.net技術(shù),首先需要對(duì)系統(tǒng)進(jìn)行劃分,Web開(kāi)發(fā)使用ASP.net的Web Control來(lái)封裝一個(gè)簡(jiǎn)單的控件,ASP.net的Web頁(yè)通過(guò)此控件來(lái)顯示地圖,控件包括幾個(gè)主要操作的接口。此Control每次Render的時(shí)候都需要調(diào)用GIS服務(wù)器獲取需要的數(shù)據(jù),然后將此圖片Render為Web頁(yè)的一部分。
GIS服務(wù)器負(fù)責(zé)打開(kāi)GIS空間數(shù)據(jù),接受請(qǐng)求,生成圖片,然后返回之。我們知道,空間數(shù)據(jù)的打開(kāi)、關(guān)閉是非常耗時(shí)的操作,因此,GIS服務(wù)器應(yīng)該保證“一直開(kāi)著”,而不是一個(gè)簡(jiǎn)單的組件,每次請(qǐng)求時(shí)都打開(kāi)、關(guān)閉GIS數(shù)據(jù)。要獲得這樣的功能可以通過(guò)幾種方式:(1)使用一般控件或Web Service,在Global.asax中的 Application_Start 中啟動(dòng)打開(kāi)數(shù)據(jù);(2)使用Windows服務(wù)(CSDN的一篇翻譯文章對(duì)使用Windows服務(wù)有詳細(xì)說(shuō)明:http://editblog.csdn.net/msdncolumn/archive/2005/05/26/3710.aspx);(3)使用Remoting技術(shù),采用Singleton方式的服務(wù)器端,可以保證所有請(qǐng)求使用的都是同一對(duì)象,而且對(duì)象在生存期內(nèi)不會(huì)頻繁打開(kāi)和關(guān)閉。實(shí)際系統(tǒng)大概是同時(shí)使用了幾種技術(shù),例如使用Windows服務(wù)在開(kāi)機(jī)時(shí)啟動(dòng),然后創(chuàng)建Remoting服務(wù)器端。
一般來(lái)說(shuō),GIS服務(wù)器都使用了創(chuàng)建Map Service(地圖服務(wù))的方式,就是說(shuō),可以在GIS服務(wù)器創(chuàng)建多個(gè)Service,提供Map服務(wù)。這樣,前端的Web頁(yè)調(diào)用Map Service服務(wù),服務(wù)控制空間數(shù)據(jù),在Web程序調(diào)用之前,GIS服務(wù)器已經(jīng)打開(kāi)了空間數(shù)據(jù),等待提供服務(wù)。這樣,我們一方面對(duì)程序進(jìn)行了分層,另一方面通過(guò)分層,意外的獲得了可以通過(guò)在GIS服務(wù)器端控制Map Service的方式更新、修改地圖數(shù)據(jù),而不影響Web服務(wù)的好處。
以下即為一個(gè)基于.net設(shè)計(jì)的WebGIS的架構(gòu)示意,不同顏色表示可以部署于不同的機(jī)器。其中GIS應(yīng)用服務(wù)器上運(yùn)行Map Service,為前端的Web程序提供地圖數(shù)據(jù)。
GIS服務(wù)器(基于.net Remoting)
在運(yùn)行于不同進(jìn)程中的對(duì)象之間建立通信(無(wú)論是在同一臺(tái)計(jì)算機(jī)上,還是在相距數(shù)千公里的計(jì)算機(jī)上)是常見(jiàn)的開(kāi)發(fā)目標(biāo)。通過(guò) .NET 遠(yuǎn)程處理,客戶端應(yīng)用程序可以使用同一臺(tái)計(jì)算機(jī)(或其網(wǎng)絡(luò)中其他任何可用的計(jì)算機(jī))上的其他進(jìn)程中的對(duì)象。可以從 Web 應(yīng)用程序、控制臺(tái)應(yīng)用程序、Windows 服務(wù)進(jìn)行通信。因此我們將基于.net Remoting技術(shù)實(shí)現(xiàn)GIS服務(wù)器。
MapRender接口
我們首先設(shè)計(jì)如下的一個(gè)MapRender接口,在服務(wù)器端實(shí)現(xiàn)之,客戶端則通過(guò)Remoting遠(yuǎn)程調(diào)用,使用Server端的服務(wù)。
實(shí)際的程序可以從配置文件里讀入需要的數(shù)據(jù),然后初始化MapEngine,這里直接初始化為SimpleMapEngine。
MapEngine(具體的地圖引擎)
[本來(lái)準(zhǔn)備使用SuperMap Object實(shí)現(xiàn)一個(gè)Map引擎,但有些COM互操作的問(wèn)題解決不了,暫時(shí)作罷,這樣也有一個(gè)好處,即任何人都可以測(cè)試此程序]
啟動(dòng)Map Service服務(wù)
我們?cè)贛ain函數(shù)內(nèi)啟動(dòng)MapService服務(wù):
實(shí)際的實(shí)現(xiàn),可以使用類(lèi)似代碼和配置文件,啟動(dòng)多個(gè)Map Service服務(wù),供不同的地圖程序調(diào)用。
測(cè)試Map Service服務(wù)
我們可以創(chuàng)建一個(gè)WinForm程序來(lái)測(cè)試此Map Service服務(wù),首先,添加MapRender接口IMapRender的引用,對(duì)在Form Load事件里初始化遠(yuǎn)程對(duì)象MapService:
這樣,我們就可以使用 _map 對(duì)象獲取Map Service服務(wù),返回需要的數(shù)據(jù)。
運(yùn)行結(jié)果如下:
現(xiàn)在,我們已經(jīng)可以在ASP.net開(kāi)發(fā)中直接使用上面實(shí)現(xiàn)的Map Service,我們可以通過(guò)控制GetMap的參數(shù),來(lái)實(shí)現(xiàn)移動(dòng)、大小縮放等基本功能。
為了文章的完整性,我們來(lái)封裝一個(gè)簡(jiǎn)單的Map Control控件。
_map = CType(Activator.GetObject(GetType(IMapRender.MarsWebGIS.IMapRender), "tcp://localhost:8085/MapService"), IMapRender.MarsWebGIS.IMapRender)
然后在Render事件內(nèi)調(diào)用GetMap。我們可以在此控件內(nèi)通過(guò)GetMap參數(shù)封裝移動(dòng)、大小縮放等基本功能。
下面我們測(cè)試一下此控件。新建一個(gè)ASP.net頁(yè),增加以下引用:
<%@ Register Assembly="MapControlLibrary" Namespace="MapControlLibrary" TagPrefix="MapControlLibrary" %>
然后就可以使用控件:
<MapControlLibrary:MapControl id="Map1" runat="server">
</MapControlLibrary:MapControl>
運(yùn)行結(jié)果如下:
該框架可以算作WebGIS的一個(gè)簡(jiǎn)單的縱剖面,由此我們可以明白WebGIS系統(tǒng)的架構(gòu),需要的技術(shù),設(shè)計(jì)和設(shè)計(jì)模式的應(yīng)用。
由于筆者對(duì)于Remoting和ASP.net控件技術(shù)不太熟悉,文中難免有所疏漏,存在不少錯(cuò)誤和問(wèn)題,還歡迎大家一起討論。最后希望所有做GIS的同行可以更多關(guān)注架構(gòu)和模式,提高我們的設(shè)計(jì)能力。
聯(lián)系客服