Leaflet

一個開源的 JavaScript 函式庫
用於行動裝置友善的互動式地圖

← 教學


WMS,是 網路地圖服務(web map service) 的縮寫,是一種由專業 GIS 軟體發布地圖的常見方式(非 GIS 用戶很少使用)。此格式類似於地圖圖磚,但更通用,並且對於網路地圖的使用優化較差。WMS 影像由其角落的坐標定義 - 這是 Leaflet 在底層執行的計算。

TMS 代表 圖磚地圖服務(tiled map service),是一種更專注於網路地圖的地圖圖磚標準,非常類似於 Leaflet 在 L.TileLayer 中預期的地圖圖磚。

WMTS,代表 網路地圖圖磚服務(web map tile service),是地圖圖磚的標準協定,並提供可直接在 L.TileLayer 中使用的地圖圖磚。

Leaflet 中的 WMS

當有人發布 WMS 服務時,他們很可能會連結到一個稱為 GetCapabilities 文件。在本教學中,我們將使用 Mundialis 在 http://ows.mundialis.de/services/service? 提供的 WMS。該服務的功能描述位於以下 URL

http://ows.mundialis.de/services/service?request=GetCapabilities

Leaflet 不理解 WMS GetCapabilities 文件。相反,您必須建立一個 L.TileLayer.WMS 圖層,提供基本 WMS URL,並指定您需要的任何 WMS 選項。

基本 WMS URL 只是 GetCapabilities URL,沒有任何參數,如下所示

http://ows.mundialis.de/services/service?

在 Leaflet 地圖中使用它的方式很簡單

var map = L.map(mapDiv, mapOptions);

var wmsLayer = L.tileLayer.wms('http://ows.mundialis.de/services/service?', wmsOptions).addTo(map);

L.TileLayer.WMS 的實例至少需要一個選項:layers。請注意,「圖層」在 Leaflet 中的概念與 WMS 中的「圖層」概念不同!

WMS 伺服器在服務中定義了一組圖層。這些圖層定義在 GetCapabilities XML 文件中,這通常很繁瑣且難以理解。通常,最好使用 QGIS 等軟體來查看 WMS 伺服器中可用的圖層,以查看可用的圖層名稱

Discovering WMS layers with QGIS

我們可以看到 Mundialis WMS 有一個名為 TOPO-OSM-WMS 的 WMS 圖層,其中包含底圖。讓我們看看它長什麼樣子

var wmsLayer = L.tileLayer.wms('http://ows.mundialis.de/services/service?', {
	layers: 'TOPO-OSM-WMS'
}).addTo(map);
請參閱此獨立範例。

或者我們可以嘗試 SRTM30-Colored-Hillshade WMS 圖層

var wmsLayer = L.tileLayer.wms('http://ows.mundialis.de/services/service?', {
	layers: 'SRTM30-Colored-Hillshade'
}).addTo(map);
請參閱此獨立範例。

layers 選項是以逗號分隔的圖層清單。如果 WMS 服務定義了多個圖層,則對地圖影像的請求可以參考多個圖層。

對於我們正在使用的範例 WMS 伺服器,有一個 TOPO-WMS WMS 圖層顯示世界地形,以及一個 OSM-Overlay-WMS WMS 圖層顯示地點名稱。如果我們同時請求這兩個圖層(以逗號分隔),WMS 伺服器會將兩個圖層組合成一個影像

var topographyAndPlaces = L.tileLayer.wms('http://ows.mundialis.de/services/service?', {
	layers: 'TOPO-WMS,OSM-Overlay-WMS'
}).addTo(map);

請注意,這將向 WMS 伺服器請求一個影像。這與為地形建立一個 L.TileLayer.WMS,為地點建立另一個,並將它們都加入到地圖中不同。在第一種情況下,只有一個影像請求,並且由 WMS 伺服器決定如何組合(將一個放在另一個之上)影像。在第二種情況下,將有兩個影像請求,並且由在網路瀏覽器中運行的 Leaflet 程式碼決定如何組合它們。

如果我們將此與 圖層控制結合使用,那麼我們可以建立一個簡單的地圖來查看差異

var basemaps = {
	Topography: L.tileLayer.wms('http://ows.mundialis.de/services/service?', {
		layers: 'TOPO-WMS'
	}),

	Places: L.tileLayer.wms('http://ows.mundialis.de/services/service?', {
		layers: 'OSM-Overlay-WMS'
	}),

	'Topography, then places': L.tileLayer.wms('http://ows.mundialis.de/services/service?', {
		layers: 'TOPO-WMS,OSM-Overlay-WMS'
	}),

	'Places, then topography': L.tileLayer.wms('http://ows.mundialis.de/services/service?', {
		layers: 'OSM-Overlay-WMS,TOPO-WMS'
	})
};

L.control.layers(basemaps).addTo(map);

basemaps.Topography.addTo(map);

變更為「地形,然後是地點」選項,這樣您就可以看到「在」地形「之上」的地點,但 WMS 伺服器很聰明地將建築標籤顯示在其之上。當要求多個圖層時,如何組合圖層取決於 WMS 伺服器。

請參閱此獨立範例。

給 WMS 服務的 GIS 使用者的注意事項

從 GIS 的角度來看,Leaflet 中對 WMS 的處理非常基本。沒有 GetCapabilities 支援,沒有圖例支援,也沒有 GetFeatureInfo 支援。

L.TileLayer.WMS 有額外的選項,可在 Leaflet 的 API 文件中找到。任何未在那裡描述的選項都將在 getImage URL 中傳遞給 WMS 伺服器。

另請注意,Leaflet 僅支援少數 坐標系統CRS:3857CRS:3395CRS:4326(請參閱 L.CRS 的文件)。如果您的 WMS 服務沒有在這些坐標系統中提供影像,您可能需要使用 Proj4Leaflet 在 Leaflet 中使用不同的坐標系統。除此之外,只需在初始化地圖時使用正確的 CRS,任何加入的 WMS 圖層都將使用它

var map = L.map('map', {
	crs: L.CRS.EPSG4326
});

var wmsLayer = L.tileLayer.wms('http://ows.mundialis.de/services/service?', {
	layers: 'TOPO-OSM-WMS'
}).addTo(map);
請參閱此獨立範例。

Leaflet 中的 TMS

Leaflet 沒有明確支援 TMS 服務,但是圖磚命名結構與常見的 L.TileLayer 命名方案非常相似,因此顯示 TMS 服務幾乎是微不足道的。

讓我們考慮一個具有以下端點的 TMS 伺服器

http://base_url/tms/1.0.0

查看 有關 TMS 的 MapCache 幫助TMS 規範,您可以看到 TMS 中地圖圖磚的 URL 如下所示

http://base_url/tms/1.0.0/ {tileset} / {z} / {x} / {y} .png

要將 TMS 服務用作 L.TileLayer,我們可以檢查功能文件(與基本端點相同,在我們的例子中是 http://base_url/tms/1.0.0)以查看有哪些可用的 tileset,並建立我們的基本 URL

http://base_url/tms/1.0.0/{example_layer}@png/{z}/{x}/{y}.png

並在實例化圖層時使用 tms:true 選項,如下所示

var tms_example = L.tileLayer('http://base_url/tms/1.0.0/example_layer@png/{z}/{x}/{y}.png', {
	tms: true
}).addTo(map);

Leaflet 1.0 中的一項新功能是能夠在 URL 中使用 {-y} 而不是 tms: true 選項,例如

var layer = L.tileLayer('http://base_url/tms/1.0.0/tileset/{z}/{x}/{-y}.png');

需要 tms: true 選項(在 Leaflet 0.7 中)或 {-y} (在 Leaflet 1.0 中),因為 vanilla L.TileLayer 的坐標原點是左上角,因此 Y 坐標向下。在 TMS 中,坐標原點是左下角,因此 Y 坐標向上。

除了 y 坐標的差異和圖磚集的發現之外,TMS 服務完全以 L.TileLayer 預期的方式提供圖磚。