XYZ瓦片是什么
XYZ是一种非常常见的Web地图瓦片访问方式。
它通过三个参数:
Z
X
Y
确定一张地图瓦片的位置。
通常使用类似下面的URL:
/{z}/{x}/{y}.png
例如:
/10/843/412.png
可以理解为:
Z = 10
X = 843
Y = 412
它们共同确定一张地图Tile。
简单来说:
XYZ就是通过缩放级别Z、列X和行Y定位地图瓦片的一种常见URL规则。
XYZ解决什么问题
一张完整的世界地图非常大。
如果每次都让服务器返回完整地图:
用户
↓
请求整个世界地图
↓
服务器生成巨大图片
↓
返回
效率非常低。
因此Web地图通常会将地图切成很多小Tile:
完整地图
↓
切成很多Tile
↓
客户端只加载当前视野需要的Tile
XYZ就是帮助客户端定位这些Tile的一种方式。
XYZ的基本结构
XYZ最核心的结构是:
Z
X
Y
分别表示:
Z
↓
Zoom
缩放级别
X
↓
Column
列
Y
↓
Row
行
因此:
XYZ
├── Z → 缩放级别
├── X → 列
└── Y → 行
XYZ URL
最常见的XYZ URL模板:
https://example.com/{z}/{x}/{y}.png
例如:
https://example.com/10/843/412.png
对应:
Z = 10
X = 843
Y = 412
服务器根据这三个数字找到对应Tile。
Z是什么
Z表示Zoom,也就是地图缩放级别。
例如:
Z = 0
表示世界范围非常大。
随着Z增加:
Z = 1
Z = 2
Z = 3
Z = 4
...
地图越来越详细。
可以理解为:
Z越小
↓
范围越大
↓
细节越少
而:
Z越大
↓
范围越小
↓
细节越多
Z=0
在经典Web Mercator XYZ体系中:
Z = 0
整个世界通常使用一张Tile覆盖。
可以理解为:
┌──────────────────────┐
│ │
│ World │
│ │
└──────────────────────┘
Tile数量:
1 × 1
即:
X = 0
Y = 0
Z=1
当:
Z = 1
地图被划分为:
2 × 2
即:
┌──────┬──────┐
│ 0,0 │ 1,0 │
├──────┼──────┤
│ 0,1 │ 1,1 │
└──────┴──────┘
共有:
4
张Tile。
Z=2
当:
Z = 2
地图被划分为:
4 × 4
共有:
16
张Tile。
结构:
┌──┬──┬──┬──┐
│ │ │ │ │
├──┼──┼──┼──┤
│ │ │ │ │
├──┼──┼──┼──┤
│ │ │ │ │
├──┼──┼──┼──┤
│ │ │ │ │
└──┴──┴──┴──┘
XYZ瓦片数量
经典XYZ瓦片体系中:
每个方向的Tile数量 = 2^Z
因此:
Z = 0
2^0 = 1
Z = 1
2^1 = 2
Z = 2
2^2 = 4
Z = 3
2^3 = 8
所以整个世界的Tile数量:
2^Z × 2^Z
也就是:
4^Z
例如:
| Zoom | X方向 | Y方向 | Tile总数 |
|---|---|---|---|
| 0 | 1 | 1 | 1 |
| 1 | 2 | 2 | 4 |
| 2 | 4 | 4 | 16 |
| 3 | 8 | 8 | 64 |
| 4 | 16 | 16 | 256 |
| 5 | 32 | 32 | 1024 |
| 10 | 1024 | 1024 | 1,048,576 |
因此Zoom增加后,Tile数量会快速增长。
X是什么
X表示Tile的列编号。
例如:
Z = 2
一共有:
4列
那么:
X = 0
X = 1
X = 2
X = 3
对应从左到右的Tile。
X
↓
┌────┬────┬────┬────┐
│ 0 │ 1 │ 2 │ 3 │
└────┴────┴────┴────┘
因此:
X通常表示从左向右的Tile列编号。
Y是什么
Y表示Tile的行编号。
例如:
Z = 2
共有:
4行
因此:
Y = 0
Y = 1
Y = 2
Y = 3
通常从顶部向下增加:
Y
↓
┌────┐
│ 0 │
├────┤
│ 1 │
├────┤
│ 2 │
├────┤
│ 3 │
└────┘
因此:
XYZ中的Y通常从地图顶部向下增加。
XYZ坐标结构
一个完整Tile可以表示为:
Tile
├── Z
│ └── Zoom
│
├── X
│ └── Column
│
└── Y
└── Row
例如:
Z = 10
X = 843
Y = 412
完整表示:
10 / 843 / 412
XYZ与经纬度
XYZ的X/Y并不是经纬度。
例如:
116.397
39.908
属于地理坐标。
而:
843
412
是Tile坐标。
两者之间需要通过地图投影和Tile计算进行转换。
通常Web地图使用:
EPSG:3857
然后将:
经纬度
↓
Web Mercator
↓
Pixel
↓
Tile X/Y
经纬度到XYZ
基本流程:
Longitude
Latitude
↓
EPSG:3857
↓
World Pixel
↓
Tile X
Tile Y
例如:
经度
纬度
经过投影以后,可以计算:
X
Y
再结合:
Z
确定Tile。
XYZ与Tile Pixel
Tile坐标和像素坐标不是一回事。
例如Tile大小为:
256 × 256
某个地图位置可能对应:
Pixel X = 215832
Pixel Y = 103928
那么:
Tile X = floor(Pixel X / 256)
Tile Y = floor(Pixel Y / 256)
同时可以得到Tile内部像素位置:
Pixel X % 256
Pixel Y % 256
因此:
World Pixel
↓
Tile X / Tile Y
+
Tile内部Pixel
Tile大小
常见XYZ Tile尺寸:
256 × 256
也有:
512 × 512
例如:
┌──────────────────┐
│ │
│ Tile │
│ │
└──────────────────┘
256 × 256
Tile尺寸会影响:
请求数量
图片大小
渲染性能
网络传输
XYZ瓦片金字塔
XYZ通常采用瓦片金字塔:
Z0
┌─┐
Z1
┌──┬──┐
Z2
┌──┬──┬──┬──┐
Z3
┌──┬──┬──┬──┬──┬──┬──┬──┐
随着Zoom增加:
Tile越来越多
同时:
地图范围越来越小
因此:
Zoom
↓
Tile Matrix
↓
X / Y
↓
Tile
XYZ地图加载过程
用户打开地图:
打开地图
↓
确定中心点
↓
确定Zoom
↓
计算当前视野范围
↓
计算需要的Tile X/Y
↓
生成XYZ URL
↓
请求Tile
↓
浏览器拼接Tile
↓
显示地图
例如当前需要:
/10/842/411.png
/10/843/411.png
/10/844/411.png
/10/842/412.png
/10/843/412.png
/10/844/412.png
客户端将这些Tile拼接起来:
┌──────┬──────┬──────┐
│ Tile │ Tile │ Tile │
├──────┼──────┼──────┤
│ Tile │ Tile │ Tile │
└──────┴──────┴──────┘
形成用户看到的完整地图。
XYZ为什么速度快
XYZ地图的核心优势之一就是:
Tile可以缓存
例如:
用户
↓
浏览器缓存
↓
CDN
↓
Tile Server
当用户再次访问同一Tile:
请求
↓
Cache
↓
直接返回
不需要重新渲染整张地图。
XYZ与Raster Tile
传统XYZ通常返回Raster Tile。
例如:
/10/843/412.png
服务器返回:
PNG
也可能是:
JPEG
因此:
XYZ
↓
Raster Tile
↓
PNG / JPEG
这是非常常见的Web地图底图形式。
XYZ与Vector Tile
XYZ也可以用于访问Vector Tile。
例如:
/{z}/{x}/{y}.pbf
返回:
PBF
这时:
XYZ
↓
Vector Tile
↓
PBF
客户端拿到的不是图片,而是矢量数据。
因此:
Raster XYZ
↓
PNG / JPEG
Vector Tile
↓
PBF
Raster XYZ
Raster XYZ最常见。
例如:
https://example.com/{z}/{x}/{y}.png
服务器返回:
PNG图片
优点:
- 简单
- 兼容性好
- 加载快
- 适合底图
- 容易缓存
缺点:
- 客户端无法直接获取Geometry
- 样式修改不灵活
- 放大到高Zoom后图片可能出现像素化
Vector XYZ
Vector Tile可以使用:
https://example.com/{z}/{x}/{y}.pbf
客户端获取:
Point
LineString
Polygon
然后自己渲染。
优势:
客户端动态样式
+
Geometry交互
+
数据属性
+
高质量缩放
因此现代WebGIS越来越多使用Vector Tile。
XYZ与WMTS
XYZ和WMTS都可以提供地图瓦片。
但是两者定位不同。
XYZ:
/{z}/{x}/{y}.png
非常简单。
WMTS:
Layer
TileMatrixSet
TileMatrix
TileRow
TileCol
更加标准化。
可以理解为:
XYZ
↓
简单的Tile URL规则
而:
WMTS
↓
完整的OGC瓦片服务标准
XYZ与WMTS对比
| 特性 | XYZ | WMTS |
|---|---|---|
| 类型 | Tile URL约定 | OGC服务标准 |
| URL | z/x/y | 标准化请求 |
| GetCapabilities | 通常没有 | 有 |
| TileMatrixSet | 通常没有 | 有 |
| 使用难度 | 低 | 较高 |
| Web地图 | 非常常用 | 常用 |
| 配置 | 简单 | 完整 |
| 服务描述 | 简单 | 完整 |
因此Web开发中经常直接使用XYZ:
/{z}/{x}/{y}.png
而政府、测绘、专业GIS服务中经常会遇到WMTS。
XYZ与TMS
XYZ和TMS都使用:
Z
X
Y
但是最容易产生问题的是:
Y轴方向
XYZ通常:
Y从顶部向下
TMS常见:
Y从底部向上
因此:
XYZ Y
↓
Top → Bottom
而某些TMS:
TMS Y
↓
Bottom → Top
如果把TMS当XYZ使用:
Tile位置错误
甚至可能导致整个地图无法正确显示。
TMS与XYZ Y转换
在相同Zoom下,如果采用典型的TMS与XYZ Y轴翻转规则:
TMS_Y = (2^Z - 1) - XYZ_Y
例如:
Z = 3
则:
2^3 - 1 = 7
如果:
XYZ_Y = 2
那么:
TMS_Y = 7 - 2
= 5
所以:
XYZ
Y = 2
对应:
TMS
Y = 5
XYZ与OpenLayers
OpenLayers可以加载XYZ Tile。
基本结构:
Map
↓
TileLayer
↓
XYZ Source
↓
Tile Server
例如:
XYZ
↓
/{z}/{x}/{y}.png
OpenLayers负责:
计算当前视野
↓
计算Tile
↓
请求Tile
↓
拼接显示
XYZ与Leaflet
Leaflet对XYZ Tile支持非常简单。
典型逻辑:
Leaflet
↓
TileLayer
↓
XYZ URL
例如:
/{z}/{x}/{y}.png
Leaflet会自动根据:
地图中心
Zoom
视野范围
计算需要的Tile。
XYZ与Cesium
Cesium也可以使用Tile服务作为影像底图。
结构可以理解为:
Cesium
↓
Imagery Layer
↓
Tile Provider
↓
XYZ / Tile Server
不过Cesium使用的具体Tile坐标体系可能与普通XYZ服务存在差异,因此接入第三方服务时需要确认:
Projection
Tile Scheme
X/Y方向
Zoom
Tile Size
XYZ常见图片格式
常见:
PNG
JPEG
WebP
例如:
/{z}/{x}/{y}.png
或者:
/{z}/{x}/{y}.jpg
也可能:
/{z}/{x}/{y}.webp
PNG
适合:
- 透明地图
- 道路
- 专题地图
- 线划地图
JPEG
适合:
- 卫星影像
- 航空影像
- 照片类底图
WebP
适合:
- Web地图
- 需要降低网络传输量的场景
XYZ中的NoData Tile
某些Tile范围内可能没有数据。
例如:
海洋
空白区域
服务器可能返回:
空白Tile
或者:
404
客户端通常需要正确处理这些情况。
XYZ缓存
XYZ非常适合缓存。
典型架构:
用户
↓
CDN
↓
Tile Cache
↓
Tile Server
↓
GIS数据
对于热门Tile:
请求
↓
CDN Cache Hit
↓
直接返回
因此可以支持非常高的访问量。
XYZ的目录结构
服务器上的Tile经常按照:
z/x/y
组织。
例如:
tiles/
├── 0/
│ └── 0/
│ └── 0.png
│
├── 1/
│ ├── 0/
│ │ ├── 0.png
│ │ └── 1.png
│ │
│ └── 1/
│ ├── 0.png
│ └── 1.png
│
└── 2/
├── 0/
├── 1/
├── 2/
└── 3/
这种结构非常容易被:
Nginx
CDN
对象存储
直接提供。
XYZ与CDN
由于Tile通常是静态资源:
PNG
JPEG
WebP
PBF
非常适合部署到CDN。
例如:
用户
↓
CDN
↓
Tile
可以减少GIS服务器压力。
因此大型地图系统通常会重点优化:
Tile Cache
+
CDN
+
浏览器缓存
XYZ的优点
1. 简单
只需要:
Z
X
Y
即可定位Tile。
2. 容易实现
服务器甚至不需要复杂GIS服务。
只需要:
URL
↓
对应文件
即可提供Tile。
3. 性能高
Tile可以直接缓存。
4. 适合Web地图
OpenLayers、Leaflet等前端地图框架都支持Tile地图。
5. 适合CDN
静态Tile可以部署到:
CDN
对象存储
Nginx
XYZ的缺点
1. 标准化程度低
XYZ本身更像是一种通用约定,而不是完整的GIS服务标准。
2. 服务描述信息少
通常只有:
/{z}/{x}/{y}
不像WMTS可以通过Capabilities描述:
Layer
CRS
TileMatrixSet
Format
Scale
3. 坐标体系可能不一致
看到:
/{z}/{x}/{y}
不能完全保证:
EPSG:3857
必须查看服务说明。
4. Y轴规则需要确认
不能把所有:
z/x/y
都默认理解成完全相同的Tile Scheme。
XYZ常见问题
1. 地图上下颠倒
通常是:
XYZ
和:
TMS
Y轴规则不同导致。
2. Tile位置错位
可能是:
CRS不一致
TileMatrix不一致
Origin不一致
导致。
3. 地图整体偏移
常见原因:
EPSG:4326
和:
EPSG:3857
混用。
4. Tile加载404
可能是:
URL模板错误
Z/X/Y超出范围
Tile文件不存在
5. 地图缩放级别不一致
不同服务的Zoom定义可能存在差异。
因此接入服务时最好确认:
minZoom
maxZoom
tileSize
projection
tileScheme
XYZ完整工作流程
可以将XYZ理解成:
用户
↓
地图中心 + Zoom
↓
计算当前视野
↓
计算Tile范围
↓
计算Z/X/Y
↓
生成Tile URL
↓
请求服务器
↓
返回Tile
↓
缓存
↓
拼接显示
XYZ与GIS数据的关系
XYZ本身不是GIS原始数据格式。
它是:
地图数据
↓
切片
↓
Tile
↓
XYZ访问
例如:
Shapefile
GeoJSON
PostGIS
GeoPackage
↓
地图服务器
↓
渲染 / 切片
↓
XYZ Tile
因此:
XYZ解决的是地图数据如何按Tile被访问,而不是原始空间数据如何存储。
XYZ与Feature
XYZ Raster Tile:
Tile
↓
PNG
↓
像素
客户端无法直接获得:
Feature
Geometry
Attributes
而Vector Tile:
Tile
↓
Vector Features
↓
Geometry + Properties
因此如果需要地图上的:
点击道路
查询属性
高亮区域
动态改变样式
通常Vector Tile更合适。
XYZ与Vector Tile结合
现代WebGIS中可以:
/{z}/{x}/{y}.pbf
例如:
Vector Tile
↓
PBF
↓
Point
LineString
Polygon
↓
客户端渲染
这种方式可以同时获得:
Tile缓存优势
+
矢量数据
+
客户端样式
+
地图交互
XYZ知识结构
可以这样理解:
XYZ
├── Z
│ └── Zoom
│
├── X
│ └── Column
│
├── Y
│ └── Row
│
├── Tile
│ ├── PNG
│ ├── JPEG
│ ├── WebP
│ └── PBF
│
├── Tile Pyramid
│
├── Projection
│ └── 常见EPSG:3857
│
└── URL
└── /{z}/{x}/{y}
XYZ、TMS、WMTS、Vector Tile总结
| 技术 | 核心概念 | 常见内容 |
|---|---|---|
| XYZ | Z/X/Y瓦片URL | PNG/JPEG |
| TMS | Tile服务规范 | Raster Tile |
| WMTS | OGC瓦片服务标准 | PNG/JPEG |
| Vector Tile | 矢量瓦片 | PBF |
| WMS | 按范围生成地图 | PNG/JPEG |
可以简单记忆:
XYZ
↓
简单Tile URL
TMS
↓
Tile服务规范
WMTS
↓
OGC标准Tile服务
Vector Tile
↓
矢量数据Tile
WMS
↓
动态地图图片
总结
XYZ是现代WebGIS中最常见的地图瓦片访问方式之一。
它使用:
Z
X
Y
定位Tile:
Z
↓
Zoom
X
↓
Column
Y
↓
Row
典型URL:
/{z}/{x}/{y}.png
例如:
/10/843/412.png
表示:
Zoom = 10
Column = 843
Row = 412
经典Web Mercator XYZ体系中:
每个方向Tile数量 = 2^Z
因此:
Z越大
↓
Tile数量越多
↓
地图越详细
XYZ最大的优势是:
简单
+
高性能
+
容易缓存
+
适合CDN
+
适合Web地图
需要特别注意:
CRS
Tile Size
Zoom
X/Y规则
TMS与XYZ差异
最终可以记住:
XYZ就是用Z(缩放级别)、X(列)、Y(行)定位地图Tile的一种简单而常用的WebGIS瓦片访问方式。
相关工具
使用 IYATools 在线工具快速处理 GIS 数据