網路地圖服務(WMS)詳解

charlee44發表於2024-01-14

目錄
  • 1.概述
  • 2.GetCapabilities
  • 3.GetMap
  • 4.GetFeatureInfo

閱讀本文之前可參考前文:《地圖伺服器GeoServer的安裝與配置》《GeoServer釋出地圖服務(WMS、WFS)》

1.概述

經過前文的介紹,相信我們對WMS/WFS服務已經有了一個非常直觀的認識,最起碼我們知道了地圖服務的資料從何而來,又是如何釋出出去的。更進一步的說,OGC給WMS/WFS分別定義了非常詳盡的標準規範,其主要內容是透過HTTP(Hypertext Transfer Protocol,超文字傳輸協議 )實現的各種操作。在這裡,我們要介紹的WMS支援標準HTTP的Get和Post請求,不過通常情況下基於GET方式(將引數以鍵值對的形式放置在URL中)進行服務請求較為方便。

HTTP協議用於客戶端和伺服器之間的通訊,為了滿足各種各樣的通訊需求,HTTP協議規定了多種不同的請求方法,其中Get和Post是最基礎的兩種。Get用於請求已被URI識別的資源,Post則用來傳輸實體的主體,兩者的功能比較相近,但其實有著不小的區別。不過在本文中,我們將會主要看到這個區別:Get請求是將引數拼接到URL上進行引數傳遞的,而POST是將引數寫入到請求正文中傳遞的;因此,Get請求有URL長度的限制,通常用於查詢;Post請求則沒有長度限制,通常用於增添、刪除和修改。

根據《OpenGIS Web Map Server Implementation Specification》的1.3.0版本,WMS主要支援如下幾種操作,如下表1所示所示:

【表1 WMS支援的操作】

操作 必要性 描述
GetCapabilities 必要 查詢服務的後設資料,包括支援的操作、引數、以及圖層列表等
GetMap 必要 檢查詢指定區域和內容的地圖影像
GetFeatureInfo 可選 查詢地圖上畫素位置的基礎資料,包括幾何和屬性值

2.GetCapabilities

GetCapabilities操作的目的是獲取服務的後設資料,主要包括WMS伺服器提供的操作、請求引數等資訊。GetCapabilities請求的引數如下表2所示:

【表2 WMS GetCapabilities請求引數】

請求引數 必要性 描述
VERSION=version 可選 請求的版本:值是1.1.0,1.1.1,1.3.0三者之一。
SERVICE=WMS 必要 服務的型別。
REQUEST=GetCapabilities 必要 請求操作的名稱。
FORMAT=MIME_type 可選 服務後設資料的格式。
UPDATESEQUENCE=string 可選 用於快取控制的序列號或字串。

根據表2所示的引數,我們在瀏覽器中輸入如下地址:

http://localhost:8080/geoserver/ows?service=WMS&version=1.3.0&request=GetCapabilities

瀏覽器響應的結果如下圖所示。可以看到返回的結果其實是一個XML檔案,這個檔案中描述的就是WMS服務具體的後設資料資訊。

3.GetMap

GetMap操作用於請求伺服器生成地圖並返回,這個操作也是WMS服務最主要的功能。不難想象,為了保證正確的輸出結果,我們必須配置足夠多的引數,比如地理範圍,空間參考、輸出寬高以及格式等。具體的請求引數如下表3所示:

【表3 WMS GetMap請求引數】

請求引數 必要性 描述
VERSION=1.3.0 必要 請求的版本。
REQUEST=GetMap 必要 請求操作的名稱。
LAYERS=layer_list 必要 一個或多個地圖圖層列表,使用逗號分隔。
STYLES=style_list 必要 渲染樣式列表,使用逗號分隔。
CRS=namespace:identifier 必要 座標參考系統。
BBOX=minx,miny,maxx,maxy 必要 邊界框包圍盒(從左下到右上,使用CRS的單位)。
WIDTH=output_width 必要 地圖影像的寬度。
HEIGHT=output_height 必要 地圖影像的高度。
FORMAT=output_format 必要 地圖的輸出格式。
TRANSPARENT=TRUE|FALSE 可選 地圖背景透明度(預設不透明)。
BGCOLOR=color_value 可選 背景顏色的十六進位制紅綠藍顏色值(預設白色)。
EXCEPTIONS=exception_format 可選 WMS報告異常的格式(預設為XML)。
TIME=time 可選 圖層需要的時間值。
ELEVATION=elevation 可選 圖層需要的高程值。
Other sample dimension(s) 可選 其他維度的值,備用。

這些引數具體的引數值可以參考GetCapabilities操作返回的XML檔案。例如,我們填充好所有的必要引數,在瀏覽器中輸入如下地址來訪問前文中配置好的向量資料集:

http://localhost:8080/geoserver/wms?
VERSION=1.3.0
&REQUEST=GetMap
&LAYERS=test:multipolygons
&STYLES
&CRS=EPSG:4326
&BBOX=38.8920794,-77.0495419,38.9096339,-77.0199063
&WIDTH=768
&HEIGHT=454
&FORMAT=image/png

這時,瀏覽器就會返回一個PNG格式的影像地圖檔案,如下圖所示。GetMap響應的地圖影像大小、格式等並不是固定的,具體取決於請求的引數。如果我們對向量和柵格足夠熟悉的話,我們能大概猜出WMS服務返回地圖檔案大概的處理演算法流程:

  1. 由於資料來源是向量資料,所以我們關鍵是向量柵格化的演算法。
  2. 根據傳遞的引數座標參考系統CRS、地理範圍BBox、寬WIDTH以及高HEIGHT足夠幫助我們確定一個柵格資料集。
  3. 透過向量柵格化演算法對柵格資料集填充畫素值,這中間涉及到影像的重取樣操作。
  4. 最後將柵格資料集的檔案流傳輸到瀏覽器端。

如果我們想訪問前文中配置好的柵格資料集,URL請求引數大致相同,如下所示:

http://localhost:8080/geoserver/wms?
VERSION=1.3.0
&REQUEST=GetMap
&LAYERS=test:japan_tmo_2011057_geo
&STYLES
&CRS=EPSG:4326
&BBOX=23.034667983398435,120.15380860839844,52.990722641601565,153.88916014160156
&WIDTH=768
&HEIGHT=682
&FORMAT=image/png

此時,瀏覽器也會返回一張PNG格式的影像地圖,如下圖所示:

有一點要注意的是在WMS另一個廣泛使用的版本1.1.1中,邊界框包圍盒的引數BBOX的x、y座標順序是與1.3.0版本是相反的,WMS版本1.1.1的請求URL如下所示:

http://localhost:8080/geoserver/wms?
VERSION=1.1.1
&REQUEST=GetMap
&LAYERS=test:multipolygons
&STYLES
&CRS=EPSG:4326
&BBOX=-77.0495419,38.8920794,-77.0199063,38.9096339
&WIDTH=768
&HEIGHT=454
&FORMAT=image/png

這個問題與GDAL2.0升級3.0版本時地理座標系相關引數x和y需要進行調換有點類似,經過查閱相關資料才知道,原因是要保證x和y的順序要與座標參考系定義的軸順序保持一致。但是在筆者看來,這種設計多少有點破壞向下相容的原則。

4.GetFeatureInfo

GetFeatureInfo是可選操作,用於查詢地圖上給定位置的空間和屬性資訊。這個操作有點類似於滑鼠在數字地圖上拾取一點,高亮顯示該點位置的要素並顯示該要素關聯的屬性。不難理解,由於WMS使用的HTTP協議是無狀態的,所以GetFeatureInfo請求引數包含了GetMap請求的大部分引數(除VERSION和REQUEST之外的所有引數)。畢竟,要獲取地圖某一點的要素資訊,就先得把地圖給獲取了。GetFeatureInfo操作的標準請求引數如下表4所示:

【表4 WMS GetFeatureInfo請求引數】

請求引數 必要性 描述
VERSION=1.3.0 必要 請求的版本。
REQUEST=GetFeatureInfo 必要 請求操作的名稱。
map request part 必要 GetMap請求的大部分引數。
QUERY_LAYERS=layer_list 必要 要查詢的層級列表,以逗號分隔。
INFO_FORMAT=output_format 必要 特徵資訊返回格式(MIME型別)。
FEATURE_COUNT=number 可選 返回的特徵數目 (預設為1)。
I=pixel_column 必要 x方向畫素座標。
J=pixel_row 必要 y方向畫素座標。
EXCEPTIONS=exception_format 可選 WMS 報告異常的格式(預設為XML)。

我們按照表4所示的引數來查詢前文中配置好的基於向量資料集的地圖,具體在某個畫素位置的要素資訊,可以在瀏覽器中輸入如下地址:

http://localhost:8080/geoserver/wms?
VERSION=1.3.0
&REQUEST=GetFeatureInfo
&LAYERS=test:multipolygons
&STYLES
&CRS=EPSG:4326
&BBOX=38.8920794,-77.0495419,38.9096339,-77.0199063
&WIDTH=768
&HEIGHT=454
&FORMAT=image/png
&QUERY_LAYERS=test:multipolygons
&INFO_FORMAT=application/json
&I=384
&J=227

此時,瀏覽器會返回一個JSON,描述了該畫素位置的幾何資訊,其關聯的屬性資訊,以及一些後設資料資訊。如下圖所示:

同樣的,如果使用類似的引數來查詢前文中配置好的基於柵格資料集的地圖,在瀏覽器中輸入如下地址:

http://localhost:8080/geoserver/wms?
VERSION=1.3.0
&REQUEST=GetFeatureInfo
&LAYERS=test:japan_tmo_2011057_geo
&STYLES
&CRS=EPSG:4326
&BBOX=23.034667983398435,120.15380860839844,52.990722641601565,153.88916014160156
&WIDTH=768
&HEIGHT=682
&FORMAT=image/png
&QUERY_LAYERS=test:japan_tmo_2011057_geo
&INFO_FORMAT=application/json
&I=384
&J=341

此時,瀏覽器會返回一個JSON,不過內容就簡單多了,返回的是該地圖在指定畫素位置的包含RGB三個波段的畫素值。如下圖所示。這其實也不難理解,如果把柵格資料當作是點要素的集合,那麼點的畫素值自然就是其關聯的屬性資料了。

相關文章