文章版權由做者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/。數據庫
對於通常性的地圖顯示需求,咱們只須要知道地圖的一個固定URL,而後知道要顯示的範圍和要顯示的級別以及每一個級別的scale等便可。設計模式
可是若是咱們遇到下面幾種狀況時,又該如何。緩存
(1)須要顯示的圖層的不一樣級別來自於不一樣的服務器(URL不一樣):如前幾個級別由一個固定URL提供,後幾個級別由另一個URL提供。服務器
(2)須要同時疊加幾張圖層:如須要疊加地形圖和註記圖,且圖層的顯示有層級之分。設計
(3)須要同時疊加幾張圖層,而且每一個圖層初始顯示級別不同。3d
(4)須要同時疊加幾張圖層,圖層的URL的請求方式均有不一樣:如其中一個圖層由AGS提供,一個圖層是天地圖服務提供,還有一個圖層是當地城管局提供,最後還有一個圖層是由本地未發佈的緩存瓦片提供。server
諸如相似於以上的地圖顯示需求還有不少,若是咱們單純的對每一種狀況進行一個代碼上的分支固然也是能解決的。可是這並非最好的一種解決方法,每次新的需求提出時,都須要對代碼修改,這不符合設計模式中的開放封閉原則。雖然咱們能夠用簡單工廠等模式來努力改善這種狀況,不過若是有更好的方式,不須要修改任何代碼,不須要用設計模式,就能解決以上的問題是否更好?blog
下面我將給出一種經過數據庫配置來實現上面全部問題的解決方案。此方案在多個項目中已經開始使用。token
首先咱們必須對以上多種地圖顯示的需求進行一個分析,提出他們的共同點。get
(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均須要的。
首先我給出圖層列表設計的截圖:
(1)每個圖層均有一個圖層名
(2)每個圖層均有本身的圖層類型,好比AGS類型的、WMTS類型的等。這是爲了程序中對不一樣的類型的URL進行解析。
(3)每個圖層有其本身的顯示順序,爲了正確的疊加圖層之用。
(4)每個圖層也有本身開始顯示的級別。若有的圖層想第一級別開始顯示,有的圖層但願地圖放大到第二級別時纔開始顯示。
一樣,這裏先給出表的截圖:
(1)ItemID爲每一個記錄的主碼。
(2)layerName與tcMaplayerList中的圖層名是對應的。
(3)圖層級別表示的是該圖層在此級別時的信息。
(4)圖層在該級別的URL有一個固定的部分,好比WMTS請求中,變化的只是行列號,而前面的部分均是不定的。
(5)Token、XFieldName、YFieldName、LevelFieldName均是爲擴展之用,當URL須要給行列號以及級別一個固定的名稱時等,則配置。不然不用。
在顯示地圖以前,須要先向後臺發出請求,此請求的參數主要是layerType,後臺根據layerType將tcMapLayerList表中符合需求的內容讀出返回。
在解析了須要顯示的圖層列表後,每一個圖層均會給後臺發出本身的信息,信息中包括了此時地圖的級別,以及須要獲得的瓦片行列號和本身的圖層名。
可是此時的地圖級別並非圖層發給後臺的級別參數,真是的地圖級別是:
factLayerLevel=layerLevel+startLayerLevel。
根據factlayerLevel和layerName,在tcgismapservicedetail中找到對應的信息,若是有信息,則表示該圖層在此真實級別下是須要顯示的,而後根據該圖層的layerType將此時的URL拼接出來,下載瓦片而後返回此瓦片。
若是沒有查到數據則不顯示此地圖級別下的該圖層。
經過此配置基本能夠實現項目中遇到的絕大部分地圖需求。改進後,雖然再也不須要對各類需求進行大規模的代碼編寫,可是針對不一樣的瓦片類型的URL獲取依然是要走分支的,這裏能夠經過策略模式來讓代碼更加規範。
斷了一個多月沒寫博,WebGIS的原理系列會繼續寫下去的,但願你們持續關注。
------歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/