整理了本地 G 盘全部 Cesium 学习资料——入门课程(30 节)、特效示例集(300+ 案例)、三个 Vue3 项目、mars3d 示例库,加上 3DTiles 倾斜模型和宜兴本地瓦片数据,提炼出速查模板、API 速查和可直接复用的展示效果。写三维 GIS 需求时直接抄。
一、速查模板(直接抄)
1. Viewer 初始化
1 | import * as Cesium from 'cesium' |
2. 底图加载(XYZ 瓦片 / 天地图)
1 | // XYZ 瓦片服务(本地 http-server 发布的瓦片目录也行) |
3. 地形加载
1 | // 在线地形 |
4. 3DTiles 加载(倾斜摄影)
1 | // 加载倾斜模型 |
5. Entity 添加(点/线/面/模型)
1 | // 点(Billboard 图标) |
二、API 速查
1. 官方文档直达
| 入口 | 地址 | 说明 |
|---|---|---|
| 官方文档 | cesium.com/learn/cesiumjs/ref-doc | 完整 API 索引 |
| 官方教程 | cesium.com/learn | 入门教程 + 沙盒示例 |
| 代码沙盒 | sandcastle.cesium.com | 在线运行/改代码,抄示例首选 |
| 源码仓库 | github.com/CesiumGS/cesium | 查实现细节直接搜源码 |
用法:沙盒(Sandcastle)每个示例左下角可以”改代码 + 运行”,实现细节全在官方示例里。
2. 核心类速查
| 分类 | 类/模块 | 用途 |
|---|---|---|
| 入口 | Viewer |
三维场景容器,最常用入口 |
| 相机 | Camera(flyTo/setView/lookAt)、CameraFlightPath |
视角控制 |
| 坐标 | Cartesian3(笛卡尔)、Cartographic(经纬度弧度)、Transforms(坐标变换)、Math.toDegrees/toRadians |
坐标换算 |
| 底图 | ImageryLayer、UrlTemplateImageryProvider、WebMapTileServiceImageryProvider(WMTS) |
影像图层 |
| 地形 | CesiumTerrainProvider、createWorldTerrainAsync |
地形加载 |
| 3DTiles | Cesium3DTileset(fromUrl/fromIonAssetId)、Cesium3DTileStyle |
倾斜模型 |
| 实体 | Entity(point/billboard/label/polyline/polygon/wall/model/ellipsoid)、EntityCollection |
高层封装 |
| 底层 | Primitive(GroundPolylinePrimitive 贴地)、Cesium3DTileFeature |
高性能渲染 |
| 事件 | ScreenSpaceEventHandler、ScreenSpaceEventType(LEFT_CLICK/LEFT_DOUBLE_CLICK/MOUSE_MOVE) |
交互拾取 |
| 时间 | Clock、JulianDate、SampledPositionProperty、CallbackProperty |
CZML 动画/动态位置 |
| 数据 | GeoJsonDataSource、KmlDataSource、CzmlDataSource、DataSourceCollection |
数据格式加载 |
| 材质 | Material、MaterialProperty、CustomShader(3DTiles 着色器)、PolylineGlowMaterialProperty |
自定义效果 |
| 粒子 | ParticleSystem、ParticleEmitter |
雨雪火烟 |
| 分析 | Globe(terrainExaggeration 地形夸张)、scene.pick、SceneTransforms |
拾取/量算基础 |
3. 材质自定义速查(MaterialProperty)
自定义动态材质(流动线/扩散圈/雷达)的标准写法,三步:
1 | // 第一步:定义 MaterialProperty 类 |
三、可复用展示效果(按主题速查)
主题 1:智慧城市大屏
| 效果 | 实现思路 | 复用难度 |
|---|---|---|
| 流动线 | PolylineTrailMaterialProperty(GLSL 时间偏移) |
易 |
| 扩散圈 | CallbackProperty 动态改半径 + 透明度衰减 |
易 |
| 雷达扫描 | CallbackProperty 动态角度生成扇形 wall + 发光圆环 |
中 |
| 电子围栏 | polygon 半透明 + wall 光柱 |
易 |
| 建筑白膜/亮灯 | 3DTiles style 或遍历 tileset 改材质 |
中 |
| 海量图标聚合 | CustomDataSource + 聚合或 kdbush 空间索引 |
中 |
| 粒子(雨雪雾火) | ParticleSystem + 贴图 |
中 |
| 热力图 | heatmap.js 生成 canvas 贴到 Rectangle |
中 |
扩散圈核心代码(CallbackProperty 动态半径):
1 | let radius = 0 |
雷达扫描核心代码(扇形 wall + 旋转):
1 | // 用 eastNorthUpToFixedFrame 转局部坐标 → 计算扫描扇形顶点 → wall 包成 CallbackProperty |
主题 2:倾斜摄影/模型应用
| 效果 | 实现思路 | 复用难度 |
|---|---|---|
| 3DTiles 加载 | Cesium3DTileset.fromUrl + zoomTo |
易 |
| 单体化 | 点击拾取 → getPropertyIds() 拿业务属性 → 高亮 |
中 |
| 模型压平 | 官方 Globe 挖除 + 设置高度,或 tileset 偏移 |
高 |
| CustomShader | 给 3DTiles 加动态着色(渐变/闪烁/水面波动) | 高 |
| 模型插值运动 | SampledPositionProperty 采样时间线 |
中 |
| 视频投射 | 视频 texture 投到建筑面 | 高 |
CustomShader 给倾斜模型加动态效果(3DTiles 专用):
1 | const customShader = new Cesium.CustomShader({ |
主题 3:空间分析
| 效果 | 实现思路 | 复用难度 |
|---|---|---|
| 可视域分析 | 相机视角扇形遮挡检测(ViewShed 类) |
高 |
| 淹没分析 | 动态提升水面高度 + 水域面渲染 | 中 |
| 方量分析 | 地形高度差积分(MeasureVolume 类) |
高 |
| 剖面分析 | 沿线采样高度生成折线剖面图 | 中 |
| 坡度/坡向 | 地形 tile 高度差计算 | 中 |
| 量算工具 | 点线面拾取 + Cartesian3.distance/面积公式 |
易 |
| 反选遮罩 | polygon 大外环 + holes 挖孔 + 半透明黑 + 边界线 |
易 |
| 天际线 | 提取场景轮廓线 | 高 |
量算距离核心(拾取 + 距离):
1 | const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas) |
反选遮罩核心代码(外部压暗 + 目标区高亮,项目 map-mask.vue):
1 | // 1) 目标边界坐标(如省/市界 GeoJSON coordinates) |
主题 4:高级特效
| 效果 | 实现思路 | 复用难度 |
|---|---|---|
| 3D 风场 | 粒子流 + 网格渲染(cesium-wind.js) |
高 |
| 海流 | 流动线束 + 方向箭头 | 高 |
| 体渲染 | 3D 纹理 + RayMarching 着色器 | 高 |
| 视频投射 | video 元素当纹理贴到模型 | 中 |
| 卫星轨迹 CZML | 时间线 + 模型采样位置 | 中 |
| 昼夜/天气 | 场景光源 + 天空盒 + 粒子组合 | 中 |
| Cesium 融合 Three | viewer.scene.primitives.add 接入 Three 场景 |
高 |
| 分屏/卷帘对比 | 两图层 SplitDirection 左右分 + scene.splitPosition 拖动 |
易 |
CZML 时间轴动画(卫星/车辆轨迹):
1 | const dataSource = await Cesium.CzmlDataSource.load('/data/satellite.czml') |
分屏/卷帘对比核心代码(两个底图各占一半,拖动分割线切换,项目 split-screen.vue):
1 | // 1) 左右两个底图分别指定 SplitDirection(影像分层切割) |
四、踩坑记录(项目实测)
- 忘记开
shouldAnimate:CZML/时间动画不动,第一反应查时钟 - 坐标单位:
Cartographic是弧度,fromDegrees是度,混用直接偏到海里 - 贴线不贴地:
polyline要用GroundPolylinePrimitive或clampToGround: true,否则线可能穿地形 - 拖底图白屏:
UrlTemplateImageryProvider的 url 模板{z}/{x}/{y}顺序要和瓦片目录一致 - 地形瓦片格式:本地地形必须是 CesiumTerrainProvider 格式(含
layer.json),DEM 原片要先用工具切片 - 3DTiles 白模/黑模:检查
maximumScreenSpaceError和光照,瓦片数据本身坐标错位(gltfUpAxis)也会导致整体翻转 - 模型不发亮:贴图颜色空间/
PBR材质参数,或需要lighting配合 - 内存/性能:大场景要关
requestRenderMode(或反过来开)控制渲染频率,海量 entity 用Primitive/CustomDataSource而不是一个个 entity - token 提示:不用 Ion 也要设
Ion.defaultAccessToken(可填自己的),否则弹横幅 - 销毁:切页
viewer.destroy(),ScreenSpaceEventHandler.destroy(),否则事件泄漏
五、总结
- Cesium 三件套:底图(ImageryLayer)+ 地形(TerrainProvider)+ 数据(Entity/Primitive/3DTiles),所有场景都是这三层拼的
- 动态效果 = MaterialProperty + CallbackProperty:会写自定义材质就能做流动线、雷达、扩散圈这些”会动”的效果
- 分析功能是项目加分项:可视域、淹没、方量这些虽然难,但才是三维 GIS 区别于”3D 看模型”的核心价值
- 性能靠 Primitive:entity 好用但多则卡,海量数据必须下沉到底层 Primitive
- 本地数据就是题库:本地 3DTiles 倾斜模型(tp101)+ 影像瓦片 + 地形数据,直接拿来练手,不用再找数据
内容由 AI 生成,仅供参考。本文发布于 码上学习,转载请注明出处。