首页 GIS基础理论 MBTiles制作:服务器、矢量瓦片和转PMTiles

MBTiles制作:服务器、矢量瓦片和转PMTiles

作者: GIS研习社 更新时间:2026-05-31 18:13:50 分类:GIS基础理论

MBTiles制作:先解决离线瓦片交付问题

MBTiles 常用于把一组地图瓦片打包成单个文件,方便离线交付、内网部署和移动端使用。本文按真实项目流程讲清楚 MBTiles制作MBTiles服务器MBTiles矢量瓦片MBTiles转PMTiles:先判断瓦片类型,再生成文件,最后选择服务发布或静态分发。

先给结论:固定样式的底图适合做栅格瓦片,需要前端动态改样式的业务图层适合做矢量瓦片;如果部署在内网,用服务读取文件很直接;如果要放到对象存储或 CDN,转换为 PMTiles 往往更省维护。

MBTiles制作离线瓦片流程图
从源数据生成瓦片包,再根据部署环境选择服务发布或 PMTiles 静态分发。

问题背景:为什么一个瓦片包比一堆目录更好交付

普通 XYZ 瓦片通常是大量 z/x/y.png 文件。文件数量一多,复制、压缩、校验和同步都会变慢。MBTiles 把瓦片内容和元数据放进 SQLite 数据库中,交付时只有一个 .mbtiles 文件,特别适合离线地图、现场调查、内网 WebGIS 和教学演示。

要注意,MBTiles 只是容器,不是地图样式本身。它可以存 pngjpg 这样的栅格瓦片,也可以存 pbf 格式的矢量瓦片。制作前先把需求说清楚,比后面反复返工更重要。

核心原理:MBTiles 是瓦片索引数据库

一个典型文件会包含 metadata 表和 tiles 表。前者保存名称、范围、中心点、最小缩放级别、最大缩放级别和格式;后者保存缩放级别、列号、行号和瓦片二进制内容。前端请求某个 z/x/y,服务端就去数据库里取对应记录。

新手最常见的问题是行号规则。很多 WebGIS 使用 XYZ 规则,原点在左上角;而 MBTiles 中的 tile_row 常按 TMS 规则理解,原点在左下角。如果自己写接口,需要做一次 Y 值转换。

tms_y = (1 << z) - 1 - xyz_y

如果地图上下错位、局部 404、范围看起来正确但瓦片对不上,先检查这个转换,再检查坐标系和数据范围。

制作步骤:先跑通小范围样本

1. 选择栅格还是矢量

固定制图结果、标注和配色已经在 QGIS 里调好时,选栅格更简单;前端需要按属性控制颜色、开关图层或适配多套样式时,选矢量更灵活。不要一开始就全区全级别切片,先用一小块范围验证输出和加载。

2. 用 QGIS 生成栅格瓦片包

  1. 在 QGIS 中整理图层顺序、符号、标注和透明度。
  2. 把项目坐标系设置为 EPSG:3857,并确认源数据有正确 CRS。
  3. 选择生成 XYZ 瓦片的 MBTiles 输出方式,设置范围、最小级别和最大级别。
  4. 选择 pngjpg 或其他合适格式,再输出到目标文件。
  5. 用桌面工具或本地瓦片服务检查是否有空白、偏移、模糊和级别过多问题。

缩放级别不要盲目设高。每增加一级,瓦片数量都会明显增加。省域专题图、城市路网、园区底图的合理级别并不一样,应该由业务可见尺度决定。

MBTiles矢量瓦片:Tippecanoe 生成和检查

如果源数据是 GeoJSON、NDJSON 或从 PostGIS 导出的要素,可以用 Tippecanoe 生成 pbf 瓦片。快速测试时可以先让工具自动估算级别,确认图层能正常显示后,再细化字段、级别和简化策略。

tippecanoe -o city.mbtiles -zg --drop-densest-as-needed roads.geojson

生产项目建议明确图层名和级别范围,例如道路图层可以这样开始:

tippecanoe -o roads.mbtiles -Z 5 -z 14 -l roads --drop-densest-as-needed roads.geojson

生成后重点检查 formatboundsminzoommaxzoom 和 source layer 名称。很多矢量瓦片请求返回 200,但页面空白,原因是样式文件里的图层名和文件里的图层名不一致。

MBTiles服务器:把文件发布给 WebGIS

MBTiles服务器 的作用是把数据库里的瓦片转换成浏览器能请求的 URL。栅格瓦片通常暴露为图片地址,矢量瓦片通常暴露为 pbf 地址。前端不应该直接读取本地 SQLite 文件,而是通过服务接口访问。

http://localhost:8080/tiles/{z}/{x}/{y}.png
http://localhost:8080/tiles/{z}/{x}/{y}.pbf

部署时要检查响应类型、压缩方式、跨域、缓存和 Y 行号转换。Leaflet 加载栅格瓦片较简单;OpenLayers、MapLibre GL JS 等加载矢量瓦片时,还需要正确的数据源、样式和 source layer 配置。

MBTiles转PMTiles:适合静态托管的转换路线

MBTiles转PMTiles 的目的,是把需要服务端读取 SQLite 的瓦片包,变成更适合 HTTP 范围请求的单文件归档。这样文件可以放在静态网站、对象存储或 CDN 上,由支持 PMTiles 的前端库按需读取片段。

pmtiles convert city.mbtiles city.pmtiles

转换不会自动修复旧问题。坐标系错、图层名错、属性字段过多、缩放级别不合理,都会原样带到新文件里。转换后仍然要打开前端页面,检查范围、级别、样式和加载请求。

常见坑:文件生成成功但地图打不开

坐标系和范围没有提前统一

Web 瓦片通常围绕 EPSG:3857 工作。地方投影、未定义 CRS 或错误的经纬度字段,会导致输出范围异常或叠加偏移。切片前先在 QGIS 里检查图层 CRS、项目 CRS 和数据范围。

最大缩放级别设置过高

文件过大、生成很慢、浏览器卡顿,往往不是工具问题,而是级别设置超出业务需要。先确定用户实际要看多细,再设置最大级别。

样式文件和图层名不一致

矢量瓦片的样式依赖 source layer。命令里写的是 roads,样式里却写成 road,瓦片会正常返回,但要素不会显示。

服务响应头不正确

图片瓦片、矢量瓦片和压缩内容需要匹配的响应头。只看到 HTTP 200 不够,还要在浏览器开发者工具里看内容类型、编码和控制台报错。

工具和方法对比

方案 适合场景 优势 限制
栅格 MBTiles 离线底图、固定专题图、移动端交付 加载简单,样式所见即所得 改样式通常要重新切片
矢量 MBTiles 动态样式、分图层渲染、属性驱动制图 样式灵活,适合 WebGIS 交互 需要样式文件和支持矢量瓦片的前端引擎
瓦片服务发布 内网部署、本地开发、统一接口 容易兼容常见 z/x/y URL 需要维护服务进程、端口、缓存和跨域
PMTiles 静态分发 对象存储、CDN、静态网站 减少后端维护,便于单文件分发 前端和工具链要支持 PMTiles

实践检查清单

  • 源数据 CRS、项目 CRS 和切片目标 CRS 已确认。
  • boundscenterminzoommaxzoom 合理。
  • 栅格格式和服务端响应类型一致。
  • 矢量 source layer 名称和前端样式一致。
  • 服务端正确处理 XYZ 与 TMS 的 Y 行号差异。
  • 跨域、缓存、压缩和响应头已经在浏览器中验证。
  • 完整生成前,已经用小范围样本测试通过。

FAQ:制作、发布和转换常见问题

MBTiles制作时应该选栅格还是矢量?

固定样式、只浏览地图时选栅格;需要前端动态改颜色、开关图层或按属性渲染时选矢量。教学和项目交付中,建议先做小范围样本比较体积、清晰度和加载体验。

MBTiles服务器能不能直接部署到公网?

可以,但要按正式服务配置 HTTPS、反向代理、CORS、缓存、访问控制和日志。只做公开静态分发时,也可以评估 PMTiles 路线,减少服务维护。

MBTiles矢量瓦片 请求成功但页面空白怎么办?

先检查样式文件里的 source layer 名称,再检查响应头和压缩方式。请求成功只说明服务器返回了内容,不代表前端能正确解析并渲染。

MBTiles转PMTiles 会自动提升加载速度吗?

不会自动提升。它主要改变存储和访问方式,适合静态托管和范围请求。实际速度仍取决于瓦片大小、级别设置、属性字段、缓存和前端渲染能力。

总结:先选瓦片类型,再选发布方式

MBTiles 的核心价值是把瓦片和元数据打包成一个便于交付的文件。实战中先决定栅格或矢量,再小范围验证制作参数,最后根据部署环境选择服务发布或 PMTiles 静态分发。只要坐标系、缩放级别、图层名、元数据和 URL 规则检查到位,这条流程就能稳定支撑离线地图和 WebGIS 项目。

相关文章