內(nèi)蒙古java團(tuán)隊(duì)

          j2se,j2ee開(kāi)發(fā)組
          posts - 139, comments - 212, trackbacks - 0, articles - 65
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          提到小工具,就不得不提到 OpenLayers OpenLayers (主頁(yè)是 http://www.openlayers.org )是由 MetaCarta 最初發(fā)起的,用于在網(wǎng)頁(yè)界面上展示地圖的一套 Javascript 腳本框架。

          MapGuide Fusion 框架最為核心的地圖 Widget ,就是采用了 OpenLayers 框架。 Fusion 框架對(duì) OpenLayers 進(jìn)行包裝,為其添加了更多的功能,從而使之能夠更符合 Fusion 框架并與其余 Fusion 組件進(jìn)行交互。

          非常有趣的是,由于 OpenLayers 所采用的術(shù)語(yǔ)跟 Fusion 采用的并不是十分一致,甚至 Fusion 不同部分采用的術(shù)語(yǔ)也不是十分一致,所以同一個(gè)名字在不同地方表達(dá)的意思卻很可能并不相同。所以,在詳細(xì)介紹 Fusion 如何對(duì) OpenLayers 進(jìn)行包裝之前,有必要對(duì)兩者之間的術(shù)語(yǔ)進(jìn)行一下區(qū)分,以免當(dāng)您閱讀到相關(guān)材料時(shí)感到疑惑。

          OpenLayers 認(rèn)為,用戶(hù)看到的由多個(gè)圖層 (layer) 組成的一張地圖 (map) 。地圖本身與加載的數(shù)據(jù)源格式無(wú)關(guān),與數(shù)據(jù)源格式相關(guān)的是圖層。因此,地圖類(lèi)只有一個(gè)( OpenLayers.Map ),而圖層類(lèi)卻有很多,這些類(lèi)都以 OpenLayers.Layer 作為命名空間,如 OpenLayers.Layer.Google/Yahoo/MapGuide/WMS/Vector 等等。

          這樣的結(jié)構(gòu)有一個(gè)問(wèn)題,那就是所有的圖層之間是平行的關(guān)系,這是很不利于圖層管理的。我們假設(shè)有這樣一張地圖:該地圖包含有十二個(gè)圖層,有九個(gè)來(lái)自于不同數(shù)據(jù)源的圖層和三個(gè)位于頂層的 Vector 層。那么,我如果想用代碼去處理所有 Vector 的層,就必須遍歷所有的層,依次比較是不是 Vector 層,再對(duì) Vector 層進(jìn)行處理。解決這個(gè)問(wèn)題的方案很簡(jiǎn)單,那就是引入層級(jí)結(jié)構(gòu),允許用戶(hù)把圖層分組。比如上面的例子中,把三個(gè) Vector 分成一組,比如命名為“標(biāo)記”組,屆時(shí)只需要對(duì)標(biāo)記組中的每一個(gè)層進(jìn)行處理即可。

          這也正是 Fusion 對(duì)于 OpenLayers 眾多改進(jìn)中的一個(gè)。而問(wèn)題也正是這里引入的:地圖 Widget 在給這種層級(jí)結(jié)構(gòu)命名的時(shí)候,出人意料地采用了另外的命名方式:地圖 Widget 把圖層組命名為“地圖組” (map group) ,把組里面的圖層命名為 (map) 。下面代碼是示例數(shù)據(jù)中 Library://Samples/Sheboygan/FlexibleLayouts/Slate.ApplicationDefinition 布局文件對(duì)于地圖定義的那一部分,用戶(hù)可以在 MapGuide Studio 中通過(guò)點(diǎn)擊位于 Map 面板上的 “Edit Map Group” 按鈕來(lái)查看這部分內(nèi)容。

          <?xml version="1.0" encoding="utf-8"?>

          <MapSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

          ? <MapGroupType id="Sheboygan">

          ??? <Map>

          ????? <Type>MapGuide</Type>

          ????? <SingleTile>true</SingleTile>

          ????? <Extension>

          ??????? <ResourceId>Library://Samples/Sheboygan/Maps/Sheboygan.MapDefinition</ResourceId>

          ??????? <SelectionAsOverlay>true</SelectionAsOverlay>

          ??????? <SelectionColor>0x0000FFA0</SelectionColor>

          ????? </Extension>

          ??? </Map>

          ??? <Extension />

          ? </MapGroupType>

          </MapSet>

          布局文件中地圖定義的部分代碼

          其實(shí), MapGuide 這樣做是有原因的。這個(gè)問(wèn)題源于不同產(chǎn)品之間定位的不同: OpenLayers 框架的目的是在同一張地圖上面顯示多個(gè)數(shù)據(jù)源。所以在 OpenLayers 看來(lái),一個(gè)來(lái)自 MapGuide 的地圖僅僅是一個(gè)層而已。然而,在 MapGuide 內(nèi)部,一張 MapGuide 地圖內(nèi)是包含多個(gè) Layer ,具體表現(xiàn)就是一個(gè) MapDefinition 里可以包含多個(gè) LayerDefinition 。所以,如果 Fusion MapGuide 叫做一個(gè) Layer 的話(huà),又該如何稱(chēng)呼里面的 Layer 呢?

          鑒于這樣的考慮, Fusion 才做了這種概念上的映射: Fusion 中的地圖 Widget 對(duì)應(yīng) OpenLayers 里面的地圖; Fusion 里面的地圖組是一個(gè)邏輯概念,從而形成一種邏輯上的層級(jí)結(jié)構(gòu)以便管理; Fusion 中的地圖實(shí)際對(duì)應(yīng)于 OpenLayers 里面的圖層。

          但事情到這里還沒(méi)有結(jié)束,接下來(lái)的事情可能會(huì)讓您有些意外:在編寫(xiě)地圖 Widget 實(shí)現(xiàn)代碼時(shí),為了能夠便于與 OpenLayers 中的類(lèi)對(duì)應(yīng)起來(lái), Fusion 將地圖(也就是 OpenLayers 中的圖層)稱(chēng)為 Layers (注意,不是 Layer ),并要求每一個(gè)地圖的代碼都繼承自 Fusion.Layers 。比如, MapGuide Layers 的名稱(chēng)就叫做 Fusion.Layers.MapGuide

          下表總結(jié)了 Fusion OpenLayers 之間這種概念映射關(guān)系

          Fusion 概念

          Fusion 代碼命名

          OpenLayers 概念

          OpenLayers 代碼命名

          地圖

          Fusion.Layers

          圖層

          OpenLayers.Layer

          地圖組

          無(wú)對(duì)應(yīng)概念

          地圖 Widget

          Fusion.Widget.Map

          地圖

          OpenLayers.Map

          ?Fusion OpenLayers 之間的概念映射關(guān)系

          在閱讀 Fusion OpenLayers 的源代碼或?qū)W習(xí)他們的 API 時(shí),一定要注意兩者術(shù)語(yǔ)上的區(qū)別。

          本節(jié)中,我們提到了 Fusion 引入了地圖組這一個(gè)概念。這只是 Fusion 對(duì)于 OpenLayers 眾多改動(dòng)中的一個(gè)。下面我們來(lái)看看到底 Fusion 對(duì) OpenLayers 還做了哪些改動(dòng)。
          Fusion 對(duì)于 OpenLayers 的改進(jìn)
          為了便于 Fusion 的其他組件能夠與地圖進(jìn)行交互, Fusion 對(duì)于 OpenLayers 進(jìn)行了較為全面的包裝。一般來(lái)說(shuō),如果您不是開(kāi)發(fā) Fusion.Layers 的開(kāi)發(fā)人員,除了使用一些 OpenLayers 的一些工具性的函數(shù)之外,您甚至都不需要知道 OpenLayers 的存在。但是,僅僅進(jìn)行包裝是不夠的,由于 OpenLayers 與 Fusion 定位的不同, Fusion 必須對(duì) OpenLayers 進(jìn)行擴(kuò)展才能適應(yīng)更為復(fù)雜的模型。

          1.?????? Fusion 中添加了選擇集的概念。 OpenLayers 在同一張地圖里面顯示多種不同數(shù)據(jù)源的方面確實(shí)做的很好,遺憾的是,它缺少選擇集這一至關(guān)重要的概念。對(duì)于 OpenLayers 來(lái)說(shuō),選擇集完全是可有可無(wú)的,因?yàn)樗哪康脑谟趯⒌貓D展示出來(lái),而且,很多地圖根本就沒(méi)有選擇集這樣的 API ,比如 Google 地圖等等。但對(duì)于 Fusion 則不同,我們很難想象沒(méi)有選擇集,用戶(hù)該如何利用 MapGuide 進(jìn)行管理。所以, Fusion 加入了選擇集這個(gè)概念,并且要求實(shí)現(xiàn) Layers 的地圖(比如 MapGuide )實(shí)現(xiàn)選擇集功能。我們可以看到, Fusion.Widget.Map 中不但有諸如 get/set/clear/hasSelection 這樣控制和讀取選擇集的函數(shù),而且有 MAP_SELECTION_ON 和 MAP_SELECTION_OFF 這兩個(gè)事件來(lái)通知監(jiān)聽(tīng)者地圖選擇集的當(dāng)前狀況。

          2.?????? Fusion 開(kāi)放了更多的事件。借助于 Fusion 自己獨(dú)立實(shí)現(xiàn)的事件機(jī)制, Fusion 允許用戶(hù)接收到更多種類(lèi)的事件,比如 Session 是否已創(chuàng)建、地圖當(dāng)前忙碌與否、選擇集狀態(tài)變更、當(dāng)前圖層(這個(gè)是 Fusion 中的圖層,不是 OpenLayers 的)變化等等。

          3.?????? Fusion 允許地圖的實(shí)現(xiàn)類(lèi)返回自身支持哪些比例尺,這就使得用戶(hù)可以直觀的知道自己當(dāng)前縮放地圖到什么程度。

          4.?????? 允許用戶(hù)隨時(shí)設(shè)置當(dāng)前地圖的背景圖片和地圖上的光標(biāo)形狀。這對(duì)于直觀地反應(yīng)地圖當(dāng)前狀態(tài)是是否有用的。

          5.?????? 支持右鍵菜單。雖然在瀏覽器上實(shí)現(xiàn)右鍵菜單相對(duì)簡(jiǎn)單一些,但是通過(guò)使用地圖 Widget 的 setContextMenu ,代碼編寫(xiě)者就可以直接把已經(jīng)準(zhǔn)備好的 div 作為右鍵菜單,再也不需要直接與底層鼠標(biāo)事件打交道了。

          地圖的定義
          前面在介紹 Fusion 與 OpenLayers 術(shù)語(yǔ)不同的時(shí)候,摘錄了應(yīng)用程序定義中對(duì)于地圖部分的定義。通過(guò)解析這個(gè)定義, Fusion 了解了應(yīng)該如何加載該地圖。下面,我們就來(lái)看看這個(gè)定義中到底都定義了哪些東西。

          在 Fusion 中,一個(gè)地圖組用一個(gè) MapGroup 進(jìn)行標(biāo)簽定義, MapGroup 里面的 Map 標(biāo)簽就是對(duì)于一個(gè)地圖的定義了。

          1.?????? Type: 該標(biāo)簽標(biāo)示了地圖的類(lèi)型。所有 MapGuide 地圖該標(biāo)簽的值均為 MapGuide 。當(dāng) Fusion 讀取到該地圖的 Type 時(shí),就會(huì)用對(duì)應(yīng)的 “Fusion.Layers. 標(biāo)簽值 ” 來(lái)初始化該地圖。比如 MapGuide 地圖就會(huì)用 Fusion.Layer.MapGuide 來(lái)初始化。

          2.?????? SingleTile: 如果該項(xiàng)為真,則表示該項(xiàng)不采用分塊服務(wù)。

          3.?????? Extension: 該于擴(kuò)展 Map 標(biāo)簽,來(lái)為地圖初始化提供更多的信息。各個(gè) Fusion.Layers 的實(shí)現(xiàn)類(lèi)可以自行決定其需要的內(nèi)容,以及如何解釋這些內(nèi)容。對(duì)于 MapGuide 而言,有以下常見(jiàn)的擴(kuò)展:

          a)???????? ResourceId: MapDefinition 的資源 Id ,通過(guò)該 Id , Fusion 可以知道加載哪一個(gè)地圖定義。

          b)??????? SelectionAsOverLay: 如果該項(xiàng)是 true ,那么將會(huì)使用 GETDYNAMICOVERLAY 來(lái)獲取地圖,否則采用 GETMAPIMAGE 來(lái)獲取地圖。前者是新版本才支持的,可以把選擇集和地圖本身繪制成兩張地圖。如果您使用的 MapGuide 版本比較舊,您可以把該項(xiàng)設(shè)置成為 false

          c)???????? SelectionColor: 該項(xiàng)表示用什么顏色來(lái)顯示選中的要素。

          主站蜘蛛池模板: 怀集县| 洪洞县| 上虞市| 襄汾县| 大同县| 武宁县| 应用必备| 信阳市| 诸暨市| 太谷县| 大新县| 濉溪县| 泸西县| 兴宁市| 张家港市| 永吉县| 京山县| 隆林| 凤冈县| 西城区| 建瓯市| 攀枝花市| 五大连池市| 黄冈市| 永福县| 称多县| 庆元县| 罗田县| 孟州市| 郧西县| 茶陵县| 乐昌市| 西昌市| 六盘水市| 永胜县| 金沙县| 咸宁市| 嵊州市| 陵水| 汝州市| 岱山县|