MBTiles制作:服务器、矢量瓦片和转PMTiles
MBTiles制作:先解决离线瓦片交付问题
MBTiles 常用于把一组地图瓦片打包成单个文件,方便离线交付、内网部署和移动端使用。本文按真实项目流程讲清楚 MBTiles制作、MBTiles服务器、MBTiles矢量瓦片 和 MBTiles转PMTiles:先判断瓦片类型,再生成文件,最后选择服务发布或静态分发。
先给结论:固定样式的底图适合做栅格瓦片,需要前端动态改样式的业务图层适合做矢量瓦片;如果部署在内网,用服务读取文件很直接;如果要放到对象存储或 CDN,转换为 PMTiles 往往更省维护。
问题背景:为什么一个瓦片包比一堆目录更好交付
普通 XYZ 瓦片通常是大量 z/x/y.png 文件。文件数量一多,复制、压缩、校验和同步都会变慢。MBTiles 把瓦片内容和元数据放进 SQLite 数据库中,交付时只有一个 .mbtiles 文件,特别适合离线地图、现场调查、内网 WebGIS 和教学演示。
要注意,MBTiles 只是容器,不是地图样式本身。它可以存 png、jpg 这样的栅格瓦片,也可以存 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 生成栅格瓦片包
- 在 QGIS 中整理图层顺序、符号、标注和透明度。
- 把项目坐标系设置为
EPSG:3857,并确认源数据有正确 CRS。 - 选择生成 XYZ 瓦片的 MBTiles 输出方式,设置范围、最小级别和最大级别。
- 选择
png、jpg或其他合适格式,再输出到目标文件。 - 用桌面工具或本地瓦片服务检查是否有空白、偏移、模糊和级别过多问题。
缩放级别不要盲目设高。每增加一级,瓦片数量都会明显增加。省域专题图、城市路网、园区底图的合理级别并不一样,应该由业务可见尺度决定。
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
生成后重点检查 format、bounds、minzoom、maxzoom 和 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 已确认。
bounds、center、minzoom、maxzoom合理。- 栅格格式和服务端响应类型一致。
- 矢量 source layer 名称和前端样式一致。
- 服务端正确处理 XYZ 与 TMS 的 Y 行号差异。
- 跨域、缓存、压缩和响应头已经在浏览器中验证。
- 完整生成前,已经用小范围样本测试通过。
FAQ:制作、发布和转换常见问题
MBTiles制作时应该选栅格还是矢量?
固定样式、只浏览地图时选栅格;需要前端动态改颜色、开关图层或按属性渲染时选矢量。教学和项目交付中,建议先做小范围样本比较体积、清晰度和加载体验。
MBTiles服务器能不能直接部署到公网?
可以,但要按正式服务配置 HTTPS、反向代理、CORS、缓存、访问控制和日志。只做公开静态分发时,也可以评估 PMTiles 路线,减少服务维护。
MBTiles矢量瓦片 请求成功但页面空白怎么办?
先检查样式文件里的 source layer 名称,再检查响应头和压缩方式。请求成功只说明服务器返回了内容,不代表前端能正确解析并渲染。
MBTiles转PMTiles 会自动提升加载速度吗?
不会自动提升。它主要改变存储和访问方式,适合静态托管和范围请求。实际速度仍取决于瓦片大小、级别设置、属性字段、缓存和前端渲染能力。
总结:先选瓦片类型,再选发布方式
MBTiles 的核心价值是把瓦片和元数据打包成一个便于交付的文件。实战中先决定栅格或矢量,再小范围验证制作参数,最后根据部署环境选择服务发布或 PMTiles 静态分发。只要坐标系、缩放级别、图层名、元数据和 URL 规则检查到位,这条流程就能稳定支撑离线地图和 WebGIS 项目。
-
ArcGIS Pro字段计算器:数值涵义和顺序编号 2026-06-11 11:39:27
-
ArcPy栅格计算:arcpy.sa和栅格计算器排查 2026-06-11 10:48:22
-
ArcPy字段计算:AddField、字段映射和更新游标 2026-06-11 09:49:34
-
ArcPy投影转换:定义投影、重投影和空间参考 2026-06-10 20:51:20
-
ArcPy批量裁剪:批处理栅格处理和输出检查 2026-06-10 18:47:40
-
ArcPy批量出图:arcpy.mp导出PDF和批量制图 2026-06-10 08:40:05
-
无人机航线规划软件:规划方法和规划步骤 2026-06-09 15:16:34
-
无人机测绘流程:软件有哪些、数据处理和精度 2026-06-09 13:32:14
-
Cesium影像加载失败:本地影像和TIF加载排查 2026-06-09 09:02:22
-
Cesium地形加载失败:本地地形和地形数据排查 2026-06-08 18:59:46
-
Cesium倾斜摄影:加载倾斜摄影、贴地和高度偏移 2026-06-08 17:58:00
-
GDAL影像拼接:合并TIF、获取影像范围和图像融合 2026-06-07 19:24:48
-
DEM生成等高线:怎么用DEM生成等高线地形图 2026-06-07 14:47:02
-
DEM下载:30米免费下载、高精度和SRTM数据源 2026-06-06 19:50:30
-
ArcGIS计算NDVI:植被覆盖度和平均值计算 2026-06-06 18:34:45
-
ArcGIS波段合成步骤:没反应和颜色不一致处理 2026-06-05 20:33:28
-
ArcGIS影像镶嵌步骤:去黑边和颜色不一致处理 2026-06-05 16:45:46
-
遥感影像处理流程:一般流程和软件有哪些 2026-06-05 12:18:06
-
ArcGIS克里金插值法步骤:输出范围和精度评价 2026-06-04 21:51:58
-
ArcGIS坡向分析:坡向如何分级和怎么做 2026-06-04 13:10:57