Skip to content

一、前言与定位

Mapbox GL JS 是一个基于 WebGL 的高性能 JavaScript 地图库,用于构建 交互式 2D / 3D 矢量地图应用。与传统地图使用图片瓦片不同,Mapbox GL 使用 矢量瓦片(Vector Tiles)+ GPU 渲染,可以实现:

  • 实时样式变化
  • 平滑缩放
  • 3D 建筑
  • 地形
  • 动态数据可视化

因此在 数据可视化、城市数字孪生、物流监控、可视化大屏 等场景中非常常见。

主流 WebGIS 库对比

特点适用场景
Leaflet轻量、简单、插件多简单地图应用
OpenLayersGIS 功能最全,支持 OGC 标准专业 GIS 系统
MapLibre GLMapbox 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 渲染优化,大规模数据更流畅。

学完你能做什么?

例如:

实时物流监控

车辆位置 + 轨迹动画

城市数字孪生

3D 建筑 + 实时数据

数据可视化大屏

热力图 + 聚合点

沉浸式城市导览

3D 地形 + fly 动画

二、开发环境搭建

方法一:CDN(最快上手)

适合 快速体验

html
<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>

方法二:Vite + npm(推荐)

初始化项目:

bash
npm create vite@latest mapbox-demo
cd mapbox-demo
npm install

安装 Mapbox:

bash
npm install mapbox-gl

main.js:

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

启动:

npm run dev

方法三:纯 ESM

html
<script type="module">
  import mapboxgl from "https://cdn.skypack.dev/mapbox-gl";
</script>

获取 Mapbox Token

需要注册账号:

https://mapbox.com

获取:

Access Token

最小可运行示例

html
<!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>

三、核心概念速览

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

Map

Map 是地图实例

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

Camera

控制地图视角。

javascript
map.flyTo({
  center: [116.39, 39.9],
  zoom: 12,
  pitch: 60,
});

Style

地图样式系统。

遵循 Mapbox Style Spec

javascript
style: "mapbox://styles/mapbox/satellite-streets-v12";

Sources

数据源。

常见类型:

geojson
vector
raster
raster-dem

示例:

javascript
map.addSource("points", {
  type: "geojson",
  data: "points.geojson",
});

Layers

图层用于展示数据。

常见类型:

fill
line
circle
symbol
fill-extrusion

例子:

javascript
map.addLayer({
  id: "point-layer",
  type: "circle",
  source: "points",
});

Expressions

Mapbox 的 数据驱动样式系统

javascript
'circle-color':[
'match',
['get','type'],
'restaurant','#ff0000',
'park','#00ff00',
'#0000ff'
]

Controls

地图控件:

NavigationControl
GeolocateControl
ScaleControl

例子:

javascript
map.addControl(new mapboxgl.NavigationControl());

信息弹窗。

javascript
new mapboxgl.Popup().setLngLat([116, 39]).setHTML("<h3>北京</h3>").addTo(map);

四、5 分钟做出第一个炫酷地图

完整示例:

html
<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>

效果:

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

五、中级进阶

5.1 切换地图风格

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

常见:

standard
streets
satellite
light
dark

5.2 添加 GeoJSON 数据

javascript
map.addSource("earthquakes", {
  type: "geojson",
  data: "earthquake.geojson",
});

map.addLayer({
  id: "earthquake-layer",
  type: "circle",
  source: "earthquakes",
  paint: {
    "circle-radius": 6,
    "circle-color": "red",
  },
});

5.3 数据驱动样式

javascript
'circle-radius':[
'interpolate',
['linear'],
['zoom'],
5,2,
15,20
]

5.4 3D 建筑

javascript
map.addLayer({
  id: "3d-buildings",
  source: "composite",
  "source-layer": "building",
  type: "fill-extrusion",
  paint: {
    "fill-extrusion-height": ["get", "height"],
    "fill-extrusion-color": "#aaa",
  },
});

5.5 交互

点击事件:

javascript
map.on("click", "poi-layer", (e) => {
  new mapboxgl.Popup().setLngLat(e.lngLat).setHTML("POI").addTo(map);
});

5.6 flyTo 动画

javascript
map.flyTo({
  center: [121.47, 31.23],
  zoom: 12,
  pitch: 60,
  speed: 0.8,
});

5.7 聚合

javascript
map.addSource("points", {
  type: "geojson",
  data: "points.geojson",
  cluster: true,
  clusterRadius: 50,
});

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

项目功能:

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

项目结构

mapbox-traffic
 ├ index.html
 ├ main.js
 ├ style.css
 └ data
     └ vehicles.geojson

加载车辆数据

javascript
map.addSource("vehicles", {
  type: "geojson",
  data: "data/vehicles.geojson",
});

车辆图层

javascript
map.addLayer({
  id: "vehicle-layer",
  type: "circle",
  source: "vehicles",
  paint: {
    "circle-radius": 5,
    "circle-color": "#ff0000",
  },
});

聚合大量车辆

javascript
cluster: true;

热力图

javascript
map.addLayer({
  id: "traffic-heat",
  type: "heatmap",
  source: "vehicles",
  paint: {
    "heatmap-radius": 20,
  },
});

车辆轨迹

javascript
map.addLayer({
  id: "routes",
  type: "line",
  source: "routes",
  paint: {
    "line-color": "#00ffff",
    "line-width": 4,
  },
});

WebSocket 实时更新

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

  map.getSource("vehicles").setData(data);
};

Vue UI 联动

javascript
watch(selectedVehicle, (id) => {
  map.flyTo({
    center: vehicleMap[id],
  });
});

七、生产级最佳实践

Token 安全

不要写死 token。

建议:

.env

性能优化

减少 layer 数量。

推荐 < 100

使用:

promoteId
cluster
vector tiles

移动端适配

javascript
antialias: true;

适配 touch。

常见问题

地图白屏

通常是:

token 错误
style 错误

坐标错误

Mapbox 使用:

[longitude, latitude]

八、学习资源

官方文档:

https://docs.mapbox.com/mapbox-gl-js/

示例库:

Mapbox Examples

推荐进阶方向:

Mapbox + React
Mapbox + Deck.gl
Mapbox + Three.js
Mapbox + PMTiles

九、结语

Mapbox GL JS 的学习路径建议:

CDN demo

Vite 项目

GeoJSON 数据

表达式样式

3D 地形

实时数据

完整地图产品

建议:

  • 1️⃣ Fork 官方 examples
  • 2️⃣ 改造 demo
  • 3️⃣ 发布自己的地图项目

当你熟练掌握 Mapbox 时,你就能开发:

  • 城市数字孪生
  • 物流监控
  • 数据可视化地图
  • 沉浸式 WebGIS

地图开发是 前端 + GIS + 可视化 的交叉领域