本节摘要:三维地图让城市、地形、模型可视化更直观。本节讲 Cesium、Three.js 等三维 Web GIS 技术——浏览器里做三维地球。
阅读完本节,你应当能够:
二维看平面,三维看立体——城市建筑、地形起伏、地下管线、倾斜摄影模型,三维更直观。数字孪生、智慧城市、BIM+GIS 都要三维。
| 技术 | 特点 | 适合 |
|---|---|---|
| Cesium | 三维地球,支持 3D Tiles,GIS 导向 | 三维 GIS、数字孪生 |
| Three.js | 通用 3D 引擎,灵活 | 自定义三维场景 |
| Mapbox GL 3D | 矢量瓦片三维拉伸 | 城市三维、轻量 |
| deck.gl | 大数据三维可视化 | 数据可视化 |

Cesium.Ion.defaultAccessToken = '你的token'; const viewer = new Cesium.Viewer('cesiumContainer'); // 加载 3D Tiles 倾斜摄影 viewer.scene.primitives.add( new Cesium.Cesium3DTileset({ url: Cesium.IonResource.fromAssetId(assetId) }) );
Cesium 是三维 GIS 首选,支持全球地形、影像、3D Tiles、时间动态数据。
3D Tiles 是 OGC 海量三维数据流式传输标准:
3D Tiles 解决浏览器加载超大三维模型的问题。
⚠️ 常见坑:浏览器直接加载超大三维模型——卡顿甚至崩溃。用 3D Tiles 切片流式加载,按视野和 LOD 加载需要的部分。
💡 关键直觉:三维 GIS 用 Cesium(地球+3D Tiles),自定义三维用 Three.js。3D Tiles 是海量三维数据流式标准,靠 LOD/剔除/实例化优化性能。
Cesium 和二维框架一样有自己的心智模型,先理解四个概念:
// 相机定位到北京 viewer.camera.setView({ destination: Cesium.Cartesian3.fromDegrees(116.4, 39.9, 20000) }); // 加一个标注实体 viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(116.4, 39.9), label: { text: '北京', pixelOffset: new Cesium.Cartesian2(0, -20) } });
除了 3D Tiles,三维场景还常加载两类数据:
// 加载地形 viewer.terrainProvider = await Cesium.createWorldTerrainAsync(); // 加载点云(3D Tiles 的 pnts 格式) const pointCloud = await Cesium.Cesium3DTileset.fromUrl('/data/pointcloud/tileset.json'); viewer.scene.primitives.add(pointCloud);
点云数据量极大(一次扫描可能上亿点),发布前要按 3D Tiles 标准切分,浏览器端通过 LOD 分级加载,否则再强的显卡也扛不住。
遇到三维场景卡顿,按顺序排查:
| 维度 | Cesium | Three.js |
|---|---|---|
| 定位 | 三维 GIS / 数字孪生 | 通用 3D 场景 |
| 地球 | 内置全球地形影像 | 需要自己搭 |
| 3D Tiles | 原生支持 | 需集成加载器 |
| 坐标 | 地理坐标友好 | 三维直角坐标 |
| 学习曲线 | GIS 概念多 | WebGL 概念多 |
一句话:要做"带地理坐标的三维系统",选 Cesium;要做"游戏感、自定义渲染"的 3D 展示,选 Three.js;两者也可以结合,用 Cesium 打底、Three.js 做精细物件渲染。
三维 Web GIS 不是用来炫技的,先看看业务到底要什么:
明确需求后,很多"三维项目"其实只需要轻量方案(如 Mapbox 的三维拉伸、deck.gl 的三维聚合),不必一上来就 Cesium 加 3D Tiles。先小步验证,再逐步加深,是三维项目的稳妥节奏。
三维数据从采集到可用的链路:
# 点云转 3D Tiles 的常见工具链示意 # (工具众多,核心是:原始点云 -> 分块 -> 金字塔 -> tileset.json)
这条链路上,数据生产的成本远高于前端开发。项目立项时要把数据采集、处理、更新周期算进预算,否则"三维平台"会变成"三维空壳"。
下一节讲客户端分析和交互。