跳到主要内容

基础概念

本页介绍使用 DMap3D SDK 开发时需要了解的核心概念。

Viewer(场景容器)

Viewer 是 Cesium 的核心类,负责管理整个 3D 场景的渲染和交互。一个页面通常只创建一个 Viewer 实例。

const viewer = new Cesium.Viewer('cesiumContainer', {
animation: false, // 动画控件
timeline: false, // 时间轴
baseLayerPicker: false, // 底图选择器
})

常用属性

属性说明
viewer.scene场景对象,管理渲染和地球
viewer.camera相机对象,控制视角
viewer.entities实体集合
viewer.imageryLayers影像图层集合
viewer.scene.primitives图元集合(3DTiles 等)

生命周期

// 创建
const viewer = new Cesium.Viewer(container, options)

// 使用
viewer.entities.add({ ... })
viewer.camera.flyTo({ ... })

// 销毁(释放内存,必须调用)
viewer.destroy()
注意

在 React 中务必在 useEffect 的清理函数中调用 viewer.destroy(),防止内存泄漏。

坐标系统

Cesium 使用多种坐标系统,理解它们之间的关系很重要。

经纬度(度)

最直观的地理坐标表示:

// 经度、纬度、高度(米)
const longitude = 116.4074 // 东经
const latitude = 39.9042 // 北纬
const height = 100 // 海拔高度

Cartesian3(笛卡尔坐标)

Cesium 内部使用的三维直角坐标系,地心为原点:

// 经纬度 → Cartesian3
const position = Cesium.Cartesian3.fromDegrees(116.4074, 39.9042, 100)

// 弧度 → Cartesian3
const position2 = Cesium.Cartesian3.fromRadians(lon, lat, height)

Cartographic(弧度坐标)

// Cartesian3 → Cartographic
const carto = Cesium.Cartographic.fromCartesian(position)
const lon = Cesium.Math.toDegrees(carto.longitude)
const lat = Cesium.Math.toDegrees(carto.latitude)
const alt = carto.height

坐标转换速查

经纬度(度) ←→ Cartesian3 ←→ Cartographic(弧度)
转换方向方法
度 → Cartesian3Cesium.Cartesian3.fromDegrees(lon, lat, height)
Cartesian3 → 度Cesium.Cartographic.fromCartesian(pos) + Math.toDegrees
度 → 弧度Cesium.Math.toRadians(degrees)
弧度 → 度Cesium.Math.toDegrees(radians)

Entity(实体)

Entity 是在场景中添加可视化对象的最简单方式,支持点、线、面、标签等。

// 添加点
viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(116.4074, 39.9042),
point: {
pixelSize: 10,
color: Cesium.Color.RED,
},
})

// 添加线
viewer.entities.add({
polyline: {
positions: Cesium.Cartesian3.fromDegreesArray([
116.39, 39.90,
116.41, 39.92,
]),
width: 3,
material: Cesium.Color.YELLOW,
},
})

// 添加多边形
viewer.entities.add({
polygon: {
hierarchy: Cesium.Cartesian3.fromDegreesArray([
116.39, 39.90,
116.41, 39.90,
116.41, 39.92,
116.39, 39.92,
]),
material: Cesium.Color.BLUE.withAlpha(0.5),
},
})

Camera(相机)

相机控制场景的观察视角。

即时定位

viewer.camera.setView({
destination: Cesium.Cartesian3.fromDegrees(116.4074, 39.9042, 10000),
orientation: {
heading: Cesium.Math.toRadians(0), // 朝向(0=北)
pitch: Cesium.Math.toRadians(-45), // 俯仰(负值=向下看)
roll: 0,
},
})

飞行动画

viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(116.4074, 39.9042, 10000),
duration: 2.0, // 飞行时间(秒)
})

视角参数

参数说明范围
heading水平朝向0°=北, 90°=东, 180°=南, 270°=西
pitch俯仰角-90°=正下方, 0°=水平
roll翻滚角通常为 0

影像图层(Imagery)

影像图层是覆盖在地球表面的 2D 地图底图。

天地图(推荐国内使用)

// 卫星影像
const imgLayer = new Cesium.WebMapTileServiceImageryProvider({
url: 'https://t0.tianditu.gov.cn/img_w/wmts?tk=YOUR_TOKEN',
layer: 'img',
style: 'default',
tileMatrixSetID: 'w',
format: 'tiles',
maximumLevel: 18,
})

// 矢量注记(叠加在影像上显示地名)
const ciaLayer = new Cesium.WebMapTileServiceImageryProvider({
url: 'https://t0.tianditu.gov.cn/cia_w/wmts?tk=YOUR_TOKEN',
layer: 'cia',
style: 'default',
tileMatrixSetID: 'w',
format: 'tiles',
maximumLevel: 18,
})

// 添加注记图层
viewer.imageryLayers.addImageryProvider(ciaLayer)

图层管理

// 添加图层
const layer = viewer.imageryLayers.addImageryProvider(provider)

// 设置透明度
layer.alpha = 0.5

// 移除图层
viewer.imageryLayers.remove(layer)

地形(Terrain)

地形让地球表面有真实的高程起伏。

// 使用 Cesium Ion 全球地形
const viewer = new Cesium.Viewer(container, {
terrain: Cesium.Terrain.fromWorldTerrain(),
})

// 无地形(平面椭球体)
const viewer = new Cesium.Viewer(container, {
terrainProvider: new Cesium.EllipsoidTerrainProvider({}),
})
选择地形
  • 需要地形分析(坡度、剖面等)时使用 fromWorldTerrain()
  • 只需要平面展示时使用 EllipsoidTerrainProvider,加载更快

3DTiles(三维模型)

3DTiles 是用于流式传输大规模三维数据(建筑、倾斜摄影等)的标准格式。

// 加载 3DTiles
const tileset = await Cesium.Cesium3DTileset.fromUrl(
'/3DTiles/model/tileset.json'
)
viewer.scene.primitives.add(tileset)

// 飞到模型位置
viewer.zoomTo(tileset)

DMap3D 命名空间

DMap3D SDK 通过命名空间组织所有功能模块:

DMap3D
├── measurement // 测量工具
│ ├── spaceDistance // 空间距离
│ ├── horizontalDistance // 水平距离
│ ├── surfaceDistance // 贴地距离
│ ├── area // 面积
│ ├── height // 高度
│ ├── angle // 角度
│ ├── slope // 坡度
│ └── azimuth // 方位角
├── analysis // 分析工具
│ ├── viewshed // 可视域
│ ├── viewshedArea // 区域可视域
│ ├── contour // 等高线
│ ├── profile // 剖面
│ ├── skyline // 天际线
│ ├── bufferAnalysis // 缓冲区
│ ├── elevationExtremum // 高程极值
│ ├── aspectAnalyse // 坡向
│ ├── slopAnalyse // 坡度分析
│ ├── cutFill // 填挖方
│ └── flattenAnalysis // 压平
├── drawing // 绘制工具
│ ├── point // 点
│ ├── polyline // 线
│ ├── polygon // 多边形
│ └── circle // 圆
└── military // 军事标绘
├── FineArrow // 精细箭头
├── StraightArrow // 直箭头
└── ... // 更多标绘

使用模式

所有工具遵循统一的生命周期:

// 1. 创建工具(传入 viewer)
const tool = new DMap3D.measurement.spaceDistance(viewer, options)

// 2. 激活工具
tool.activate()

// 3. 用户交互(左键操作,右键结束)

// 4. 清除结果
tool.clear()

// 5. 销毁工具
tool.destroy()

资源清理

在 Cesium 和 DMap3D 中,正确清理资源非常重要:

useEffect(() => {
const viewer = new Cesium.Viewer(container)
const tool = new DMap3D.measurement.area(viewer)

return () => {
// 先销毁工具
tool.destroy()
// 再销毁 Viewer
viewer.destroy()
}
}, [])
内存泄漏

如果不调用 destroy(),Cesium 的 WebGL 上下文和事件监听器不会被释放,会导致严重的内存泄漏。

下一步

掌握了基础概念后,可以深入学习: