Mapbox GL JS 从零到精通:2025-2026实战指南
# 一、前言与定位
Mapbox GL JS 是一个基于 WebGL 的高性能 JavaScript 地图库,用于构建 交互式 2D / 3D 矢量地图应用。与传统地图使用图片瓦片不同,Mapbox GL 使用 矢量瓦片(Vector Tiles)+ GPU 渲染,可以实现:
- 实时样式变化
- 平滑缩放
- 3D 建筑
- 地形
- 动态数据可视化
因此在 数据可视化、城市数字孪生、物流监控、可视化大屏 等场景中非常常见。
# 主流 WebGIS 库对比
| 库 | 特点 | 适用场景 |
|---|---|---|
| Leaflet | 轻量、简单、插件多 | 简单地图应用 |
| OpenLayers | GIS 功能最全,支持 OGC 标准 | 专业 GIS 系统 |
| MapLibre GL | Mapbox v1 的开源分支 | 免费矢量地图 |
| Mapbox GL JS | 视觉效果最好,3D 强 | 商业地图可视化 |
| Cesium | 专注 3D 地球 | 数字地球、航天 |
简单理解:
- Leaflet → 轻量地图
- OpenLayers → GIS 工具
- Mapbox → 视觉地图
- Cesium → 3D 地球
# 2025–2026 Mapbox GL JS v3.x 新特性
最新版本带来了很多能力:
1)Standard Style
全新的默认地图风格,具有更真实的视觉表现。
2)3D 光照系统
- 建筑真实阴影
- 日照模拟
- 光照角度控制
3)3D Terrain
真实地形渲染。
4)新的 Camera API
更流畅的相机控制。
5)性能提升
GPU 渲染优化,大规模数据更流畅。
# 学完你能做什么?
例如:
实时物流监控
车辆位置 + 轨迹动画
1
城市数字孪生
3D 建筑 + 实时数据
1
数据可视化大屏
热力图 + 聚合点
1
沉浸式城市导览
3D 地形 + fly 动画
1
# 二、开发环境搭建
# 方法一:CDN(最快上手)
适合 快速体验
<link
href="https://api.mapbox.com/mapbox-gl-js/v3.19.0/mapbox-gl.css"
rel="stylesheet"
/>
<script src="https://api.mapbox.com/mapbox-gl-js/v3.19.0/mapbox-gl.js"></script>
1
2
3
4
5
2
3
4
5
# 方法二:Vite + npm(推荐)
初始化项目:
npm create vite@latest mapbox-demo
cd mapbox-demo
npm install
1
2
3
2
3
安装 Mapbox:
npm install mapbox-gl
1
main.js:
import mapboxgl from "mapbox-gl";
import "mapbox-gl/dist/mapbox-gl.css";
1
2
2
启动:
npm run dev
1
# 方法三:纯 ESM
<script type="module">
import mapboxgl from "https://cdn.skypack.dev/mapbox-gl";
</script>
1
2
3
2
3
# 获取 Mapbox Token
需要注册账号:
https://mapbox.com (opens new window)
获取:
Access Token
1
# 最小可运行示例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Mapbox Demo</title>
<link
href="https://api.mapbox.com/mapbox-gl-js/v3.19.0/mapbox-gl.css"
rel="stylesheet"
/>
<style>
body {
margin: 0;
}
##map {
width: 100vw;
height: 100vh;
}
</style>
</head>
<body>
<div id="map"></div>
<script src="https://api.mapbox.com/mapbox-gl-js/v3.19.0/mapbox-gl.js"></script>
<script>
mapboxgl.accessToken = "YOUR_TOKEN";
const map = new mapboxgl.Map({
container: "map",
style: "mapbox://styles/mapbox/standard",
center: [-118.24, 34.05],
zoom: 10,
});
</script>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 三、核心概念速览
理解 Mapbox 的核心结构非常重要。
# Map
Map 是地图实例
const map = new mapboxgl.Map({
container: "map",
style: "mapbox://styles/mapbox/standard",
});
1
2
3
4
2
3
4
# Camera
控制地图视角。
map.flyTo({
center: [116.39, 39.9],
zoom: 12,
pitch: 60,
});
1
2
3
4
5
2
3
4
5
# Style
地图样式系统。
遵循 Mapbox Style Spec
style: "mapbox://styles/mapbox/satellite-streets-v12";
1
# Sources
数据源。
常见类型:
geojson
vector
raster
raster-dem
1
2
3
4
2
3
4
示例:
map.addSource("points", {
type: "geojson",
data: "points.geojson",
});
1
2
3
4
2
3
4
# Layers
图层用于展示数据。
常见类型:
fill
line
circle
symbol
fill-extrusion
1
2
3
4
5
2
3
4
5
例子:
map.addLayer({
id: "point-layer",
type: "circle",
source: "points",
});
1
2
3
4
5
2
3
4
5
# Expressions
Mapbox 的 数据驱动样式系统
'circle-color':[
'match',
['get','type'],
'restaurant','#ff0000',
'park','#00ff00',
'#0000ff'
]
1
2
3
4
5
6
7
2
3
4
5
6
7
# Controls
地图控件:
NavigationControl
GeolocateControl
ScaleControl
1
2
3
2
3
例子:
map.addControl(new mapboxgl.NavigationControl());
1
# Popup
信息弹窗。
new mapboxgl.Popup().setLngLat([116, 39]).setHTML("<h3>北京</h3>").addTo(map);
1
# 四、5 分钟做出第一个炫酷地图
完整示例:
<div id="map"></div>
<script>
mapboxgl.accessToken = "TOKEN";
const map = new mapboxgl.Map({
container: "map",
style: "mapbox://styles/mapbox/standard",
center: [-118.24, 34.05],
zoom: 10,
pitch: 60,
bearing: -20,
});
map.addControl(new mapboxgl.NavigationControl());
map.addControl(
new mapboxgl.GeolocateControl({
positionOptions: { enableHighAccuracy: true },
trackUserLocation: true,
}),
);
map.on("load", () => {
map.addSource("mapbox-dem", {
type: "raster-dem",
url: "mapbox://mapbox.mapbox-terrain-dem-v1",
});
map.setTerrain({
source: "mapbox-dem",
exaggeration: 1.5,
});
});
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
效果:
- 3D 地形
- 控件
- 倾斜视角
# 五、中级进阶
# 5.1 切换地图风格
map.setStyle("mapbox://styles/mapbox/satellite-streets-v12");
1
常见:
standard
streets
satellite
light
dark
1
2
3
4
5
2
3
4
5
# 5.2 添加 GeoJSON 数据
map.addSource("earthquakes", {
type: "geojson",
data: "earthquake.geojson",
});
map.addLayer({
id: "earthquake-layer",
type: "circle",
source: "earthquakes",
paint: {
"circle-radius": 6,
"circle-color": "red",
},
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 5.3 数据驱动样式
'circle-radius':[
'interpolate',
['linear'],
['zoom'],
5,2,
15,20
]
1
2
3
4
5
6
7
2
3
4
5
6
7
# 5.4 3D 建筑
map.addLayer({
id: "3d-buildings",
source: "composite",
"source-layer": "building",
type: "fill-extrusion",
paint: {
"fill-extrusion-height": ["get", "height"],
"fill-extrusion-color": "#aaa",
},
});
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 5.5 交互
点击事件:
map.on("click", "poi-layer", (e) => {
new mapboxgl.Popup().setLngLat(e.lngLat).setHTML("POI").addTo(map);
});
1
2
3
2
3
# 5.6 flyTo 动画
map.flyTo({
center: [121.47, 31.23],
zoom: 12,
pitch: 60,
speed: 0.8,
});
1
2
3
4
5
6
2
3
4
5
6
# 5.7 聚合
map.addSource("points", {
type: "geojson",
data: "points.geojson",
cluster: true,
clusterRadius: 50,
});
1
2
3
4
5
6
2
3
4
5
6
# 六、高级实战:城市实时交通监控大屏
项目功能:
实时车辆
交通热力图
轨迹动画
3D 建筑
POI 筛选
时间轴回放
1
2
3
4
5
6
2
3
4
5
6
# 项目结构
mapbox-traffic
├ index.html
├ main.js
├ style.css
└ data
└ vehicles.geojson
1
2
3
4
5
6
2
3
4
5
6
# 加载车辆数据
map.addSource("vehicles", {
type: "geojson",
data: "data/vehicles.geojson",
});
1
2
3
4
2
3
4
# 车辆图层
map.addLayer({
id: "vehicle-layer",
type: "circle",
source: "vehicles",
paint: {
"circle-radius": 5,
"circle-color": "#ff0000",
},
});
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 聚合大量车辆
cluster: true;
1
# 热力图
map.addLayer({
id: "traffic-heat",
type: "heatmap",
source: "vehicles",
paint: {
"heatmap-radius": 20,
},
});
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 车辆轨迹
map.addLayer({
id: "routes",
type: "line",
source: "routes",
paint: {
"line-color": "#00ffff",
"line-width": 4,
},
});
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# WebSocket 实时更新
socket.onmessage = (e) => {
const data = JSON.parse(e.data);
map.getSource("vehicles").setData(data);
};
1
2
3
4
5
2
3
4
5
# Vue UI 联动
watch(selectedVehicle, (id) => {
map.flyTo({
center: vehicleMap[id],
});
});
1
2
3
4
5
2
3
4
5
# 七、生产级最佳实践
# Token 安全
不要写死 token。
建议:
.env
1
# 性能优化
减少 layer 数量。
推荐 < 100
1
使用:
promoteId
cluster
vector tiles
1
2
3
2
3
# 移动端适配
antialias: true;
1
适配 touch。
# 常见问题
# 地图白屏
通常是:
token 错误
style 错误
1
2
2
# 坐标错误
Mapbox 使用:
[longitude, latitude]
1
# 八、学习资源
官方文档:
https://docs.mapbox.com/mapbox-gl-js/ (opens new window)
示例库:
Mapbox Examples
1
推荐进阶方向:
Mapbox + React
Mapbox + Deck.gl
Mapbox + Three.js
Mapbox + PMTiles
1
2
3
4
2
3
4
# 九、结语
Mapbox GL JS 的学习路径建议:
CDN demo
↓
Vite 项目
↓
GeoJSON 数据
↓
表达式样式
↓
3D 地形
↓
实时数据
↓
完整地图产品
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
建议:
- 1️⃣ Fork 官方 examples
- 2️⃣ 改造 demo
- 3️⃣ 发布自己的地图项目
当你熟练掌握 Mapbox 时,你就能开发:
- 城市数字孪生
- 物流监控
- 数据可视化地图
- 沉浸式 WebGIS
地图开发是 前端 + GIS + 可视化 的交叉领域。
上次更新: 2026/03/06, 08:43:08