Cesium中的CZML文件结构解析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cesium中的CZML文件结构解析相关的知识,希望对你有一定的参考价值。

参考技术A

本文在官方介绍基础上简化总结而成

CZML 可以理解为 Cesium Language 的简写,是cesium中很重要的一个概念,使得cesium很酷很炫地展示动态数据成为可能
某种程度上说, Cesium 和 CZML的关系就像 Google Earth 和 KML。

一段示例:

在上面的示例中,我们指定了“ GroundControlStation”对象在WGS 84经度-75.5度,纬度40.0度和高度0.0米处具有固定的位置,并在其位置绘制了一个蓝色的Point。

每个数据包都有一个id属性,用于标识正在描述的对象。 ID不必是GUID,但它们确实需要唯一地标识CZML源中的单个对象以及加载到同一作用域中的任何其他CZML源。

如果未指定ID,客户端将自动生成一个唯一的ID。但是,这会阻止以后的数据包引用该对象,以便例如向该对象添加更多数据。

定义某个属性在不同时间间隔内的值时,将该属性定义为一个数组,并用 interval 属性定义在不同时间段的值。

这个示例中,在两个时间间隔内定义someProperty属性,
第一个时间间隔是中午12:00到1:00 PM(属性值是5),
第二个时间间隔是1:00 PM到2:00 PM UTC(属性值是6),
跨越两个间隔之间的边界时,该值将立即更改。我们使用数字来表示值,因为这是一个数字类型的属性。一些属性(尤其是表示位置的属性)允许以多种格式指定值,例如笛卡尔X,Y,Z位置或制图经度,纬度,高度位置。每种类型的页面列出了每种属性支持的数据类型,以及每种属性所使用的值名称。

interval属性是可选的。如果未指定,则假定该间隔跨越所有时间。指定多个无限间隔或通常重叠的间隔没有多大意义,但是如果您指定了此间隔,则在CZML文件或流中的后面一个优先。

如果属性的值在一个长间隔上不变,则只需定义一个,间隔数组可以省略。

如果所有时间内,值都不变,则可简写为:

该缩写表示法对于其值可以用一种简单的JSON数据类型(字符串,数字或布尔值)表示的任何属性均有效。

用JSON数组来表示更复杂的复合值,例如笛卡尔位置或颜色。
对于笛卡尔位置,数组具有三个元素,分别对应于该位置的X,Y和Z分量。

除了上面介绍的可以定义不同时间间隔的单一值和复合值,还可以定义不同时间点的采样值,客户端会根据这些值进行插值计算,补上没有赋值的时间的数据。
注意时间使用ISO 8601字符串指定。

这个示例定义了三个时间点的坐标,则后续时间的值会根据这三个值线性插值计算得出。
这个也可以简写,定义一个开始时间,数据默认以整秒递增,例如:

另外,可以用其他属性控制插值方式

interpolationAlgorithm 属性可选值: "LINEAR", "LAGRANGE", and "HERMITE".
interpolationDegree 属性可选值:1表示线性差值,2表示二次插值法

将整个CZML文档放在一个大JSON数组中,将很难以增量方式加载该文档。 当今的网络浏览器允许在流完成之前对流进行一些访问,但是解析和解释不完整的数据需要缓慢而麻烦的字符串操作。 为了促进高性能流传输,还可以使用现代浏览器的服务器发送事件(EventSource)API来流传输CZML。 使用此API时,每个CZML数据包都作为单独的事件流传输到客户端:

当浏览器接收到一个packet后就会发出一个事件,事件中会包含刚刚接收到了数据。这样我们就可以通过增量的方式高效的处理CZML数据。

目前为止,我们都是使用一个packet包来描述一个对象,这个packet包含了所有这个对象的图形属性。我们还可以使用其他的方式,例如一个CZML文件或流可以包含多个packet,每个packet都有相同的id,分别描述同一个对象的不同方面的属性。

事实上在大多数情况下我们使用两个packet来描述一个对象。当对象属性跨越多个时间间隔,或者一个时间间隔有很多个时间戳采样时,这样做就很有用了。通过将一个属性定义打包进多个packet,我们可以使数据更快的传输到Cesium中,减少用户等待的时间。

当客户端接收到一个packet,它会遍历packet中的每一个属性。对于每个属性,它会遍历属性定义的每个时间间隔。对于每个时间间隔,它会判断这个时间间隔是否已经定义,假如这个间隔已经定义,将更新已经存在的间隔,如果没有定义,那么就根据这个间隔创建一个新的。

当更新一个已存在的时间间隔时,假如有子属性,那么子属性将覆盖原有的值。有一个例外,就是当已有的属性和新接收到的属性都包含时间戳采样时,新接收到的采样不会覆盖已有的,而是加到已有的采样列表中。

当新的时间间隔与已有的发生重叠时,新的间隔拥有较高优先级,原有的间隔将被截断或者整个移除。这点必须要牢记。

在同一个packet中的时间间隔的时间必须以增序排列,不同packet之间就没有要求。但是对于不连续的采样还是应该考虑合理的插值顺序。

如果定义的两个时间段之间时间没有连接上,比如1-3,7-9,中间4-6时间的数据是插值还是空着呢?就用到 previousTime 和 nextTime 属性了

Availability属性指示对象的数据何时可用。如果已知某个对象的数据在当前动画时间可用,但是客户端尚未获得该数据(大概是因为它将在以后的数据包中到达),则客户端可以暂停并显示诸如“正在缓冲...等待接收数据。该属性可以是指定单个间隔的单个字符串,也可以是表示间隔的字符串数组。

假如availability变化了或者被发现是不正确的,那么随后的packet将会更新它的值。例如,一个SGP4 propagator可能总是可用的,但是随后他发出了一个异常,所以他的值需要调整。如果availability属性没有定义,那么默认是全部时间内都可用的。Availability的范围被限定到一个特定的CZML流中,所以对同一个对象在两个不同的流中可以有不同的availability。在一个流中,只有定义在最后的那个availability起作用,其他的都会被忽略。在某一时刻,如果一个对象是可用的,那么这个对象至少要有一个可用的属性并且在此时间段内需要的属性都要有定义(也就是获取到了数据),不然Cesium就会等待数据直到接收到数据为止。

可以给CZML增加自定义属性,但是为避免冲突,我们强烈建议你给你的自定义属性加上你特有的前缀。

Cesium CZML 几何形状

CZML可以用来描述点、线、布告板、模型以及其他的图元。

billboard

point

label

polyline

path

polygon

ellipsoid

ellipse

以上是关于Cesium中的CZML文件结构解析的主要内容,如果未能解决你的问题,请参考以下文章

cesium加载卫星轨道czml数据

使用 HTML5 EventSource 将 CZML 流式传输到 Cesium

cesium czml 3d模型动画

Cesium源码解析一(terrain文件的加载解析与渲染全过程梳理)

cesium 何如加载大数据量的geojson格式的数据,geojson有切片吗

Cesium官方教程13--Cesium和Webpack