与 Mapbox GL JS 的差异
MapLibre GL JS 是 Mapbox GL JS 1.x 的合法开源分支,采用 BSD-3 许可, 不需要 access token,也不按地图加载量计费。API 层面高度相似, 但不是逐行兼容,迁移前需要知道哪些地方会断。
分叉的由来
Mapbox GL JS 在 1.x 时期使用 BSD-3-Clause 许可,代码可以自由使用和分发。 2020 年底发布的 2.0 改为 Mapbox 专有许可,按地图加载量计费, 并要求使用 Mapbox 的服务。 社区随后从最后一个 BSD 版本(1.13)分叉出 MapLibre GL JS, 保留原有版权声明,继续以 BSD-3 公开演进。
因此 MapLibre 不是复制品或破解版,而是许可允许的分支项目。 它有自己的版本线、样式规范和发布节奏,目前由 MapLibre 组织维护, 代码与治理过程公开。
迁移时真正要改的东西
| 项目 | Mapbox GL JS | MapLibre GL JS |
|---|---|---|
| 脚本地址 | mapbox-gl.js / mapbox-gl.css | maplibre-gl.js / maplibre-gl.css |
| 全局变量 | mapboxgl | maplibregl |
| 鉴权 | accessToken 必填 | 不需要,也不接受该参数 |
| 底图样式 | Mapbox 托管样式 | 自建或第三方样式 |
| 字形与图标 | Mapbox 托管 | 自行提供 glyphs 与 sprite |
只做全局替换通常就能跑起来:把 mapboxgl. 换成
maplibregl.,删掉 accessToken,
再把 style 换成一个公开可用的样式。
// 迁移前
mapboxgl.accessToken = 'pk.xxxx';
var map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/streets-v11',
center: [-74.5, 40], zoom: 9
});
// 迁移后
var map = new maplibregl.Map({
container: 'map',
style: 'https://demotiles.maplibre.org/style.json',
center: [116.39, 39.90], zoom: 4
});
哪些地方会断
- Mapbox 专有服务:地理编码、路径规划、静态图、Mapbox 托管的瓦片,都需要换成别的服务商,不是换个库就能解决。
- v2 之后新增的 API:Mapbox 在 2.x 起加入的部分能力,MapLibre 没有同名实现。用到时要查 MapLibre 的当前版本,而不是照抄 Mapbox 文档。
- 插件生态:Mapbox 时代的第三方插件不一定适配,尤其是直接依赖
mapbox-gl内部结构的那些。 - 字体:
glyphs指向 Mapbox 字体服务的样式会 401,需要自建或改用公开字体切片。
样式规范层面两者同源,绝大多数 paint、layout
属性可以直接搬。差异更多出现在新特性的支持程度,而不是这些基础属性。
不依赖厂商底图的好处
MapLibre 只负责渲染,瓦片来源完全由样式决定。 可以接自建的瓦片服务、开源的 OpenFreeMap、政府开放数据, 也可以接商业厂商的矢量瓦片。换底图只改样式 URL, 不涉及代码与计费账户。
代价是字形、图标、瓦片都要自己准备。 演示阶段用官方 demo 样式最省事,它只有国界级数据(最大 6 级), 生产环境必须换成完整底图。
选型判断
| 情况 | 建议 |
|---|---|
| 已有自建或第三方瓦片,重视许可与成本 | MapLibre |
| 需要长期锁定厂商的成套服务与商业支持 | 按厂商方案评估 |
| 项目禁止按地图加载量计费 | MapLibre |
| 依赖 Mapbox 2.x 之后新增的专有能力 | 先确认 MapLibre 是否已支持,再决定 |
许可要随代码一起保留。BSD-3 允许商用和修改,但要求保留版权声明、 许可文本,并且不得用原作者名义为衍生产品背书。 分发打包产物时把 LICENSE 一并带上。
经纬志(2026)。《与 Mapbox GL JS 的差异》。https://www.jingweizhi.com/maplibre/tutorial/mapbox-diff.html(访问日期 2026-11-03)。