文章版權由做者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/。前端
這篇文章裏,我主要針對OGC標準中的WMS、WMTS以及ArcGIS的在線地圖服務來進行解析。算法
寫以前,我先來給你們提一下OGC是什麼。OGC的全名是Open GIS Consortium,中文名是開放地理空間信息聯盟,它是一個是非盈利、志願的國際標準化組織。在空間數據互操做領域,基於公共接口訪問模式的互操做方法是一種基本的操做方法。經過國際標準化組織(ISO/TC211)或技術聯盟(如OGC)制定空間數據互操做的接口規範,GIS軟件商開發遵循這一接口規範的空間數據的讀寫函數,從而能夠實現異構空間數據庫的互操做(來自百度百科)。數據庫
目前OGC制定的標準有:WMS(地圖服務)、WMTS(地圖瓦片服務)、WFS(要素服務)、WCS(柵格服務)。在下面我介紹的地圖請求方式皆是RESTFUL下的請求方式。服務器
WMS服務能夠提供如下幾種服務:微信
GetCapabilities返回服務級元數據。框架
GetMap返回一個地圖影像。函數
GetFeatureinfo返回顯示在地圖上的某些特殊要素的信息等。設計
咱們來看一下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:4326rest
&WIDTH=256&HEIGHT=256&bbox=117.21879147492814,34.240704396544345,117.22000975886715,34.24192268048341。blog
觀察這個URL,不少參數在實際運用中能夠根據提供的服務而固定,好比FORMAT、LAYERS、REQUEST、SRS、STYLES、VERSION、WIDTH、HEIHT參數。而真正須要咱們實際上去不停換算的即是BBOX了。
WMS請求是一種能夠動態出圖的請求,原則上它能夠顯示原始圖像在任意比例尺下的地圖,它不像瓦片服務,只能顯示切圖時所設定好的比例尺下的的地圖。在咱們使用二次開發包時,好比用esri提供的開發包時,其中只須要咱們設置須要顯示的級別數,而不須要咱們設置每一個級別所對應的比例尺,即是由於WMS是一個動態出圖服務。在二次開發中,直接使用提供的WMS類是很是簡單的,只須要提供顯示的範圍和須要顯示的級別數便可,此類的內部會自動的劃分每個級別的比例尺,而WMS是動態出圖的,因此徹底能夠支持這種方式。
可是,實際中,有的服務商提供的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」;
WMTS服務的全稱是Web Map Tile Service,故名思議,不一樣於以前的WMS的動態出圖,WMTS服務是基於瓦片思想的。WMTS同樣支持提供必定的標準服務,好比:
GetCapabilities(獲取服務的元信息,在這個元信息中咱們能夠看到切圖的詳細配置)。
GetTile(獲取切片)。
GetFeatureInfo(可選,獲取點選的要素信息)。
能夠看到這些操做和WMS的操做很是的相同。
咱們再來看一下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。
WMTS服務和咱們以前反覆討論的瓦片思想是符合的,觀察參數也能看出,TILEMATRIX、TILEROW、TILECOL其實就是Level、row、col。因而WMTS服務下的瓦片請求的URL也變瓜熟蒂落的能夠拼出來了:固定格式URL+「&TILEMATRIX=」+level+「&TILEROW=」+row+「&TILECOL=」+col。
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。
問題一:
一個地圖須要前幾個級別地圖是來源於A服務,它的服務地址是AURL。中間幾個級別地圖來源於B服務,它的服務地址是BURL,後面幾個別地圖是來源於C服務,它的服務地址是CURL。這個時候咱們該如何讓系統能夠在每一個級別正常的出圖呢?
問題二:
一個地圖須要同時顯示地形圖和註記圖層,且地形圖服務來源於A服務,註記圖層來源於B服務。如何能正常的加載兩個服務,而且讓註記圖層正常的疊加在地形圖上呢?
問題三:
仍是一個地圖須要同時顯示地形圖和註記圖層,可是此時地形圖服務是WMTS服務,而註記圖層是WMS服務。如何將兩種不一樣服務的瓦片獲取後疊加呢?
問題我就只提這三個吧,這種相似的問題特別特別多,可是我想只要咱們知道了各類服務的URL得到原理,再加上一點點本身解決問題的思路,應該都不難解決的。在之後的柵格圖層(瓦片圖層)設計的章節裏,我會給出一個咱們解決此類問題的方法,該方法能很通用的解決這一系列問題。
講到這裏時,整個系列中,咱們已經講了行列號是什麼、如何獲取行列號、經過行列號獲得瓦片URL。能夠說咱們如今距離如何在前端顯示出柵格圖像,是萬事俱備只欠東風了。那麼下一章節裏,我將給你們借來這個東風。下一節內容是:瓦片在前端拼接顯示的原理。歡迎你們持續關注。
並非只有在開着本身的車時纔是自由,只要咱們雙腿還在,都能遠行。
-----歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/
若是您以爲本文確實幫助了您,能夠微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^