GIS

WMTS是什么

了解GIS中WMTS(Web Map Tile Service)的基本概念、工作原理、瓦片结构、请求方式以及WMTS与WMS、XYZ和Vector Tile之间的区别。

阅读约 93 分钟

WMTS是什么

WMTS(Web Map Tile Service)即Web地图瓦片服务

它是一种用于通过网络提供预先切分地图瓦片的GIS服务标准。

简单来说:

WMTS将地图按照固定的比例尺、行列编号切成大量瓦片,客户端只请求当前视野需要的瓦片。

例如:

GIS数据
    ↓
地图渲染
    ↓
切成瓦片
    ↓
Tile
Tile
Tile
Tile
    ↓
WMTS服务
    ↓
WebGIS

用户浏览地图时,客户端只需要加载当前屏幕范围内的瓦片。

WMTS解决什么问题

如果使用WMS显示地图:

用户移动地图
    ↓
计算新的BBOX
    ↓
发送WMS请求
    ↓
服务器重新渲染
    ↓
返回地图图片

当用户频繁缩放、平移地图时,服务器可能需要不断进行地图渲染。

WMTS则采用瓦片方式:

地图
 ↓
预先切片
 ↓
保存瓦片
 ↓
客户端按需请求

因此可以大量减少实时地图渲染的压力。

WMTS的核心思想

WMTS可以简单理解为:

一张大地图
    ↓
按照固定规则切成很多小图片
    ↓
每张图片都有编号
    ↓
客户端只请求需要的图片

例如:

        地图
┌────┬────┬────┬────┐
│Tile│Tile│Tile│Tile│
├────┼────┼────┼────┤
│Tile│Tile│Tile│Tile│
├────┼────┼────┼────┤
│Tile│Tile│Tile│Tile│
└────┴────┴────┴────┘

每个Tile都是一个独立的地图瓦片。

WMTS与瓦片

WMTS中的Tile通常是固定大小的地图图片。

常见尺寸:

256 × 256

也可能使用:

512 × 512

例如:

Tile
┌──────────────────┐
│                  │
│     地图内容      │
│                  │
└──────────────────┘
       256 × 256

客户端将多个Tile拼接起来:

Tile + Tile + Tile
       ↓
     地图

WMTS的瓦片层级

WMTS通常使用多个缩放级别。

例如:

Zoom 0
    ↓
Zoom 1
    ↓
Zoom 2
    ↓
Zoom 3
    ↓
...

随着Zoom增加:

Zoom越小
 ↓
地图范围越大
 ↓
地图越概略

而:

Zoom越大
 ↓
地图范围越小
 ↓
地图越详细

Zoom

Zoom表示地图缩放级别。

例如:

Zoom 0

可能只需要少量瓦片覆盖整个世界。

Zoom 1

需要更多瓦片。

Zoom 10

需要大量瓦片。

可以理解为:

Zoom
 ↓
地图详细程度

Tile Matrix

WMTS中一个非常重要的概念是:

TileMatrix

可以理解为某一个Zoom级别下的完整瓦片网格。

例如:

TileMatrix 0
┌────────┐
│        │
│  Tile  │
│        │
└────────┘

到了更高级别:

TileMatrix 1
┌────┬────┐
│    │    │
├────┼────┤
│    │    │
└────┴────┘

再继续放大:

TileMatrix 2
┌──┬──┬──┬──┐
│  │  │  │  │
├──┼──┼──┼──┤
│  │  │  │  │
├──┼──┼──┼──┤
│  │  │  │  │
├──┼──┼──┼──┤
│  │  │  │  │
└──┴──┴──┴──┘

因此:

TileMatrix
    ↓
一个缩放级别
    ↓
一组瓦片网格

TileMatrixSet

WMTS中还有一个重要概念:

TileMatrixSet

它用于定义完整的瓦片矩阵体系。

通常包含:

TileMatrixSet
├── CRS
├── ScaleDenominator
├── TileWidth
├── TileHeight
├── MatrixWidth
└── MatrixHeight

可以理解为:

TileMatrixSet
        ↓
整个瓦片金字塔
        ↓
Zoom 0
Zoom 1
Zoom 2
Zoom 3
...

瓦片金字塔

WMTS通常采用:

Tile Pyramid

即瓦片金字塔结构。

例如:

             Zoom 0
              ┌─┐
              └─┘

           Zoom 1
          ┌──┬──┐
          └──┴──┘

        Zoom 2
       ┌──┬──┬──┬──┐
       └──┴──┴──┴──┘

     Zoom 3
   ┌─┬─┬─┬─┬─┬─┬─┬─┐
   └─┴─┴─┴─┴─┴─┴─┴─┘

随着Zoom增加:

瓦片数量越来越多
地图范围越来越小
地图细节越来越丰富

WMTS的基本架构

典型WMTS架构:

GIS数据
    ↓
地图服务器
    ↓
地图渲染
    ↓
Tile Cache
    ↓
WMTS
    ↓
WebGIS客户端

如果瓦片已经提前生成:

GIS数据
    ↓
预生成地图瓦片
    ↓
缓存
    ↓
WMTS

客户端访问时可以直接获取瓦片。

WMTS是一种服务标准

WMTS不是某个具体的软件。

它是OGC制定的开放地理空间服务标准。

例如:

OGC
├── WMS
├── WMTS
├── WFS
└── WCS

其中:

WMS
 ↓
地图图片服务

而:

WMTS
 ↓
地图瓦片服务

WMTS的主要操作

WMTS通常包含几个重要操作。

GetCapabilities

用于获取服务能力信息。

例如:

GetCapabilities
        ↓
WMTS服务
        ↓
返回服务配置

可以获取:

图层
TileMatrixSet
CRS
图片格式
瓦片尺寸
缩放级别
TileMatrix

GetTile

GetTile用于请求具体的一张地图瓦片。

基本思想:

Layer
+
TileMatrix
+
TileRow
+
TileCol
    ↓
Tile

例如:

Layer=roads
TileMatrix=10
TileRow=512
TileCol=1024

表示请求某一个固定位置、固定缩放级别的瓦片。

RESTful WMTS

WMTS也可以采用REST风格的请求方式。

可以理解为:

/{Layer}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}

例如:

roads
/
WebMercator
/
10
/
512
/
1024

最终定位到一张具体瓦片。

TileMatrix、TileRow、TileCol

这是WMTS中非常重要的三个概念。

TileMatrix

表示缩放级别。

TileMatrix = 10

表示:

Zoom 10

TileRow

表示瓦片所在的行。

TileRow = 512

TileCol

表示瓦片所在的列。

TileCol = 1024

因此:

TileMatrix
    ↓
缩放级别

TileRow
    ↓
行

TileCol
    ↓
列

共同确定一张瓦片。

瓦片坐标

可以把一个瓦片矩阵理解成一个二维数组:

       Col
       0    1    2    3
    ┌────┬────┬────┬────┐
Row 0│    │    │    │    │
    ├────┼────┼────┼────┤
Row 1│    │    │    │    │
    ├────┼────┼────┼────┤
Row 2│    │    │    │    │
    ├────┼────┼────┼────┤
Row 3│    │    │    │    │
    └────┴────┴────┴────┘

例如:

TileRow = 2
TileCol = 3

就是:

第2行
第3列

对应的Tile。

WMTS与CRS

WMTS同样需要坐标参考系统。

常见:

EPSG:3857
EPSG:4326

例如:

TileMatrixSet
    ↓
CRS
    ↓
EPSG:3857

瓦片矩阵的范围、分辨率和比例尺都与坐标参考系统有关。

因此使用WMTS时需要特别注意:

客户端的投影必须与WMTS的TileMatrixSet匹配。

EPSG:3857与WMTS

Web地图中非常常见的WMTS配置是:

CRS = EPSG:3857

也就是Web Mercator。

很多在线地图服务都采用类似的瓦片体系。

例如:

EPSG:3857
    ↓
TileMatrixSet
    ↓
Zoom
    ↓
Row / Column
    ↓
Tile

WMTS返回什么

WMTS通常返回地图瓦片图片。

常见格式:

image/png
image/jpeg

例如:

GetTile
    ↓
PNG

客户端收到:

256 × 256

的地图图片。

WMTS与WMS

WMS:

客户端
    ↓
BBOX
    ↓
WMS服务器
    ↓
实时渲染
    ↓
图片

WMTS:

客户端
    ↓
TileMatrix / Row / Col
    ↓
WMTS服务器
    ↓
读取瓦片
    ↓
图片

核心区别:

特性WMSWMTS
返回地图图片地图瓦片
请求方式BBOXTile坐标
渲染通常实时通常预先切片/缓存
灵活性相对固定
性能中等
缓存可以非常适合
大规模访问压力较大更适合
地图平移重新请求请求相邻Tile

可以记住:

WMS是按地图范围请求地图,WMTS是按瓦片编号请求地图。

WMTS与XYZ

XYZ也是Web地图中非常常见的瓦片访问方式。

典型XYZ:

/{z}/{x}/{y}.png

其中:

z
 ↓
Zoom

x
 ↓
Column

y
 ↓
Row

例如:

/10/1024/512.png

表示:

Zoom = 10
X = 1024
Y = 512

WMTS和XYZ都使用瓦片。

但是:

XYZ通常是一种简单的瓦片URL访问约定,而WMTS是一套标准化的OGC地图瓦片服务规范。

WMTS与XYZ的区别

特性WMTSXYZ
标准OGC标准常见URL约定
请求标准化参数z/x/y
GetCapabilities支持通常没有
TileMatrixSet支持通常没有
服务描述完整简单
使用复杂度较高较低
Web地图常用非常常用

因此开发WebGIS时,经常会遇到:

WMTS
XYZ
TMS

三种不同的瓦片服务方式。

WMTS与TMS

TMS(Tile Map Service)也是一种地图瓦片服务规范。

它与XYZ非常接近。

常见区别之一是Y轴方向:

XYZ
Y从顶部开始

而部分TMS体系:

Y从底部开始

因此使用不同瓦片服务时,需要注意:

TileRow
TileCol
Y轴方向

否则可能出现:

地图上下颠倒
瓦片位置错误

WMTS与Vector Tile

WMTS通常返回:

PNG
JPEG

而Vector Tile通常返回:

PBF

WMTS:

GIS数据
    ↓
渲染
    ↓
图片Tile

Vector Tile:

GIS数据
    ↓
切片
    ↓
矢量Tile
    ↓
客户端渲染

因此:

特性WMTSVector Tile
Tile内容图片Geometry
常见格式PNG/JPEGPBF
客户端样式较弱很强
Geometry不直接提供提供
交互较弱
动态样式较弱
数据分析不适合可以进一步处理

WMTS与Raster Tile

WMTS本质上非常接近Raster Tile服务。

例如:

Raster Tile
    ↓
地图图片

WMTS提供的是标准化的地图瓦片服务。

因此:

WMTS
 ↓
Raster Tile
 ↓
PNG / JPEG

是非常常见的组合。

WMTS为什么速度快

WMTS性能高的核心原因之一是:

预先渲染
+
瓦片缓存

例如:

GIS数据
    ↓
地图渲染
    ↓
Tile Cache

用户请求:

Tile
    ↓
Cache
    ↓
直接返回

而不是:

用户请求
    ↓
重新查询数据库
    ↓
重新投影
    ↓
重新渲染
    ↓
生成图片

因此可以显著减少服务器压力。

WMTS缓存

生产环境中的WMTS通常会使用Tile Cache。

例如:

用户
 ↓
CDN
 ↓
Tile Cache
 ↓
WMTS

如果Tile已经缓存:

请求
 ↓
Cache Hit
 ↓
直接返回

如果没有:

请求
 ↓
Cache Miss
 ↓
服务器生成Tile
 ↓
缓存
 ↓
返回

WMTS适合什么

WMTS非常适合:

  • 在线底图
  • 遥感影像
  • 地形地图
  • 行政区底图
  • 道路地图
  • 电子地图
  • 高并发WebGIS
  • 大范围地图浏览
  • 三维地球底图
  • 地图缓存服务

例如:

WebGIS
├── Raster Base Map
│   └── WMTS
│
├── Roads
│   └── WMTS
│
└── Satellite
    └── WMTS

WMTS不适合什么

WMTS不适合作为原始矢量数据交换方式。

例如需要:

获取Geometry
查询属性
修改Feature
空间分析
客户端动态渲染

更适合使用:

GeoJSON
WFS
Vector Tile

如果需要实时生成复杂专题地图:

WMS

通常更加灵活。

WMTS的优点

1. 性能高

瓦片可以直接从缓存中读取。

2. 适合高并发

大量用户可以同时请求不同Tile。

3. 适合地图浏览

用户移动地图时,只需要加载新出现的Tile。

4. 容易使用CDN

瓦片是静态图片,非常适合:

CDN
+
浏览器缓存
+
服务器缓存

5. 标准化

WMTS属于OGC标准,可以被多种GIS软件支持。

WMTS的缺点

1. 数据更新成本较高

如果原始GIS数据发生变化:

GIS数据更新
    ↓
重新生成Tile
    ↓
更新缓存

因此不如实时WMS灵活。

2. 样式变化需要重新切片

如果改变:

道路颜色
字体
符号

已经生成的Raster Tile通常需要重新生成。

3. 数据量大

高Zoom级别下:

Tile数量
    ↓
快速增加

需要较大的磁盘空间和缓存空间。

4. 客户端无法直接获得Geometry

客户端拿到的是:

PNG / JPEG

而不是:

Point
LineString
Polygon

WMTS的典型工作流程

GIS数据
    ↓
地图服务器
    ↓
地图渲染
    ↓
建立TileMatrix
    ↓
生成多个Zoom级别
    ↓
生成Tile
    ↓
缓存
    ↓
WMTS服务
    ↓
WebGIS

用户访问:

打开地图
    ↓
确定Zoom
    ↓
计算Tile范围
    ↓
请求Tile
    ↓
拼接Tile
    ↓
显示地图

WMTS地图加载过程

假设用户打开地图:

Zoom = 10

当前视野需要:

Tile A
Tile B
Tile C
Tile D

客户端发送:

Tile A
Tile B
Tile C
Tile D

服务器返回:

PNG
PNG
PNG
PNG

客户端将它们拼接:

┌───────┬───────┐
│ Tile A│ Tile B│
├───────┼───────┤
│ Tile C│ Tile D│
└───────┴───────┘

最终形成完整地图。

WMTS与地图缩放

当用户放大:

Zoom 10
    ↓
Zoom 11

客户端会切换到:

TileMatrix 11

并加载更加详细的Tile。

当用户缩小:

Zoom 11
    ↓
Zoom 10

则使用:

TileMatrix 10

因此:

Zoom
 ↓
TileMatrix
 ↓
TileRow + TileCol
 ↓
具体Tile

WMTS与分辨率

每个Zoom通常对应一个固定分辨率。

例如:

Zoom 0
 ↓
低分辨率
Zoom 10
 ↓
更高分辨率
Zoom 18
 ↓
非常详细

因此一个TileMatrixSet实际上定义了:

Zoom
+
Scale
+
Resolution
+
Tile数量
+
Tile大小

WMTS在OpenLayers中的使用

OpenLayers可以加载WMTS。

基本结构:

Map
 ↓
TileLayer
 ↓
WMTS Source
 ↓
WMTS Server

客户端需要根据WMTS服务的:

Capabilities

获取:

Layer
TileMatrixSet
Format
MatrixIds

然后建立WMTS图层。

WMTS在Leaflet中的使用

Leaflet本身非常适合加载Tile地图。

对于WMTS服务,可以根据服务提供的TileMatrix规则构造瓦片请求。

基本结构:

Leaflet
 ↓
Tile Layer
 ↓
WMTS
 ↓
Tile

需要特别处理:

TileMatrix
TileRow
TileCol

与Leaflet:

z
x
y

之间的对应关系。

WMTS在Cesium中的使用

Cesium可以将WMTS作为影像图层。

典型结构:

Cesium
 ↓
Imagery Layer
 ↓
WMTS
 ↓
Raster Tile
 ↓
地球

这非常适合:

  • 卫星影像
  • 地形图
  • GIS专题地图
  • 城市底图

WMTS常见问题

1. TileMatrixSet不匹配

客户端使用:

EPSG:3857

而服务使用:

EPSG:4326

可能导致瓦片无法正确对齐。

2. MatrixId错误

不同WMTS服务可能使用:

0
1
2
3

也可能使用:

EPSG:3857:0
EPSG:3857:1

因此不能简单假设MatrixId。

应该通过:

GetCapabilities

确认。

3. TileRow方向错误

如果服务采用不同的Y轴规则:

顶部开始

和:

底部开始

会导致地图瓦片位置错误。

4. TileMatrixSet选择错误

同一个WMTS服务可能提供多个:

TileMatrixSet

例如:

GoogleMapsCompatible
EPSG4326

客户端必须选择与地图投影匹配的TileMatrixSet。

5. 图片格式错误

例如服务只支持:

image/png

客户端却请求:

image/jpeg

可能导致请求失败。

GetCapabilities为什么重要

使用一个陌生WMTS服务时,通常应该先:

GetCapabilities

然后查看:

Service
Layer
TileMatrixSet
Format
CRS
TileMatrix

例如:

WMTS
 ↓
GetCapabilities
 ↓
Layer
 ↓
TileMatrixSet
 ↓
Matrix
 ↓
Tile规则

只有理解这些信息以后,客户端才能正确加载WMTS。

WMTS完整知识结构

可以这样理解:

WMTS
├── OGC标准
│
├── Layer
│   └── 地图图层
│
├── TileMatrixSet
│   └── 瓦片矩阵体系
│
├── TileMatrix
│   └── 一个Zoom级别
│
├── Tile
│   ├── TileRow
│   └── TileCol
│
├── CRS
│
├── Format
│
└── 操作
    ├── GetCapabilities
    └── GetTile

WMTS与其他GIS服务

可以建立下面的关系:

Web GIS Services
│
├── WMS
│   └── 地图图片
│
├── WMTS
│   └── 地图瓦片
│
├── WFS
│   └── 矢量Feature
│
├── WCS
│   └── 栅格覆盖数据
│
└── Vector Tile
    └── 矢量瓦片

可以简单记忆:

WMS
 ↓
我要这个范围的地图

WMTS
 ↓
我要这张地图瓦片

WFS
 ↓
我要这些矢量Feature

WCS
 ↓
我要这些栅格数据

Vector Tile
 ↓
我要这些矢量Tile

WMS与WMTS如何选择

如果需要:

实时渲染
动态样式
灵活BBOX

可以考虑:

WMS

如果需要:

高性能
高并发
缓存
快速缩放

可以考虑:

WMTS

如果需要:

客户端动态样式
矢量Geometry
交互

可以考虑:

Vector Tile

一个实际WebGIS架构

实际项目中经常同时使用多种服务:

                    WebGIS
                       │
        ┌──────────────┼──────────────┐
        ↓              ↓              ↓
      WMTS            WMS           WFS
        ↓              ↓              ↓
     底图瓦片        专题地图       矢量数据
        │              │              │
        └──────────────┼──────────────┘
                       ↓
                    地图应用

例如:

底图
 ↓
WMTS

污染区域
 ↓
WMS

道路Feature
 ↓
WFS

客户端
 ↓
OpenLayers

这是一种非常典型的WebGIS架构。

总结

WMTS(Web Map Tile Service)是一种基于瓦片提供地图的GIS服务标准。

核心思想是:

完整地图
    ↓
切成瓦片
    ↓
建立TileMatrix
    ↓
缓存
    ↓
客户端按需请求

WMTS最重要的概念包括:

Layer
TileMatrixSet
TileMatrix
TileRow
TileCol
CRS
Tile

最重要的操作包括:

GetCapabilities
    ↓
获取服务信息

GetTile
    ↓
获取具体地图瓦片

可以记住:

WMS按照地图范围生成地图,WMTS按照瓦片编号提供地图。

进一步理解:

WMS
 ↓
动态地图图片

WMTS
 ↓
缓存地图瓦片

WFS
 ↓
矢量Feature

WCS
 ↓
栅格数据

Vector Tile
 ↓
矢量地图瓦片

因此WMTS是现代WebGIS中非常重要的高性能地图瓦片服务技术,特别适合在线底图、影像地图、专题地图以及需要大量用户并发访问的地图系统。

🧰

相关工具

使用 IYATools 在线工具快速处理 GIS 数据