文章版權由作者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/。
1.前言
這篇文章里,我主要針對OGC標准中的WMS、WMTS以及ArcGIS的在線地圖服務來進行解析。
寫之前,我先來給大家提一下OGC是什么。OGC的全名是Open GIS Consortium,中文名是開放地理空間信息聯盟,它是一個是非盈利、志願的國際標准化組織。在空間數據互操作領域,基於公共接口訪問模式的互操作方法是一種基本的操作方法。通過國際標准化組織(ISO/TC211)或技術聯盟(如OGC)制定空間數據互操作的接口規范,GIS軟件商開發遵循這一接口規范的空間數據的讀寫函數,從而可以實現異構空間數據庫的互操作(來自百度百科)。
目前OGC制定的標准有:WMS(地圖服務)、WMTS(地圖瓦片服務)、WFS(要素服務)、WCS(柵格服務)。在下面我介紹的地圖請求方式皆是RESTFUL下的請求方式。
2.WMS服務的URL
WMS服務可以提供以下幾種服務:
GetCapabilities返回服務級元數據。

GetMap返回一個地圖影像。

GetFeatureinfo返回顯示在地圖上的某些特殊要素的信息等。

2.1例子
我們來看一下WMS服務請求地圖時的URL例子:http://172.18.0.154:7001/ServiceRight/proxy/f446aabb04a59af336901290d615e16b/xzcg/WMS/XZ500DLG_BZWGS84?LAYERS=XZ500DLG_BZWGS84&FORMAT=image/gif&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&SRS=EPSG:4326
&WIDTH=256&HEIGHT=256&bbox=117.21879147492814,34.240704396544345,117.22000975886715,34.24192268048341。


觀察這個URL,很多參數在實際運用中可以根據提供的服務而固定,比如FORMAT、LAYERS、REQUEST、SRS、STYLES、VERSION、WIDTH、HEIHT參數。而真正需要我們實際上去不停換算的便是BBOX了。
2.2原理
WMS請求是一種可以動態出圖的請求,原則上它可以顯示原始圖像在任意比例尺下的地圖,它不像瓦片服務,只能顯示切圖時所設定好的比例尺下的的地圖。在我們使用二次開發包時,比如用esri提供的開發包時,其中只需要我們設置需要顯示的級別數,而不需要我們設置每個級別所對應的比例尺,便是因為WMS是一個動態出圖服務。在二次開發中,直接使用提供的WMS類是非常簡單的,只需要提供顯示的范圍和需要顯示的級別數即可,此類的內部會自動的划分每一個級別的比例尺,而WMS是動態出圖的,所以完全可以支持這種方式。
2.3 注意
但是,實際中,有的服務商提供的WMS服務卻並不是這樣的,他們很有可能會在某個比例尺很小的地方做出限制,讓我們只能以某幾個固定的比例尺去訪問得到瓦片,其他比例尺均不可以。之前替其他組同事處理過的一個利用基於FlexViewer框架下的WMS類加載地圖時,在特定的某幾個級別上不顯示地圖,便是這個原因了。而解決這個問題的方法是重新擴展這個類,使擴展的WMSEX類能夠通過設定好的每個級別的比例尺來換算出對應的Bbox,這里我們之前得到的行列號的算法就終於有用途了。
minX=resolution*tileSize*col;
minY=resolution*tileSize*row;
maxX=resolution*tileSize*(col+1);
maxY=resolution*tileSize*(row +1);
Bbox=“minX,minY,maxX,maxY”;
3.WMTS服務
WMTS服務的全稱是Web Map Tile Service,故名思議,不同於之前的WMS的動態出圖,WMTS服務是基於瓦片思想的。WMTS一樣支持提供一定的標准服務,比如:
GetCapabilities(獲取服務的元信息,在這個元信息中我們可以看到切圖的詳細配置)。

GetTile(獲取切片)。
GetFeatureInfo(可選,獲取點選的要素信息)。
可以看到這些操作和WMS的操作非常的相同。
3.1例子
我們再來看一下WMTS下請求地圖瓦片的URL例子,這里我以天地圖中的URL為范例:http://srv.zjditu.cn/ZJEMAP_2D/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&LAYER=ZJEMAP&FORMAT=image/png&TILEMATRIXSET=TileMatrixSet0&TILEMATRIX=17&STYLE=default&TILEROW=21747&TILECOL=109282。


觀察這個URL所包含的參數,在獲取瓦片前我們是可以將FORMAT、LAYER、REQUEST、SERVICE、STYLE、VERSION根據需求而寫定的,在不斷變化的是TILEMATRIX、TILEROW、TILECOL。
3.2原理
WMTS服務和我們之前反復討論的瓦片思想是符合的,觀察參數也能看出,TILEMATRIX、TILEROW、TILECOL其實就是Level、row、col。於是WMTS服務下的瓦片請求的URL也變順理成章的可以拼出來了:固定格式URL+“&TILEMATRIX=”+level+“&TILEROW=”+row+“&TILECOL=”+col。
4.常見地圖服務器發布的地圖中的URL——以AGS服務為例
AGS中,在對發布的服務進行了切圖后,地圖的請求URL成了一種固定的格式。如:http://172.29.0.74:8399/arcgis/rest/services/HFTile/MapServer/tile/2/957/834。

顯而易見,在tile后的便是Level、row、col。所以AGS下的URL寫法便是:restMapService地址/Level/row/col。
5.提幾個問題
問題一:
一個地圖需要前幾個級別地圖是來源於A服務,它的服務地址是AURL。中間幾個級別地圖來源於B服務,它的服務地址是BURL,后面幾個別地圖是來源於C服務,它的服務地址是CURL。這個時候我們該如何讓系統可以在每個級別正常的出圖呢?
問題二:
一個地圖需要同時顯示地形圖和注記圖層,且地形圖服務來源於A服務,注記圖層來源於B服務。如何能正常的加載兩個服務,並且讓注記圖層正常的疊加在地形圖上呢?
問題三:
還是一個地圖需要同時顯示地形圖和注記圖層,但是此時地形圖服務是WMTS服務,而注記圖層是WMS服務。如何將兩種不同服務的瓦片獲取后疊加呢?
問題我就只提這三個吧,這種類似的問題特別特別多,但是我想只要我們知道了各種服務的URL獲得原理,再加上一點點自己解決問題的思路,應該都不難解決的。在以后的柵格圖層(瓦片圖層)設計的章節里,我會給出一個我們解決此類問題的方法,該方法能很通用的解決這一系列問題。
6.總結
講到這里時,整個系列中,我們已經講了行列號是什么、如何獲取行列號、通過行列號得到瓦片URL。可以說我們現在距離如何在前端顯示出柵格圖像,是萬事俱備只欠東風了。那么下一章節里,我將給大家借來這個東風。下一節內容是:瓦片在前端拼接顯示的原理。歡迎大家持續關注。
並不是只有在開着自己的車時才是自由,只要我們雙腿還在,都能遠行。
-----歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/
如果您覺得本文確實幫助了您,可以微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^

