二维地图底图几乎都是「瓦片」:按缩放级别把地图切成 256×256(或 512×512)像素的小图片,用「级别 z、列号 x、行号 y」定位。WMTS、TMS、XYZ 是三种常见的瓦片访问约定,底层瓦片可以完全相同,区别在于怎么描述服务、怎么拼地址、行号从哪边开始数。
三者对比 #
| 对比项 | WMTS | TMS | XYZ |
|---|---|---|---|
| 规范来源 | OGC 标准 | OSGeo 规范 | 业界事实约定(OSM、主流在线地图) |
| 能力描述 | 有 GetCapabilities 文档 | 有 TileMap 描述文档 | 无,靠约定 |
| 行号起点 | 左上角 | 左下角 | 左上角 |
| 支持的坐标系 | 可在能力文档中声明多种矩阵集 | 可声明 | 通常是 Web 墨卡托 |
| 典型地址 | …?SERVICE=WMTS&REQUEST=GetTile&TILEMATRIX={z}&TILEROW={y}&TILECOL={x} 或 REST 风格 | /{z}/{x}/{y}.png | /{z}/{x}/{y}.png |
| 适合场景 | 政务、专网 GIS 平台,需要标准接入 | 部分开源工具链 | Web 前端地图库最省事 |
最容易踩的坑:TMS 与 XYZ 的行号方向相反 #
TMS 的行号从下往上数,XYZ 从上往下数。同一张瓦片,在第 z 级的行号换算关系是:
y_tms = 2^z − 1 − y_xyz
如果把 TMS 服务当成 XYZ 接入,地图会出现「南北颠倒、拼接错乱」。很多前端地图库提供翻转 y 的选项(例如地址模板里的 {-y}),或者直接让服务端同时提供两种地址。
坐标系:墨卡托与经纬度瓦片 #
- Web 墨卡托(EPSG:3857):主流在线地图与大多数前端地图库默认使用;
- 经纬度(地理坐标,如 CGCS2000 / EPSG:4490 或 WGS84 / EPSG:4326):很多政务 GIS 平台使用。
以天地图为例,它同时提供经纬度投影和球面墨卡托投影两套瓦片(图层名分别以 _c 与 _w 结尾),接入时要和前端地图使用的坐标系保持一致。两套瓦片混用会导致叠加偏移,这是项目里最常见的底图问题之一。
怎么选 #
- 对接政务平台、需要标准能力文档:发布 WMTS;
- 前端用 Leaflet、OpenLayers、MapLibre 等快速开发:XYZ 最简单;
- 现有工具链只认 TMS:注意行号方向;
- 内网、专网项目:把三种地址都发布出来,接入方按需选择,最省沟通成本。
常见问题 #
WMTS 和 WMS 有什么区别? #
WMS 按请求范围实时渲染出一张图,灵活但服务端压力大;WMTS 返回预先切好的瓦片,访问快、易缓存,适合作为底图。两者都是 OGC 标准。
为什么地图瓦片接入后上下颠倒或拼接错乱? #
大概率是把 TMS 服务按 XYZ 方式接入(或反过来)。两者的行号方向相反,按公式 y_tms = 2^z − 1 − y_xyz 换算,或在地图库中开启翻转行号的选项即可。
底图和业务数据叠加后有偏移怎么办? #
先确认三件事:底图瓦片的投影(墨卡托还是经纬度)、业务数据的坐标系、前端地图的投影设置。三者不一致就会偏移;国内部分在线地图还使用了加密坐标,需要按相应规则处理。
内网环境能不能用这些瓦片服务? #
可以。把瓦片离线存储到内网服务器,再以 WMTS、TMS、XYZ 方式发布,内网 GIS 系统就能像访问在线地图一样使用。使用第三方地图数据时需要遵守数据源的服务条款和相关法规。
