用途:PMTiles 是矢量或栅格地图瓦片的单文件格式,把瓦片放在任意静态主机上,由 MapLibre 通过 HTTP 字节范围请求读取,无需瓦片服务器或动态后端。适合只想静态托管(S3、R2、GitHub Pages 等)、数据集有界、希望部署与运维简单的场景;需要从 PostGIS 动态出图或数据频繁更新、超大规模全球数据按需生成时应改用 tileserver-gl、Martin 等瓦片服务器。
主要能力:一个 .pmtiles 文件通常容纳完整瓦片金字塔(全部缩放级别)与全部图层,支持矢量图层、栅格影像(PNG/JPEG)和 raster-dem(Terrarium 等编码的高程,用于地形与山体阴影)。客户端只请求所需字节范围,因此主机只需支持 Range 头。
使用方式:MapLibre 不原生识别 PMTiles,需用 pmtiles 库注册协议。安装:npm install pmtiles。注册:const protocol = new pmtiles.Protocol(); maplibregl.addProtocol('pmtiles', protocol.tile); 然后在样式中以 url: 'pmtiles://https://example.com/data.pmtiles' 引用;同一文件的不同图层用 source: 'tiles' 配合 source-layer 区分。缩放范围来自文件头,务必用 url: 而非手写 tiles: 模板,否则 MapLibre 会假定 maxzoom 为 22 请求不存在的层级而返回空白。raster-dem 源需加 "encoding": "terrarium" 或 "mapbox"。React 中应在应用启动时注册一次,最后一个地图卸载时调用 maplibregl.removeProtocol('pmtiles')。注意 MapLibre GL JS 4.0.0 起 addProtocol 改为异步 (params, abortController) 且必须解析为 {data};pmtiles 库的 protocol.tile 已兼容,自写处理器才需按新契约实现。
生成与托管:PMTiles CLI 仅做 MBTiles ↔ PMTiles 转换,常用命令有 pmtiles convert、pmtiles show、pmtiles verify、pmtiles extract;子命令只有 show、tile、verify、extract、merge、serve、convert、cluster、upload、edit、version。从 GeoJSON、OSM、Shapefile、PostGIS 等源生成瓦片可用 Planetiler、tippecanoe(v2.17 起可直接输出 PMTiles)、ogr2ogr(GDAL 3.8+);若输出 MBTiles 再用 pmtiles convert 转换。也可使用 Protomaps 预构建 PMTiles(基于 OpenStreetMap,必须保留 OSM 署名)。托管需支持 Range 与 CORS(Access-Control-Allow-Origin、Access-Control-Allow-Headers: Range),GitHub Pages 单文件需小于 100 MB。
限制:CLI 不读 GeoJSON、Shapefile、OSM 等源格式;栅格与 raster-dem 需由相应工具产出;样式仍需自行定义 glyphs 与 sprite。