共计 2816 个字符,预计需要花费 8 分钟才能阅读完成。
技术背景
Cesium 是一个开源的 JavaScript 库,用于创建高性能的三维地理空间应用。它在 WebGIS 领域具有以下优势:

- 跨平台兼容性:基于 WebGL 技术,可在任何现代浏览器中运行
- 丰富的可视化能力:支持地形、影像、3D 模型、点云等多种数据类型的渲染
- 精确的空间参考:内置 WGS84 坐标系支持,满足专业 GIS 需求
- 活跃的社区生态:拥有大量插件和扩展功能
典型应用场景包括:智慧城市、应急指挥、军事仿真、地质勘探等需要三维地理可视化的领域。
环境准备
- 安装 Node.js:
- 前往 Node.js 官网下载 LTS 版本
-
安装后验证:
node -v和npm -v应显示版本号 -
创建项目:
mkdir cesium-demo cd cesium-demo npm init -y -
引入 Cesium:
npm install cesium -
项目结构:
/src index.html main.js /node_modules package.json
核心实现
Viewer 初始化
// main.js
import * as Cesium from 'cesium';
import 'cesium/Build/Cesium/Widgets/widgets.css';
// 1. 初始化 Viewer
const viewer = new Cesium.Viewer('cesiumContainer', {
baseLayerPicker: false, // 禁用默认底图选择器
terrainProvider: Cesium.createWorldTerrain(), // 使用 Cesium 全球地形
timeline: false, // 禁用时间轴
animation: false, // 禁用动画控件
});
// 2. 设置初始视角
viewer.camera.flyTo({destination: Cesium.Cartesian3.fromDegrees(116.4, 39.9, 1000000),
orientation: {heading: Cesium.Math.toRadians(0),
pitch: Cesium.Math.toRadians(-90),
}
});
地形数据加载
Cesium 提供多种地形数据源选择:
Cesium.createWorldTerrain():官方全球地形(需要 Token)new Cesium.EllipsoidTerrainProvider():平滑椭球体(无真实地形)- 自定义地形服务(通过
Cesium.CesiumTerrainProvider加载)
实体添加
Cesium 提供两种主要图形绘制方式:
- Primitive API:
- 底层 WebGL 绘制接口
- 高性能,适合大量静态图形
-
代码示例:
viewer.scene.primitives.add( new Cesium.Primitive({ geometryInstances: new Cesium.GeometryInstance({ geometry: new Cesium.RectangleGeometry({rectangle: Cesium.Rectangle.fromDegrees(116.3, 39.8, 116.5, 40.0), vertexFormat: Cesium.PerInstanceColorAppearance.VERTEX_FORMAT }) }), appearance: new Cesium.PerInstanceColorAppearance({ flat: true, translucent: false }) }) ); -
Entity API:
- 高级抽象接口
- 支持动态属性绑定和时间轴控制
- 代码示例:
viewer.entities.add({ name: 'Beijing', position: Cesium.Cartesian3.fromDegrees(116.4, 39.9), point: { pixelSize: 10, color: Cesium.Color.RED }, label: { text: '北京市', font: '14pt sans-serif', style: Cesium.LabelStyle.FILL_AND_OUTLINE } });
完整代码示例
<!-- index.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Cesium 入门 Demo</title>
<script src="node_modules/cesium/Build/Cesium/Cesium.js"></script>
<link href="node_modules/cesium/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
<style>
#cesiumContainer {width: 100%; height: 100vh;}
body {margin: 0; overflow: hidden;}
</style>
</head>
<body>
<div id="cesiumContainer"></div>
<script src="main.js"></script>
</body>
</html>
性能优化
- 内存管理:
- 及时销毁不再使用的实体:
viewer.entities.remove(entity) -
使用
destroy()方法释放资源 -
相机控制:
- 避免频繁调用
flyTo,改用setView -
限制相机移动范围:
viewer.scene.screenSpaceCameraController.enableCollisionDetection = true -
LOD 策略:
- 对大量点数据使用
Cesium3DTileset - 设置适当的
maximumScreenSpaceError值(建议 2 -4)
避坑指南
- 跨域问题:
- 开发时使用
webpack-dev-server代理 -
生产环境配置 CORS 或使用同域服务
-
Token 配置:
- 访问
cesium.com申请免费 Token -
设置方式:
Cesium.Ion.defaultAccessToken = 'your_token' -
坐标系转换:
- WGS84 转笛卡尔坐标:
Cesium.Cartesian3.fromDegrees(lon, lat, height) - 笛卡尔转 WGS84:
Cesium.Cartographic.fromCartesian(cartesian)
进阶建议
- 学习路径:
- 掌握 Cesium 官方示例(Sandcastle)
- 学习 3D Tiles 规范
-
研究 WebGL 底层原理
-
扩展方向:
- 接入 GeoJSON/WMS 等标准服务
- 实现自定义着色器效果
- 开发 Cesium 插件(如测量工具)
思考与实践
尝试实现以下功能挑战:
1. 如何加载本地 DEM 数据作为地形?
2. 怎样实现建筑物随着相机距离改变 LOD?
3. 设计一个交互式测量工具(距离 / 面积)
希望这篇指南能帮助你快速入门 Cesium 开发。遇到问题时,建议多查阅官方文档和社区论坛。Happy coding!
正文完
发表至: 未分类
近一天内
