通過配置實(shí)現(xiàn)多種需求下的地圖展示
1.背景
對(duì)于一般性的地圖顯示需求,我們只需要知道地圖的一個(gè)固定URL,然后知道要顯示的范圍和要顯示的級(jí)別以及每個(gè)級(jí)別的scale等即可。
但是如果我們遇到下面幾種情況時(shí),又該如何。
(1)需要顯示的圖層的不同級(jí)別來自于不同的服務(wù)器(URL不同):如前幾個(gè)級(jí)別由一個(gè)固定URL提供,后幾個(gè)級(jí)別由另外一個(gè)URL提供。
(2)需要同時(shí)疊加幾張圖層:如需要疊加地形圖和注記圖,且圖層的顯示有層級(jí)之分。
(3)需要同時(shí)疊加幾張圖層,并且每個(gè)圖層初始顯示級(jí)別不一樣。
(4)需要同時(shí)疊加幾張圖層,圖層的URL的請(qǐng)求方式均有不同:如其中一個(gè)圖層由AGS提供,一個(gè)圖層是天地圖服務(wù)提供,還有一個(gè)圖層是當(dāng)?shù)爻枪芫痔峁詈筮€有一個(gè)圖層是由本地未發(fā)布的緩存瓦片提供。
諸如類似于以上的地圖顯示需求還有很多,如果我們單純的對(duì)每一種情況進(jìn)行一個(gè)代碼上的分支當(dāng)然也是能解決的。但是這并不是最好的一種解決方法,每次新的需求提出時(shí),都需要對(duì)代碼修改,這不符合設(shè)計(jì)模式中的開放封閉原則。雖然我們可以用簡(jiǎn)單工廠等模式來努力改善這種情況,不過如果有更好的方式,不需要修改任何代碼,不需要用設(shè)計(jì)模式,就能解決以上的問題是否更好?
下面我將給出一種通過數(shù)據(jù)庫配置來實(shí)現(xiàn)上面所有問題的解決方案。此方案在多個(gè)項(xiàng)目中已經(jīng)開始使用。
2.配置(表)的設(shè)計(jì)
2.1原理
首先我們必須對(duì)以上多種地圖顯示的需求進(jìn)行一個(gè)分析,提出他們的共同點(diǎn)。
(1)對(duì)圖層開始顯示的級(jí)別有需求(startLevel)。
(2)多張圖層疊加,并且圖層疊加有從上自下的順序(layerDisplayOrder)。
(3)圖層可能的URL不同(ServiceURL)
(4)每個(gè)圖層的URL格式可以不一樣,比如URL可能天地圖的WMTS格式,可能是AGS發(fā)布的請(qǐng)求方式(level\row\col),也有可能是Geoserver發(fā)布的WMS格式。并且有的服務(wù)提供商還需要token字段來判斷是否有權(quán)限得到服務(wù),或者不同的服務(wù)商提供的WMTS格式中對(duì)col和row以及l(fā)evel的表述字段名稱不一樣(通過這個(gè)分析,可以提煉出Xfield、Yfield、LevelFieldName、Token字段來對(duì)不同的需求進(jìn)行配置)。
(5)所有的圖層,如果要疊加,需要用同一個(gè)空間參考,同一個(gè)瓦片大小,同一個(gè)地圖起始原點(diǎn),以及同一套地圖比例尺。
(6)變化的只是URL,其核心瓦片行列號(hào)和地圖級(jí)別是每種瓦片請(qǐng)求URL均需要的。
2.2設(shè)計(jì)
2.2.1圖層列表(tcMaplayerList)的設(shè)計(jì)
首先我給出圖層列表設(shè)計(jì)的截圖:
(1)每一個(gè)圖層均有一個(gè)圖層名
(2)每一個(gè)圖層均有自己的圖層類型,比如AGS類型的、WMTS類型的等。這是為了程序中對(duì)不同的類型的URL進(jìn)行解析。
(3)每一個(gè)圖層有其自己的顯示順序,為了正確的疊加圖層之用。
(4)每一個(gè)圖層也有自己開始顯示的級(jí)別。如有的圖層想第一級(jí)別開始顯示,有的圖層希望地圖放大到第二級(jí)別時(shí)才開始顯示。
2.2.2圖層詳細(xì)內(nèi)容列表(tcgismapservicedetail)的設(shè)計(jì)
同樣,這里先給出表的截圖:
(1)ItemID為每個(gè)記錄的主碼。
(2)layerName與tcMaplayerList中的圖層名是對(duì)應(yīng)的。
(3)圖層級(jí)別表示的是該圖層在此級(jí)別時(shí)的信息。
(4)圖層在該級(jí)別的URL有一個(gè)固定的部分,比如WMTS請(qǐng)求中,變化的只是行列號(hào),而前面的部分均是不定的。
(5)Token、XFieldName、YFieldName、LevelFieldName均是為擴(kuò)展之用,當(dāng)URL需要給行列號(hào)以及級(jí)別一個(gè)固定的名稱時(shí)等,則配置。否則不用。
3.工作流程
3.1流程圖
3.2流程詳解
3.2.1得到需要顯示的圖層列表
在顯示地圖之前,需要先向后臺(tái)發(fā)出請(qǐng)求,此請(qǐng)求的參數(shù)主要是layerType,后臺(tái)根據(jù)layerType將tcMapLayerList表中符合需求的內(nèi)容讀出返回。
3.2.2 解析當(dāng)前地圖級(jí)別下的各個(gè)圖層信息,并順序顯示
在解析了需要顯示的圖層列表后,每個(gè)圖層均會(huì)給后臺(tái)發(fā)出自己的信息,信息中包括了此時(shí)地圖的級(jí)別,以及需要得到的瓦片行列號(hào)和自己的圖層名。
但是此時(shí)的地圖級(jí)別并不是圖層發(fā)給后臺(tái)的級(jí)別參數(shù),真是的地圖級(jí)別是:
factLayerLevel=layerLevel+startLayerLevel。
根據(jù)factlayerLevel和layerName,在tcgismapservicedetail中找到對(duì)應(yīng)的信息,如果有信息,則表示該圖層在此真實(shí)級(jí)別下是需要顯示的,然后根據(jù)該圖層的layerType將此時(shí)的URL拼接出來,下載瓦片然后返回此瓦片。
如果沒有查到數(shù)據(jù)則不顯示此地圖級(jí)別下的該圖層。
4.成果展示
4.1測(cè)繪局地圖+本地瓦片
4.2 天地圖地形圖層+天地圖注記圖層+Geoserver發(fā)布的行政區(qū)劃圖層
4.3測(cè)繪局提供的管線WMTS圖層+本地AGS發(fā)布的地形圖層
5.總結(jié)
通過此配置基本可以實(shí)現(xiàn)項(xiàng)目中遇到的絕大部分地圖需求。改進(jìn)后,雖然不再需要對(duì)各種需求進(jìn)行大規(guī)模的代碼編寫,但是針對(duì)不同的瓦片類型的URL獲取依然是要走分支的,這里可以通過策略模式來讓代碼更加規(guī)范。
斷了一個(gè)多月沒寫博,WebGIS的原理系列會(huì)繼續(xù)寫下去的,希望大家持續(xù)關(guān)注。
posted on 2014-11-24 10:00 順其自然EVO 閱讀(186) 評(píng)論(0) 編輯 收藏 所屬分類: 測(cè)試學(xué)習(xí)專欄