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