?MapGuide由四個(gè)獨(dú)立的組件(Component)構(gòu)成,它們分別是:MapGuide Server MapGuide Web Extensions MapGuide Studio MapGuide Viewer

??? MapGuide Studio和MapGuide Viewer是MapGuide Server的客戶端,來(lái)自客戶端請(qǐng)求使用HTTP協(xié)議發(fā)送到Web Extentions,Web Extensions的WebAgent組件對(duì)這些請(qǐng)求進(jìn)行處理最后發(fā)送到MapGuide Server。當(dāng)MapGuide Server接收到一個(gè)請(qǐng)求,它會(huì)訪問存儲(chǔ)在資源庫(kù)中資源,以圖像或DWF格式創(chuàng)建和渲染地圖,最后將地圖返回到MapGuide Viewer。MapGuide View用于在屏幕上顯示地圖、管理圖層和要素的屬性數(shù)據(jù)。對(duì)于DWF Viewer,返回DWF格式的地圖;對(duì)于AJAX Viewer,返回圖像格式的地圖。MapGuide Studio包含了一個(gè)內(nèi)建的DWF Viewer。
1. MapGuide Server
??? MapGuide Server用來(lái)管理連接(Connection)、線程池(Thread Pools)、日志,提供各種類型的服務(wù)(Service),響應(yīng)客戶端的服務(wù)請(qǐng)求。
??? 運(yùn)行于Web應(yīng)用程序服務(wù)器上的程序通過MapGuide Service API訪問MapGuide Server提供的服務(wù)。MapGuide Service API使用了MapGuide服務(wù)TCP/IP協(xié)議與MapGuide進(jìn)行通訊。MapGuide服務(wù)TCP/IP協(xié)議是一個(gè)簡(jiǎn)單的二進(jìn)制傳輸協(xié)議,它會(huì)將連接和操作請(qǐng)求進(jìn)行編碼發(fā)送到MapGuide服務(wù)器,并且將MapGuide服務(wù)器的響應(yīng)結(jié)果進(jìn)行解碼返回給調(diào)用者。
??? MapGuide Service API對(duì)于MapGuide二次開發(fā)人員來(lái)說是透明的,如果你不打算研究MapGuide的源代碼,那么無(wú)需了解MapGuide Service API。

1.1?站點(diǎn)(Site)和服務(wù)器(Server)
??? 為了解決負(fù)載平衡的問題,MapGuide引入了站點(diǎn)(Site)的概念,站點(diǎn)是用來(lái)處理MapGuide的服務(wù)請(qǐng)求的一系列服務(wù)器的集合。用戶可以將MapGuide的服務(wù)部署到站點(diǎn)內(nèi)的多個(gè)服務(wù)器上,這些服務(wù)器共享一個(gè)獨(dú)立的資源庫(kù)(Resource Repository)。資源庫(kù)存儲(chǔ)著要素源(Feature Source)、地圖(Map)、圖層(Layer)等資源。
??? 在下圖中,站點(diǎn)有兩臺(tái)服務(wù)器組成,其中一臺(tái)用來(lái)作為站點(diǎn)服務(wù)器。站點(diǎn)服務(wù)器上部署著資源庫(kù),并且連接到站點(diǎn)內(nèi)的其他服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器。

???? MapGuide Server提供了七種服務(wù):站點(diǎn)服務(wù)(Site Service)、資源服務(wù)(Resource)、制圖服務(wù)(Drawing)、要素服務(wù)(Feature Service)、地圖服務(wù)(Drawing Service)、渲染服務(wù)(Rendering Service)和分塊服務(wù)(Tile Service)。如果你使用的是單機(jī)服務(wù)器,所有的服務(wù)都運(yùn)行在這一臺(tái)服務(wù)器上。站點(diǎn)服務(wù)和資源服務(wù)只能運(yùn)行在站點(diǎn)服務(wù)器上,因?yàn)檎军c(diǎn)服務(wù)器負(fù)責(zé)數(shù)據(jù)的訪問和管理站點(diǎn)內(nèi)的所有資源。如果你有兩臺(tái)或更多的服務(wù)器,你可以將除站點(diǎn)服務(wù)和資源服務(wù)外的任意服務(wù)部署到其他服務(wù)器上。例如,地圖服務(wù)和渲染服務(wù)是最耗時(shí)的操作,我們可以將這兩種服務(wù)部署到一臺(tái)獨(dú)立的服務(wù)器,從而提高系統(tǒng)的性能。
??? 在安裝Web Extensions時(shí),會(huì)同時(shí)安裝一個(gè)站點(diǎn)管理程序(Site Administrator Program),通過它你可以管理站點(diǎn)和服務(wù)器。這是一個(gè)Web界面的應(yīng)用程序,用戶可以通過瀏覽器來(lái)使用它。打開瀏覽器,在地址欄中輸入http://servername/mapguide/mapadmin/login.php,你就可以啟動(dòng)這個(gè)程序。其中,“servername”代表安裝Web Extensions的服務(wù)器的IP地址或名稱。
??? 登錄站點(diǎn)管理程序,你可以
管理站點(diǎn)。例如:增加、刪除服務(wù)器,將服務(wù)器置為離線(Offline)以進(jìn)行維護(hù)。 分派服務(wù)到不同的服務(wù)器。例如:一臺(tái)服務(wù)器可以處理地圖服務(wù),另一臺(tái)處理渲染服務(wù)。 監(jiān)測(cè)任何服務(wù)器的狀態(tài)。 定義用戶和組,管理他們的權(quán)限。

1.2?資源庫(kù)(Resource Repository)
??? 資源庫(kù)是一個(gè)基于Berkeley DB XML的XML數(shù)據(jù)庫(kù),用于管理層次結(jié)構(gòu)的資源。一個(gè)站點(diǎn)內(nèi)只能有一個(gè)資源庫(kù),并且必須駐留在站點(diǎn)服務(wù)器。
??? 在MapGuide中,資源是設(shè)計(jì)來(lái)共享和重用的。資源庫(kù)中包含兩種類型的節(jié)點(diǎn):資源文件夾節(jié)點(diǎn)和資源文檔節(jié)點(diǎn)。資源文件夾代表一個(gè)可以包含資源文檔和其它資源文件夾的容器,資源文檔用來(lái)存儲(chǔ)一個(gè)文檔。每種類型的資源節(jié)點(diǎn)都有一個(gè)唯一的ID、名稱、路徑和相關(guān)的訪問權(quán)限,我們可以通過資源的ID或路徑加文件名訪問任意一個(gè)資源節(jié)點(diǎn)。用戶對(duì)每個(gè)資源節(jié)點(diǎn)的訪問權(quán)限是由它的訪問權(quán)限決定的,子節(jié)點(diǎn)總是繼承父節(jié)點(diǎn)的訪問權(quán)限,子節(jié)點(diǎn)可以通過覆蓋父節(jié)點(diǎn)訪問權(quán)限改變對(duì)自己的訪問權(quán)限。
??? 一個(gè)資源可以引用另一個(gè)資源。例如:地圖、圖層、要素源(Feature Source)被存儲(chǔ)為三種不同的資源,地圖引用了地圖內(nèi)的所有圖層,圖層引用了要素源。當(dāng)原始的要素源更新后,圖層也會(huì)自動(dòng)更新。一般情況下,一個(gè)資源通過ID來(lái)引用另一個(gè)資源。這樣的話,即使資源被移動(dòng)或重命名,也無(wú)需進(jìn)行任何修改。
??? 一個(gè)資源也可以是獨(dú)立的,不引用任何其他資源。例如:打印布局(Print Layerout)。資源庫(kù)支持如下類型的資源:
Web布局(Web Layerout) 打印布局(Print Layerout) 地圖(Map) 圖層(Layer) 符號(hào)庫(kù)(Symbol Libary) 制圖源(Drawing Source) 要素源(Feature Source): 過程(Procedure) 文件夾(Folder)
??? 每個(gè)資源還可以擁有自己的資源數(shù)據(jù)(Resource Data),資源數(shù)據(jù)可以存儲(chǔ)為文件、流和字符串。

2.?MapGuide Web Extensions
??? MapGuide Web Extensions是一個(gè)可以通過Web Extensions API訪問的內(nèi)部組件,它暴露了MapGuide Server提供給客戶端的服務(wù)。Web Extensions也是一個(gè)應(yīng)用程序開發(fā)平臺(tái),開發(fā)人員可以調(diào)用Web Extensions API開發(fā)Web應(yīng)用程序。目前,Web Extensions API支持PHP、ASP和JSP三種語(yǔ)言。
??? WebAgent用來(lái)處理來(lái)自MapGuide Studio或MapGudie Viewer的請(qǐng)求,將其傳輸給MapGuide Server。WebAgent實(shí)現(xiàn)了MapGuide服務(wù)HTTP協(xié)議,用于將請(qǐng)求轉(zhuǎn)發(fā)給服務(wù)器。WebAgent處理傳入請(qǐng)求的參數(shù),建立與服務(wù)器的連接,調(diào)用相應(yīng)服務(wù)的API。在得到API的響應(yīng)后,將API返回的數(shù)據(jù)以流的方式返回給客戶端。
??? OpenGIS Agent實(shí)現(xiàn)了多個(gè)OpenGIS Web地圖協(xié)議,使用戶可以通過標(biāo)準(zhǔn)OpenGIS客戶端的訪問MapGuide提供的服務(wù)。作為Web服務(wù)的空間數(shù)據(jù)服務(wù)規(guī)范,只要某一個(gè)GIS軟件支持這些OpenGIS Web地圖協(xié)議,其他GIS軟件就可以通過這些地圖協(xié)議定義的接口得到所需要的數(shù)據(jù)。目前,OpenGIS Web Agent完成了如下協(xié)議:
Web地圖服務(wù)(Web Map Service):Web地圖服務(wù)提供了一個(gè)簡(jiǎn)單的HTTP接口,從地理空間數(shù)據(jù)庫(kù)中返回圖層級(jí)的地圖影像數(shù)據(jù)。這個(gè)規(guī)范定義了三個(gè)操作:GetCapabitities返回服務(wù)級(jí)元數(shù)據(jù),它是對(duì)服務(wù)信息內(nèi)容和要求參數(shù)的一種描述;GetMap返回一個(gè)地圖影像,其地理空間參考和大小參數(shù)是明確定義了的;GetFeatureInfo(可選)返回顯示在地圖上的某些特殊要素的信息。
Web要素服務(wù)(Web Feature Service):Web要素服務(wù)地圖服務(wù)提供了一個(gè)簡(jiǎn)單的HTTP接口,從地理空間數(shù)據(jù)庫(kù)中返回是要素的GML編碼,并提供對(duì)要素的增加、修改、刪除等事務(wù)操作。Web要素服務(wù)允許客戶端從多個(gè)Web要素服務(wù)中取得使用地理標(biāo)記語(yǔ)言(GML)編碼的地理空間數(shù)據(jù),定義了五個(gè)操作:GetCapabilites返回Web要素服務(wù)性能描述文檔(用XML描述);DescribeFeatureType返回描述可以提供服務(wù)的任何要素結(jié)構(gòu)的XML文檔;GetFeature為一個(gè)獲取要素實(shí)例的請(qǐng)求提供服務(wù);Transaction為事務(wù)請(qǐng)求提供服務(wù);LockFeature處理在一個(gè)事務(wù)期間對(duì)一個(gè)或多個(gè)要素類型實(shí)例上鎖的請(qǐng)求。
Web覆蓋服務(wù)(Web Coverage Service):Web覆蓋服務(wù)定義了一個(gè)簡(jiǎn)單的接口和一些操作,用于訪問地理空間“覆蓋”(Coverage)數(shù)據(jù)。Web覆蓋服務(wù)由三種操作組成:GetCapabilities,GetCoverage和DescribeCoverageType。GetCapabilities操作返回描述服務(wù)和數(shù)據(jù)集的XML文檔。GetCoverage操作是在GetCapabilities確定什么樣的查詢可以執(zhí)行、什么樣的數(shù)據(jù)能夠獲取之后執(zhí)行的,它使用通用的覆蓋格式返回地理位置的值或?qū)傩?。DescribeCoverageType操作允許客戶端請(qǐng)求由具體的WCS服務(wù)器提供的任一覆蓋層的完全描述。
注:覆蓋是將閉合區(qū)域區(qū)內(nèi)的位置關(guān)聯(lián)于一些屬性值的要素?!熬W(wǎng)絡(luò)覆蓋”(Grid Coverages)一般指衛(wèi)星影像、航拍影像、遙感圖像、數(shù)字高程數(shù)據(jù)等數(shù)據(jù),每個(gè)像素代表或關(guān)聯(lián)于一個(gè)屬性值。
??? 從技術(shù)實(shí)現(xiàn)的角度,可以將Web服務(wù)理解為一個(gè)應(yīng)用程序,它向外界暴露出一個(gè)能通過Web進(jìn)行調(diào)用的接口,允許被任何平臺(tái)、任何系統(tǒng),用任何語(yǔ)言編寫的程序調(diào)用。這個(gè)應(yīng)用程序可以用現(xiàn)有的各種編程語(yǔ)言實(shí)現(xiàn)。Web服務(wù)最大的特點(diǎn)是可以實(shí)現(xiàn)跨平臺(tái)、跨語(yǔ)言、跨硬件的互操作。

3. MapGuide Viewer
??? MapGuide Viewer提供了一種途徑讓用戶可以在Web瀏覽器中瀏覽地圖。目前,最新版本的MapGuide有三種風(fēng)格的View:
DWF Viewer:這種類型的Viewer只能工作在Windows平臺(tái)的IE瀏覽器,需要用戶下載和安裝一個(gè)ActiveX控件以支持顯示DWF格式的數(shù)據(jù)。
AJAX Viewer: 這是一個(gè)零客戶端Viewer,用戶無(wú)需下載或安裝任何軟件。它能夠工作在Windows平臺(tái)Microsoft Internet Explorer和MacOS或Linux的Firefox上。
基于Fusion的AJAX Viewer:這種Viewer極大地提高了AJAX Viewer從功能和界面方面進(jìn)行定制的能力。
3.1?DWF Viewer
??? MapGuide DWF Viewer是基于DWF和Autodesk DWF Viewer (ADV)的。DWF (Design Web Formt) 是Autodesk公司開發(fā)的、用戶共享工程設(shè)計(jì)數(shù)據(jù)的、一種開放、安全的文件格式。DWF文件是一個(gè)壓縮文件,一般非常小,所以非常易于傳輸和查看。Autodesk DWF Viewer是用于瀏覽DWF格式文件的一個(gè)工具,它只支持標(biāo)準(zhǔn)的包含二維EPlot文檔和三維EModel文檔的DWF文件。
??? 非常遺憾的是Autodesk Design Review 2010不再包含MapGuide DWF Viewer所使用的組件, Autodesk不再支持和維護(hù)DWF Viewer,所以MapGuide 2010及其后的版本不再支持DWF Viewer。對(duì)于那些仍然依賴于DWF Viewer的MapGuide應(yīng)用程序,可以通過安裝Autodesk Design Review 2009繼續(xù)使用它們。
??? MapGuide DWF Viewer的架構(gòu)如下圖所示:

??? Map文檔是MapGuide對(duì)現(xiàn)有DWF文件格式的一種擴(kuò)展,定義了地圖的名稱、坐標(biāo)系、范圍、地圖圖層列表、地圖圖層分組和一系列應(yīng)用程序擴(kuò)展。一個(gè)DWF文件可以包含多個(gè)EMap文檔。
??? EMap View是對(duì)現(xiàn)有Autodesk DWF Viewer的擴(kuò)展,用來(lái)支持顯示EMap文檔。EMap View可以枚舉DWF文件中的所有EMap文檔、顯示當(dāng)前的EMap文檔、枚舉EMap文檔中的所有圖層、改變每個(gè)圖層的可見性(Visibility)。同樣,EMap Viewer可以利用Autodesk DWF Viewer已有的功能縮放、選擇地圖上的要素。EMap Viewer使用了如下三種用戶界面組件:
地圖導(dǎo)航控件(Map Navigation Control):用于選擇DWF文件中當(dāng)前顯示的EMap,與地圖圖例(Map Legend)交互、執(zhí)行預(yù)定的查詢等。
地圖控件(Map Control):用于瀏覽地圖,按照當(dāng)前比例尺顯示或隱藏圖層,計(jì)算標(biāo)注的位置等。
屬性瀏覽控件(Property Browsers Control):用戶顯示關(guān)聯(lián)到地圖、圖層、要素的屬性信息。這個(gè)控件是標(biāo)準(zhǔn)Autodesk DWF Viewer的一部分。
??? MapGuide Viewer API適配器(Adapter)暴露了MapGuide 6.x API,提供了一種將以前版本的MapGuide應(yīng)用程序升級(jí)到新版本的解決方案。
3.2?AJAX Viewer
??? DWF Viewer有不錯(cuò)的性能,因?yàn)镈WF是一種向量格式的文件,在平移和縮放地圖的時(shí)候無(wú)需向服務(wù)器重新發(fā)送請(qǐng)求。但是,DWF Viewer只能工作在Windows平臺(tái),這非常大地限制了MapGuide的應(yīng)用。在MapGuide 6.5之后,MapGuide引入了AJAX Viewer來(lái)解決這個(gè)問題,使MapGuide可以工作在Linux平臺(tái)。
??? 使用AJAX Viewer時(shí),地圖總是被渲染為圖像傳送到AJAX Viewer。每次平移或縮放地圖,AJAX Viewer會(huì)向服務(wù)器發(fā)送請(qǐng)求,要求重新渲染地圖,所以性能要比DWF Viewer差一點(diǎn)。
3.3?基于Fusion的Viewer
??? Fusion框架是一個(gè)靈活的、可擴(kuò)展的模版系統(tǒng),它可以將應(yīng)用程序的界面和功能模塊分割開來(lái)。在最簡(jiǎn)單的情況下,一個(gè)Fusion應(yīng)用程序模版(Fusion Application Template)由一個(gè)HTML頁(yè)面組成。通過將Javescript腳本庫(kù)fusion.js加載HTML頁(yè)面中,在onload事件中初始化Fusion對(duì)象,就可以創(chuàng)建一個(gè)Fusion應(yīng)用程序。Fusion使用了一個(gè)專有的XML文檔來(lái)決定在頁(yè)面中創(chuàng)建哪些功能模塊,MapGuide中這個(gè)XML文件作為一個(gè)ApplicationDefinition資源存儲(chǔ)在MapGuide資源庫(kù)中。
??? 我們將Fusion應(yīng)用程序的每個(gè)功能片稱之為Widgets,一個(gè)Widget包含一種獨(dú)立的功能。通常情況下,Widget是自包容的,不依賴于任何其他的Widget。但實(shí)際中,如果沒有其他的Widget,有一些Widget是毫無(wú)意義的。一個(gè)Widget通常包含了一些用戶界面,例如按鈕或圖例(Legend)。Widget的顯示位置是由應(yīng)用程序模版中的HTML id屬性來(lái)控制的,但并不受限于Fusion框架。Widget是設(shè)計(jì)的用于顯示在HTML頁(yè)面中的,它會(huì)根據(jù)容器的大小自動(dòng)縮放。同時(shí),Widget也設(shè)計(jì)為可配置的(Configurable),通過修改ApplicationDefinition可以訂制Widget的功能。通過覆蓋某些CSS類,也可以改變Widget的外觀。
??? Fusion框架使用了Jx庫(kù)來(lái)簡(jiǎn)化支持不同瀏覽器的問題。Jx是一個(gè)獨(dú)立的Javascript庫(kù),最開始是開發(fā)用來(lái)支持WebStudio的。當(dāng)定制一個(gè)應(yīng)用程序的外觀時(shí),開發(fā)人員通常是定制Jx模塊,而不是Widget自身。例如:將所有按鈕Widget外觀效仿Window XP樣式,開發(fā)人員實(shí)際上會(huì)提供一個(gè)CSS文件覆蓋Jx默認(rèn)的CSS文件。通常來(lái)說,F(xiàn)usion Widget不包含自己的CSS或可視樣式(Visual Style)。
??? 盡管Fusion由Javascript編寫而成,但是它有一種機(jī)制可以異步地調(diào)用服務(wù)器腳本。這樣可以大大提升MapGuide Web Extensions API的能力,從而提供更多高級(jí)的功能。Fusion的架構(gòu)是設(shè)計(jì)的可以支持任何服務(wù)器端腳本語(yǔ)言,但是現(xiàn)在只實(shí)現(xiàn)了對(duì)PHP的支持。
??? Fusion的引入是為了解決MapGuide原有的AJAX Viewer在功能和界面方面難于定制的問題。MapGuide創(chuàng)建了一系列widget來(lái)復(fù)制原有AJAX Viewer的功能,并且開發(fā)了幾個(gè)基本的應(yīng)用程序模版作為開發(fā)新的應(yīng)用程序的基礎(chǔ)。
4.?MapGuide Studio
??? MapGuide Studio是一個(gè)用來(lái)制作收集、準(zhǔn)備地理空間數(shù)據(jù)和制作地圖的工具。它只能運(yùn)行在Windows平臺(tái),MapGuide開源版提供了一個(gè)免費(fèi)的預(yù)覽版Studio,這個(gè)版本沒有經(jīng)過嚴(yán)格的測(cè)試。MapGuide企業(yè)版提供了一個(gè)經(jīng)過嚴(yán)格測(cè)試的完全版Studio,不過它是需要付費(fèi)的。當(dāng)你使用MapGuide Studio的時(shí)候,一般會(huì)遵循如下的幾個(gè)步驟:
為地理空間數(shù)據(jù)在資源庫(kù)中創(chuàng)建相應(yīng)的資源。你既可以直接加載文件類型的數(shù)據(jù),也可以連接到一個(gè)外部的數(shù)據(jù)庫(kù)。
創(chuàng)建圖層(Layer)。
編輯地圖(Map),將所需的圖層加入地圖。
將地圖嵌入一個(gè)Web Layout中。
??? 在有了一個(gè)Web Layout后,你就可以通過添加自己的代碼定制Web應(yīng)用程序的界面和功能。最后一步就是將完成的Web應(yīng)用程序發(fā)布到Internet或Intranet供用戶瀏覽和交互。
??? MapGuide Studio接口分為了三個(gè)部分:
??? 當(dāng)打開MapGuid Studio連接到站點(diǎn)服務(wù)器,站點(diǎn)管理器會(huì)顯示存儲(chǔ)在資源庫(kù)中的所有資源。雙擊站點(diǎn)管理器中的任何一個(gè)資源,對(duì)應(yīng)的編輯器會(huì)打開,用戶可以修改資源的信息。如果資源是圖層或地圖,Viewer會(huì)打開并顯示數(shù)據(jù)的預(yù)覽。

?
“即使資源被移動(dòng)或重命名,也無(wú)需進(jìn)行任何修改” 資源之間的dependency沒有強(qiáng)制關(guān)聯(lián),比如LayerDefinition 引用了 FeatureSource,但是如果移動(dòng)或者重命名這個(gè)FeatureSource,在LayerDefinition中引用的地址不會(huì)自動(dòng)更新的,從而引用關(guān)系丟失。在2011中有計(jì)劃加入一個(gè)參數(shù),使得移動(dòng)或者重命名時(shí)能夠保持關(guān)系。不過從本質(zhì)上來(lái)講,MapGuide的資源沒有像RDBMS那樣具有“外鍵”約束。一點(diǎn)小問題: MapGuide Server提供了七種服務(wù):站點(diǎn)服務(wù)(Site Service)、資源服務(wù)(Resource)、制圖服務(wù)(Drawing)、要素服務(wù)(Feature Service)、地圖服務(wù)(Drawing Service)、渲染服務(wù)(Rendering Service)和分塊服務(wù)(Tile Service)。 Drawing Service ----繪圖服務(wù)/制圖服務(wù) Mapping Service ----地圖服務(wù)