点击查看:最新Cesium可视化系统实战视频课程
在Cesium中,CZML(Cesium Markup Language)是一种基于JSON格式的标准,用于描述3D地球上动态和静态实体的各种属性。它被广泛用于表示和传输时间变化的数据,如物体的运动轨迹、位置变化、旋转状态等。通过CZML,用户可以轻松地在Cesium中加载复杂的时间动态场景。
本篇文章将详细讲解CZML数据格式,通过分析示例代码来帮助读者更好地理解其组成部分及使用方法。
1. CZML的基本结构
CZML文件的基本结构是一个由多个对象(对象是字典或键值对)组成的数组。每个对象都代表了一个实体或文档元素。最顶层的对象是一个文档对象,包含了整个数据集的配置信息。其他对象则可以表示不同的实体或图层。
例如,示例中的CZML数据由三个主要对象组成:
- 文档对象(Document):包含文档的元数据以及全局设置。
- 实体对象(CesiumMilkTruck):描述了一个动态模型,包含了模型的几何体、位置和旋转等属性。
- 路径对象(Polyline):描述了一个由一系列位置点组成的路径。
2. 文档对象(Document)
文档对象通常是CZML文件的根对象,包含了整个数据的配置项。它通常包含文档的版本信息和一些全局设置(如时钟设置)。
示例分析:
{
"id": "document",
"version": "1.0",
"clock": {
"interval": "2018-07-19T15:18:00Z/2018-07-19T15:18:30Z",
"currentTime": "2018-07-19T15:18:00Z",
"multiplier": 2,
"range": "LOOP_STOP",
"step": "SYSTEM_CLOCK_MULTIPLIER"
}
}
id
: 标识符,通常设置为document
,表示这是文档对象。version
: 版本信息,表示CZML文件的版本号。clock
: 时钟配置,决定了时间的流动方式及速度。
-
interval
: 表示时间的范围,指示数据变化的时间段。currentTime
: 当前时间,时钟在这个时刻开始。multiplier
: 时间加速因子,这里设置为2,表示时间以2倍速播放。range
: 时间范围的循环方式,这里使用的是LOOP_STOP
,意味着时间范围循环播放直到停止。step
: 时间的步进方式,SYSTEM_CLOCK_MULTIPLIER
表示时间步长按照系统时钟的倍数调整。
通过clock
对象的配置,可以控制数据的时间动画,例如如何播放、暂停、循环等。
3. 实体对象(CesiumMilkTruck)
实体对象代表一个具体的3D实体(如模型、点、线等),并包括其在空间中的位置、朝向、时间上的动态变化等信息。
示例分析:
{
"id": "CesiumMilkTruck",
"model": {
"gltf": "SampleData/models/CesiumMilkTruck/CesiumMilkTruck.glb"
},
"position": {
"interpolationAlgorithm": "LINEAR",
"forwardExtrapolationType": "HOLD",
"cartesian": [
"2018-07-19T15:18:00Z",
1216327.3893347275,
-4736164.778028102,
4081507.5209477833,
"2018-07-19T15:18:10Z",
1216369.543258349,
-4736201.237448179,
4081447.3732212726,
"2018-07-19T15:18:20Z",
1216434.7507773656,
-4736241.372142024,
4081386.1802605274,
"2018-07-19T15:18:30Z",
1216525.7792628652,
-4736271.927759278,
4081319.744558958
]
},
"orientation": {
"unitQuaternion": [
0.3084011337938999,
0.3210181022701266,
-0.45850421987074924,
0.7686388857813198
]
}
}
id
: 标识符,用于标识实体,这里为CesiumMilkTruck
。model
: 表示模型信息,这里是一个GLTF模型文件CesiumMilkTruck.glb
。position
: 表示实体的位置数据,包括位置的时间动态变化。
-
interpolationAlgorithm
: 位置插值算法,LINEAR
表示线性插值,实体位置按恒定速度平滑过渡。forwardExtrapolationType
: 如果时间超出指定范围,实体将保持在最后位置,这里使用HOLD
模式。cartesian
: 以笛卡尔坐标表示的位置数据,并结合时间轴表示位置随时间的变化。每一对坐标点对应着一个时间点。
-
-
- 每个位置由时间戳和对应的坐标(X, Y, Z)组成。坐标是3D笛卡尔坐标系中的位置。
-
orientation
: 表示实体的朝向信息。
-
unitQuaternion
: 以单位四元数表示的旋转状态,定义了实体的空间旋转。
4. 路径对象(Polyline)
路径对象用于表示一条由多个坐标点组成的路径。例如,使用一条路径来展示一个物体的运动轨迹。
示例分析:
json
{
"id": "Polyline",
"polyline": {
"positions": {
"cartesian": [
1216327.3893347275,
-4736164.778028102,
4081507.5209477833,
1216369.543258349,
-4736201.237448179,
4081447.3732212726,
1216434.7507773656,
-4736241.372142024,
4081386.1802605274,
1216525.7792628652,
-4736271.927759278,
4081319.744558958
]
},
"material": {
"polylineOutline": {
"color": {
"rgba": [100, 149, 237, 140]
},
"outlineWidth": 0
}
},
"width": 12,
"clampToGround": true
}
}
json
id
: 标识符,用于标识路径对象,这里为Polyline
。polyline
: 定义路径的属性。
-
positions
: 路径上的位置点,以笛卡尔坐标表示。material
: 路径的外观样式,这里使用了带轮廓的折线(polylineOutline
),颜色设置为蓝色(RGB: 100, 149, 237)。width
: 设置路径的宽度,这里设置为12像素。clampToGround
: 设置路径是否贴地,true
表示路径将被固定到地面上。
5. 在Cesium中加载CZML数据
const dataSourcePromise = viewer.dataSources.add(
Cesium.CzmlDataSource.load(czml)
);
dataSourcePromise.then((dataSource) => {
viewer.trackedEntity = dataSource.entities.getById("CesiumMilkTruck");
});
以上代码展示了如何在Cesium中加载CZML数据。viewer.dataSources.add
方法将CZML数据添加到Cesium的视图中,dataSource.entities.getById("CesiumMilkTruck")
则用于获取特定的实体对象(在这里是CesiumMilkTruck
),并将其设为当前视角追踪的实体。通过此方式,用户可以在Cesium中查看并交互操作动态变化的实体。
6. 总结
CZML格式是Cesium中强大的数据描述工具,能够处理时间动态数据、物体位置、旋转、路径等信息。通过灵活的配置和时间控制功能,CZML为3D地球和空间应用的开发提供了强大的支持。无论是单一实体的运动,还是多个实体之间的复杂交互,CZML都能提供精确而灵活的控制。在实际应用中,通过对CZML的解析与使用,开发者可以实现富有表现力和互动性的3D可视化场景。