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服务器
↓
读取瓦片
↓
图片
核心区别:
| 特性 | WMS | WMTS |
|---|---|---|
| 返回 | 地图图片 | 地图瓦片 |
| 请求方式 | BBOX | Tile坐标 |
| 渲染 | 通常实时 | 通常预先切片/缓存 |
| 灵活性 | 高 | 相对固定 |
| 性能 | 中等 | 高 |
| 缓存 | 可以 | 非常适合 |
| 大规模访问 | 压力较大 | 更适合 |
| 地图平移 | 重新请求 | 请求相邻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的区别
| 特性 | WMTS | XYZ |
|---|---|---|
| 标准 | 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
↓
客户端渲染
因此:
| 特性 | WMTS | Vector Tile |
|---|---|---|
| Tile内容 | 图片 | Geometry |
| 常见格式 | PNG/JPEG | PBF |
| 客户端样式 | 较弱 | 很强 |
| 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 数据