经纬志
首页 / MapLibre / 教程

与 Mapbox GL JS 的差异

先看结论

MapLibre GL JS 是 Mapbox GL JS 1.x 的合法开源分支,采用 BSD-3 许可, 不需要 access token,也不按地图加载量计费。API 层面高度相似, 但不是逐行兼容,迁移前需要知道哪些地方会断。

最后验证 2026-11-03 · MapLibre GL JS 4.x · 更新 2026-10-27 · 引用本文

分叉的由来

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 JSMapLibre GL JS
脚本地址mapbox-gl.js / mapbox-gl.cssmaplibre-gl.js / maplibre-gl.css
全局变量mapboxglmaplibregl
鉴权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)。