本文绝大多数内容来自于
https://www.cnblogs.com/mazhenyu/p/8315840.html
在学习原文博客的基础上,记录自己的学习心得--学习完成之后,发现文中没有对许多常见的属性做出解释
例如lable,description,billboard属性等,是否还有其他属性也不尽可知;
初期学习cesium时对czml文件进行过简单的解读,现重新记录一下对czml文件的理解;
czml即为json,但json不一定为czml;如同geojson与json的关系。
czml文件通常为一个对象数组,每个id唯一代表一个对象;
常见属性:
1 id:唯一代表对象的值,可人为指定,也可不指定,由cesium默认指定,但程序无法再通过id去控制该对象;
值得注意的是,id不仅要在同一个czml中唯一,且再同时载入其他czml文件时也得唯一,简单一点记为全局唯一。实际上操作的时候不会全局唯一,具体原因见第6点属性。
2 name:对象的名称;
3 someProperty:时间间隔的定义使用intervals属性,这个属性是可选的--添加 可变属性,
适用于string,number,boolean属性(简单的数组类型)
{
"id":"myObject",
"someProperty":[
{
"interval":"2012-04-30T12:00:00Z/13:00:00Z",
"number":5
},
{
"interval":"2012-04-30T13:00:00Z/14:00:00Z",
"number":6
}
]
}
如果属性值一直不变,则可使用简单的方式来表示
{
"id":"myObject",
"someProperty":{
"interval":"2012-04-30T12:00:00Z/14:00:00Z",
"number":5
}
}
{
"id":"myObject",
"someProperty":5
}
4 复合属性值--笛卡尔坐标位置或颜色,使用数组来表示
{
"id":"myObject",
"someComplexProperty":{
"cartesian":[1.0,2.0,3.0]
}
}
时间不可以省略,否则系统不知道是在数组中采样还是将这个数组取为同一个值;
5 Sampled Property Values 属性值采样 离散时间定义不同的值,客户端根据时间差计算属性值
根据此属性,就可以生成消防演习,等动画了,这也是模型的运动不会跳跃的原因。
{
// ...
"someInterpolatableProperty":{
"cartesian":[
"2012-04-30T12:00Z",1.0,2.0,3.0,
"2012-04-30T12:01Z",4.0,5.0,6.0,
"2012-04-30T12:02Z",7.0,8.0,9.0
]
}
}
采用以上方式需要给每个属性都指定时间,这样工作量具体;因此出现批量采样的声明方式
{
// ...
"someInterpolatableProperty":{
"epoch":"2012-04-30T12:00Z",
"cartesian":[
0.0,1.0,2.0,3.0,
60.0,4.0,5.0,6.0,
120.0,7.0,8.0,9.0
]
}
}
即使用epoch的描述来表示时间采用距离起点时间的秒数来确定
即0秒,60秒,120米,cartesin中的第一个数字表示距离起始的秒数;
这也解释了为何消防演示案例中czml没有指定结束时间,动画却能终止的原因
最后还可以采用一些附加属性来控制采样的方式
{
// ...
"someInterpolatableProperty":{
"epoch":"2012-04-30T12:00Z",
"cartesian":[
0.0,1.0,2.0,3.0,
60.0,4.0,5.0,6.0,
120.0,7.0,8.0,9.0
],
"interpolationAlgorithm":"LAGRANGE",
"interpolationDegree":5
},
}
名称 | Scope 范围 | JSON类型 | 说明 |
epoch | Packet | string | 使用ISO8601规范来表示日期和时间 |
nextTime | Packet | string or number | 在时间间隔内下一个采样的时间,可以通过ISO8061方式,也可以通过与epoch秒数来定义。它决定了不同packet之间的采样是否有停顿。 |
previousTime | Packet | String or number | 在时间间隔内前一个采样的时间,可以通过ISO8061方式,也可以通过与epoch秒数来定义,它决定了不同packet之间的采样是否有停顿。 |
InterpolationAlgorithm | Interval | String | 用于插值的算法,有LAGTANGE,HERMITE和GEODESIC。默认是LAGRANGE。如果位置不在该采样区间,那么这个属性值会被忽略。 |
| Interval | Number |
|
6 EventSource and Streaming 每个id对象作为单独的事件传输到客户端,这样就解决了大json文件读取慢的问题
CZML使用浏览器的server-sent events(EventSource)API来处理流数据---实现增量处理
例如一个CZML文件或流可以包含多个packet,每个packet都有相同的id,分别描述同一个对象的不同方面的属性。 (此点与前文描述矛盾)
CZML提供了previousTime和nextTime子属性,用来处理同一个对象不同时间渲染的问题
{
// ...
"someInterpolatableProperty": {
"epoch": "2012-04-30T12:00:00Z",
"cartesian": [
0.0, 1.0, 2.0, 3.0,
1.0, 4.0, 5.0, 6.0,
2.0, 7.0, 8.0, 9.0,
3.0, 10.0, 11.0, 12.0
],
"previousTime": -1.0,
"nextTime": 4.0
}
}
它的作用是告诉客户端3.0后下一个时间是4.0,就像我们上面举的那个例子,3的后面是8,根据nextTime我们就知道3和8之间肯定还有一段数据没有接收到,所以在开始插值之前我们就需要先等待数据读取完成。
没有必要同时设置previousTime和nextTime,在不同的情况下选择使用其中最方便的一个就可以了。只要定义其中的一个,在进行插值前Cesium就会首先对数据进行完整性检查。
7 Availability属性:表示对象的数据在什么时候是可用的;假如一个对象在当前的动画时间内是可用,但是客户端现在还没有获取到相应的数据(可能在下一packet里面,但现在还没有获取到),那么Cesium就会先暂停,直到获取到数据为止。这个属性的值可以一个字符串表示的一个时间段,也可以是一个字符串数组表示的多个时间段。