Glittering's blog Glittering's blog
Home
  • 学习手册

    • 《TypeScript教程》
    • 《Git》
    • 《Vite》
    • 《Vue3》
    • 《React18》
    • 《CSS》
    • 《Tailwind CSS》
  • 技术文档
  • 算法
  • 工作总结
  • 实用技巧
  • collect
About
  • Classification
  • Label
GitHub (opens new window)

Glitz Ma

前端开发工程师
Home
  • 学习手册

    • 《TypeScript教程》
    • 《Git》
    • 《Vite》
    • 《Vue3》
    • 《React18》
    • 《CSS》
    • 《Tailwind CSS》
  • 技术文档
  • 算法
  • 工作总结
  • 实用技巧
  • collect
About
  • Classification
  • Label
GitHub (opens new window)
  • 技术文档

  • 算法

  • 工作总结

    • 时区校正
    • 上传下载文件方式总结
    • web异常监控和分析
    • 前端优化指南
    • http缓存机制
    • 静态资源灰度发布
    • 浏览器原理及渲染机制
    • Chrome DevTools 渲染分析实战
    • Layout Thrashing(布局抖动)
    • Composite Layer(合成层)
    • 全局设置滚动条样式好吗?
    • 虚拟列表如何避免Layout和Paint
    • 前端安全知识
    • 安全(同源策略 / CSP / CORS)
    • 浏览器安全模型
    • 从chrome v8 讲安全
    • WebAssembly(Wasm)
    • XSS → JIT → 沙箱逃逸
    • 微前端总结
    • websocket聊天
    • Uni-app基础知识
    • react16高级特性
    • react16基础知识总结
    • vue2常见原理总结
    • vue2基础知识总结
    • webpack优化实践
    • webpack基础应用知识总结
    • Agent Skills是什么?跟MCP Workflow Command Prompt的关系。
    • 从cnn到transformer全解大模型
    • 什么是 Encoder 和 Decoder 结构
    • GPT 为什么能“看懂”问题
    • GPT 是怎么学会数学的
    • GIS 基础三件套
    • GIS必会知识点
    • 100 万点地图怎么渲染?
    • GIS空间索引的实现
    • Cesium 从入门到精通:实战指南
    • OpenLayers 从零到精通:2025-2026实战指南
    • Mapbox GL JS 从零到精通:2025-2026实战指南
      • 一、前言与定位
        • 主流 WebGIS 库对比
        • 2025–2026 Mapbox GL JS v3.x 新特性
        • 学完你能做什么?
      • 二、开发环境搭建
        • 方法一:CDN(最快上手)
        • 方法二:Vite + npm(推荐)
        • 方法三:纯 ESM
        • 获取 Mapbox Token
        • 最小可运行示例
      • 三、核心概念速览
      • Map
      • Camera
      • Style
      • Sources
      • Layers
      • Expressions
      • Controls
      • Popup
      • 四、5 分钟做出第一个炫酷地图
      • 五、中级进阶
      • 5.1 切换地图风格
      • 5.2 添加 GeoJSON 数据
      • 5.3 数据驱动样式
      • 5.4 3D 建筑
      • 5.5 交互
      • 5.6 flyTo 动画
      • 5.7 聚合
      • 六、高级实战:城市实时交通监控大屏
        • 项目结构
      • 加载车辆数据
      • 车辆图层
      • 聚合大量车辆
      • 热力图
      • 车辆轨迹
      • WebSocket 实时更新
      • Vue UI 联动
      • 七、生产级最佳实践
        • Token 安全
        • 性能优化
        • 移动端适配
        • 常见问题
        • 地图白屏
        • 坐标错误
      • 八、学习资源
      • 九、结语
    • Cesium、OpenLayers 和 Mapbox GL JS 的关系、区别
    • 容器领域必学的黄金组合
    • 小程序笔记
    • 小程序工程模板设计
    • 地图标绘--射线法来计算点在多边形内
  • 实用技巧

  • 收藏夹

  • 技术
  • 工作总结
mamingjuan
2026-03-06
目录

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

# 方法二:Vite + npm(推荐)

初始化项目:

npm create vite@latest mapbox-demo
cd mapbox-demo
npm install
1
2
3

安装 Mapbox:

npm install mapbox-gl
1

main.js:

import mapboxgl from "mapbox-gl";
import "mapbox-gl/dist/mapbox-gl.css";
1
2

启动:

npm run dev
1

# 方法三:纯 ESM

<script type="module">
  import mapboxgl from "https://cdn.skypack.dev/mapbox-gl";
</script>
1
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

# 三、核心概念速览

理解 Mapbox 的核心结构非常重要。


# Map

Map 是地图实例

const map = new mapboxgl.Map({
  container: "map",
  style: "mapbox://styles/mapbox/standard",
});
1
2
3
4

# Camera

控制地图视角。

map.flyTo({
  center: [116.39, 39.9],
  zoom: 12,
  pitch: 60,
});
1
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

示例:

map.addSource("points", {
  type: "geojson",
  data: "points.geojson",
});
1
2
3
4

# Layers

图层用于展示数据。

常见类型:

fill
line
circle
symbol
fill-extrusion
1
2
3
4
5

例子:

map.addLayer({
  id: "point-layer",
  type: "circle",
  source: "points",
});
1
2
3
4
5

# Expressions

Mapbox 的 数据驱动样式系统

'circle-color':[
'match',
['get','type'],
'restaurant','#ff0000',
'park','#00ff00',
'#0000ff'
]
1
2
3
4
5
6
7

# Controls

地图控件:

NavigationControl
GeolocateControl
ScaleControl
1
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

效果:

  • 3D 地形
  • 控件
  • 倾斜视角

# 五、中级进阶


# 5.1 切换地图风格

map.setStyle("mapbox://styles/mapbox/satellite-streets-v12");
1

常见:

standard
streets
satellite
light
dark
1
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

# 5.3 数据驱动样式

'circle-radius':[
'interpolate',
['linear'],
['zoom'],
5,2,
15,20
]
1
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

# 5.5 交互

点击事件:

map.on("click", "poi-layer", (e) => {
  new mapboxgl.Popup().setLngLat(e.lngLat).setHTML("POI").addTo(map);
});
1
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

# 5.7 聚合

map.addSource("points", {
  type: "geojson",
  data: "points.geojson",
  cluster: true,
  clusterRadius: 50,
});
1
2
3
4
5
6

# 六、高级实战:城市实时交通监控大屏

项目功能:

实时车辆
交通热力图
轨迹动画
3D 建筑
POI 筛选
时间轴回放
1
2
3
4
5
6

# 项目结构

mapbox-traffic
 ├ index.html
 ├ main.js
 ├ style.css
 └ data
     └ vehicles.geojson
1
2
3
4
5
6

# 加载车辆数据

map.addSource("vehicles", {
  type: "geojson",
  data: "data/vehicles.geojson",
});
1
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

# 聚合大量车辆

cluster: true;
1

# 热力图

map.addLayer({
  id: "traffic-heat",
  type: "heatmap",
  source: "vehicles",
  paint: {
    "heatmap-radius": 20,
  },
});
1
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

# WebSocket 实时更新

socket.onmessage = (e) => {
  const data = JSON.parse(e.data);

  map.getSource("vehicles").setData(data);
};
1
2
3
4
5

# Vue UI 联动

watch(selectedVehicle, (id) => {
  map.flyTo({
    center: vehicleMap[id],
  });
});
1
2
3
4
5

# 七、生产级最佳实践


# Token 安全

不要写死 token。

建议:

.env
1

# 性能优化

减少 layer 数量。

推荐 < 100
1

使用:

promoteId
cluster
vector tiles
1
2
3

# 移动端适配

antialias: true;
1

适配 touch。


# 常见问题

# 地图白屏

通常是:

token 错误
style 错误
1
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

# 九、结语

Mapbox GL JS 的学习路径建议:

CDN demo
↓
Vite 项目
↓
GeoJSON 数据
↓
表达式样式
↓
3D 地形
↓
实时数据
↓
完整地图产品
1
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
OpenLayers 从零到精通:2025-2026实战指南
Cesium、OpenLayers 和 Mapbox GL JS 的关系、区别

← OpenLayers 从零到精通:2025-2026实战指南 Cesium、OpenLayers 和 Mapbox GL JS 的关系、区别→

Copyright © 2015-2026 Glitz Ma
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式