qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問 http://qaseven.github.io/

          通過配置實(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í)專欄

          <2014年11月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 安塞县| 潼南县| 牟定县| 渭南市| 沙坪坝区| 宽甸| 肥东县| 忻城县| 三都| 当雄县| 罗山县| 仲巴县| 日照市| 交城县| 宝坻区| 宜良县| 九龙城区| 临城县| 凤阳县| 莒南县| 讷河市| 焉耆| 新丰县| 湘潭市| 松溪县| 永和县| 罗源县| 东明县| 黔东| 三明市| 囊谦县| 冷水江市| 卢湾区| 江孜县| 仪征市| 长沙市| 临清市| 双流县| 保靖县| 宁乡县| 龙岩市|