彻底理解MBTiles坐标系统:TMS与XYZ瓦片方案的5个关键差异

📅 2026/8/19 19:22:27
彻底理解MBTiles坐标系统:TMS与XYZ瓦片方案的5个关键差异
彻底理解MBTiles坐标系统TMS与XYZ瓦片方案的5个关键差异【免费下载链接】mbtiles-specspecification documents for the MBTiles tileset format项目地址: https://gitcode.com/gh_mirrors/mb/mbtiles-spec️ 第一次打开 MBTiles 文件时很多人都会被奇怪的行号搞晕明明地图左上角的瓦片应该是 (z, x, 0)数据库里却怎么也查不到答案就藏在MBTiles 坐标系统里。MBTiles 是一种把瓦片地图数据打包进 SQLite 数据库的规范这类文件被称为 tileset它通过tiles表中的zoom_level、tile_column、tile_row三列定位每一张瓦片而tile_row遵循的是 TMSTile Map Service规则与前端常用的XYZ 瓦片方案恰好相反。本文面向新手用 5 个关键差异帮你彻底搞懂这两套坐标方案从此读写 MBTiles 不再翻车。MBTiles坐标系统入门z/x/y 与全球墨卡托投影在理解差异之前先建立共同语言。任何瓦片地图都会把世界按缩放级别zoom切成一个个小方块zoom 每增加 1瓦片数量变为原来的 4 倍第 z 级共有 2^z × 2^z 张瓦片每张瓦片用三个数字定位z缩放级别、x列号、y行号。MBTiles 强制使用全球墨卡托投影global-mercator即 Spherical Mercator投影后的世界恰好是一个正方形因此正方形切瓦片的规则天然成立。此外metadata表中的minzoom、maxzoom声明瓦片覆盖的缩放级别bounds用经纬度WGS84格式为 left,bottom,right,top声明覆盖范围——这些细节在规范文档1.3/spec.md中有完整定义。 两个方案共享同一套 z/x/y 结构唯一的本质区别是行号 y 怎么数。TMS与XYZ瓦片方案区别详解5个关键差异差异一Y轴方向与坐标原点相反XYZ 方案原点在左上角西北角y 向下向南递增第 0 行在顶部TMS 方案原点在左下角西南角y 向上向北递增第 0 行在底部。一句话记忆XYZ 从上往下数TMS 从下往上数。对比项TMSXYZ坐标原点左下角西南左上角西北Y 轴递增方向向北向上向南向下第 0 行的位置地图底部地图顶部行号范围0 ~ 2^z − 1自底向上0 ~ 2^z − 1自顶向下差异二TMS XYZ换算公式只需一行两套方案的x 列号完全相同唯一需要换算的是行号公式简单到一行TMS 行号 2^z − 1 − XYZ 行号例如 z3 时有 8 行XYZ 的第 0 行对应 TMS 的第 7 行。这个翻转flip规则正是规范文档1.3/spec.md中明确给出的核心换算公式。差异三MBTiles存储用TMS瓦片URL用XYZ这是新手最容易困惑的地方MBTiles 文件里存的是 TMS 行号而浏览器请求瓦片时用的是 XYZ 行号。场景使用的坐标方案MBTiles 数据库tiles表的tile_rowTMS规范强制瓦片请求 URL如/{z}/{x}/{y}.pngOSM 风格XYZLeaflet、OpenLayers 等前端渲染XYZTMS 风格服务 URL如/1.0.0/world/{z}/{x}/{y}.pngTMS1.1/interaction.md中同时给出了 TMS 风格与 OSM 风格两种 URL 的示例对照阅读会非常直观。这也解释了为什么直接查看数据库行号会觉得顺序是反的——因为它本来就不是为 URL 设计的。差异四两套方案的历史渊源不同TMS是 OSGeo 于 2006 年前后提出的 Tile Map Service 规范MBTiles 从 1.0 到 1.3 一直沿用它的 global-mercator profileXYZ没有官方规范名称通常被称为 Slippy Map滑动地图命名约定因 Google Maps 普及、并被 OpenStreetMap 沿用而成为事实标准。所以 MBTiles 选择 TMS 是继承规范而前端生态普遍采用 XYZ 是跟随主流两套方案共存是历史演进的客观结果。差异五工具默认坐标方案不同谨防踩坑不同工具对坐标方案的默认值并不一致这是实践中最常见的坑工具 / 库默认方案LeafletL.tileLayerXYZmbutilMBTiles 导入导出工具按 TMS 处理gdal2tiles默认 XYZ可用--tmscompatible切换为 TMS工具默认值没配对时最典型的两种症状是⚠️地图上下颠倒行号刚好差一次翻转⚠️地图渲染空白行号整体错位请求的瓦片根本不存在。排查时先确认你的瓦片 URL 用哪套方案再决定是否对行号做翻转。实战演示XYZ瓦片 11/327/791 的MBTiles行号换算以规范文档1.3/spec.md中的官方例子为例。前端以 XYZ 请求的瓦片11/327/791在 MBTiles 数据库中存储为zoom_level 11tile_column 327与 XYZ 的 x 相同tile_row 1256计算过程如下z112^11 2048tile_row 2^11 − 1 − 791 2048 − 1 − 791 1256反过来从数据库读到tile_row 1256时前端要请求的 XYZ 行号是2048 − 1 − 1256 791。列号 x 始终不变记住这一点就成功了一半。新手自查如何快速判断你的瓦片坐标方案✅ 数据库行号从下往上递增 → 是 TMS正常现象 ✅ 行号从上往下递增 → 是 XYZ读取时记得翻转 ✅ 地图上下颠倒 → 行号少翻转了一次检查换算公式 ✅ 地图空白但文件大小正常 → 大概率是行号整体错位 ✅ 不确定时可用 2^z − 1 这个最大行号做交叉验证。总结记住MBTiles坐标系统这一个公式就够了MBTiles 坐标系统的核心就一句话MBTiles 用 TMS 存储Web 前端用 XYZ 请求二者只差一个行号翻转公式2^z − 1 − y。理解了这 5 个关键差异无论是读取离线瓦片、编写导入导出脚本还是排查上下颠倒的地图你都能快速定位问题。想深入研读的同学建议直接阅读仓库中的1.3/spec.md当前版本、1.2/spec.md与1.1/interaction.md并通过CHANGELOG.md了解各版本演进——官方规范文档永远是最权威的依据。【免费下载链接】mbtiles-specspecification documents for the MBTiles tileset format项目地址: https://gitcode.com/gh_mirrors/mb/mbtiles-spec创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考