Cesium Language (CZML)入门--(一)_第1页
Cesium Language (CZML)入门--(一)_第2页
Cesium Language (CZML)入门--(一)_第3页
Cesium Language (CZML)入门--(一)_第4页
Cesium Language (CZML)入门--(一)_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Cesium Language (CZML) 入门-(一)罗松与拇指 翻译整理luosong01230123H2014-07-30北京CZML是一种用来描述动态场景的JSON架构的语言,主要用于Cesium在浏览器中的展示。它可以用来描述点、线、布告板、模型以及其他的图元,同时定义他们是怎样随时间变化的。Cesium拥有一套富客户端API,通过CZML采用数据驱动的方式,不用写代码我就可以使用通用的Cesium viewer构建出丰富的场景。Cesium与CZML的关系就如同Google Earth和KML的关系。CZML和KML都是用来描述场景的数据格式,可以通到很多其他的程序自动生成,或者

2、手写也可以。CZML拥有很多的特性,其中有一些区别于KML的:1. CZML 是基于JSON的。2. CZML可以准确的描述值随时间变化的属性。理由,一条在某一时间内是红色的而在另一时间内是蓝色的。同时客户端可以根据时间戳进行差值。加入有一辆车,分别定义了两个不同时间的位置,通过CZML定义的差值算法,客户端可以准确的显示在这两个时间点之间车的位置。所有属性都可以是随时间变化的。3. CZML通过增量流的方式传送到客户端。在场景显示之前,整个CZML文档需要首先被下载到客户端。在某些情况下,个别客户端可能会加入或离开正在传输的流。(这段翻译的不好)4. CZML高度优化,旨在解析时更紧凑也更容

3、易,让人工的读写更容易。5. CZML可扩展,尽管CZML的主要作用在与虚拟地球客户端程序与场景的交流,但它可以很容易的通过扩展来满足其他一些辅助的程序对静态或动态数据的需求。例如,随时间动态变化在数据就可以用在某些2D的图表程序中。6. CZML是一个开放的格式。我们希望有更多的程序能使用CZML,同时期待有一天它也能成为OGC一样的标准。7. 可以通过czml-writer来生成CZML,这个程序维护在Github上。我们将CZML标准已经它的相应实现分为4个部分:CZML Structure - CZML文档的整体结构CZML Content -内容CZML in Cesium - Ce

4、sium中解析和显示CZML的流程czml-writer-Architecture czml-writer的架构 CZML StructureCZML是json的一个子集,也就是说一个有效的CZML文档同时也是一个有效的JSON文档。特别的,一个CZML文档包含一个JSON数组,数组中个每一个对象都是一个CZML数据包(packet),一个packet对应一个场景中的对象,例如一个飞机。Note:在下面的例子中我们使用javascript方式的注释来帮助理解CZML,但在真实场景中是不允许的。 / packet one "id": "GroundControlSt

5、ation" "position": "cartographicDegrees": -75.5, 40.0, 0.0 , "point": "color": "rgba": 0, 0, 255, 255 , , / packet two "id": "PredatorUAV", / . 每个packet都有一个id属性用来标示我们当前描述的对象。IDs do not need to be GUIDs- URIs make good IDs -(不

6、知道怎么翻译),但是在同一个CZML以及与它载入同一个范围(scope)内的其他CZML文件中必须是唯一的。随后我们将讨论scope的含义。假如没有指定id,那么客户端将自动生成一个唯一的id。但是这样的话在随后的包中我们就没有办法引用它了,例如我们不能再往它里面添加数据。除了id以为,一个包通常还包含0到多个(正常情况下是1到多个)定义对象图形特征的属性。正如上面的例子,我们定义了一个“GroundControlStation”对象,它拥有一个固定的经度-75.0维度40.0的WGS84坐标,高度为0,随后一个蓝色的点将会绘制在他的坐标位置处。CZML还有很多标准的属性,包括用来添加点、布告

7、板、模型、线以及其他图形到场景的属性。所有这些属性将在CZML Content这节讨论。在这里我们主要讨论这些数据是怎样组织的。例如,我们怎样定义一个属性,使它在两个不同的时间拥有两个不同的值。时间间隔Intervals通常情况下CZML的属性值是一个数组,数组中的每个元素对应每一个不同的时间,属性的值。时间间隔的定义使用interval 属性,通过ISO8601 interval格式的字面值表示。 "id": "myObject", "someProperty": "interval": "2012-0

8、4-30T12:00:00Z/13:00:00Z", "number": 5 , "interval": "2012-04-30T13:00:00Z/14:00:00Z", "number": 6 , 这里我们定义了一个someProperty属性,它有两个时间间隔,第一个是从中午到下午一点,属性值为5,第二个是从下午一点到下午两点,属性值为6,在时间由第一个间隔变化到第二个间隔的时候,属性值会瞬间从5变到6。注意,这里的时间为UTC(协调世界时),而我们国家通常使用的是UTC+8也就是北京时间,所以要注

9、意。我们使用number来表示属性是一个数字类型的属性。值得注意的是有些属性允许通过不同的格式来定义,例如表示表示位置的属性可以通过笛卡儿坐标的X、Y、Z表示,也可以通过经纬度和高程来表示。CZML Content一节将会详细讨论。Interval属性是可选的,你可以定义也可以不定义,如果没有定义,默认为整个时间。通常定义多个无限的时间间隔或者间隔之间有重叠是没什么意思的,如果你非要这么做,那么在CZML中最后定义的时间间隔将拥有较高的优先级。通常情况下属性值只跨越一个时间间隔,这时候你间隔列表可以省略。 "id": "myObject", "

10、someProperty": "interval": "2012-04-30T12:00:00Z/14:00:00Z", "number": 5 和之前的一样,加入interval跨越整个时间,那么你可以省略掉它。对于一些简单的值,例如上面我们使用的数字类型,加入它对于整个时间来说都不变,那么我还可以定义的更简单一些。 "id": "myObject", "someProperty": 5这种简略的表示法,适用于所有值是简单的json 数据类型(string、num

11、ber、boolean)的的属性。复合值Composite Values一些复杂的值复合值例如笛卡尔坐标位置或颜色,是通过json数组的形式来表示。例如坐标位置,所使用的数组有三个元素,分别对应于坐标的x、y和z。 "id": "myObject", "someComplexProperty": "cartesian": 1.0, 2.0, 3.0 合成值必须定义在间隔中,即使他的时间间隔是无限的也是一样,不能采用简略的写法。假如允许值1.0,2.0,3.0直接作为someComplexProperty的属性值,那

12、么客户端代码就需要解析CZML并且判断数组里面的值到底是时间间隔列表(intervals list)还是说是简单的值。为了简单起见,我们不允许这样的写法。属性值采样Sampled Property Values到目前为止我们讨论的了怎样为那些横跨整个时间的的属性定义单一的值,以及针对离散的时间间隔定义不同的值。一些属性(CZML Content一节将告诉你是那些)允许你定义时间戳采样,客户端通过给定的时间差值计算出属性的值。时间的定义是采用ISO8601标准字符串。 / . "someInterpolatableProperty": "cartesian"

13、;: "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 在这里我们指定在中午的时候属性值为1.0,2.0,3.0,一分钟后为4.0,5.0,6.0,再过一分钟后变为7.0,8.0,9.0。假如客户端当前的时间是12点0分30秒,也就是离开始时间过去了30秒,那当前的属性值将通过在1.0, 2.0, 3.0和4.0, 5.0, 6.0线性差值得出,为2.5, 3.5, 4.5

14、。简单起见,时间使用距离起始时间(epoch)的秒数来表示。与每个时间都通过ISO8601字符串表示相比这样不是很精确,不过对于采样间隔在一天以内,或者偏移值示整数的时候这样的精度还是绰绰有余。 / . "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 最后,使用时间戳采样的属性还有一些附加的可选的

15、子属性,用来控制采样的方式。 / . "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 , interpola

16、tionAlgorithm定义了采样使用的算法,下面的表格中列出了可能的值。interpolationDegree定义了用来插值所使用的多项式的次数,1表示线性差值,2表示二次插值法,默认为1.每个采样值的时间没有必要落在包含它的时间间隔内。但是这些采样值在他们的时间间隔内不会被使用。这样的好处就是对于多次差值有更好的精度。It is not necessary for the time of every sample to fall within the interval that contains it, but the samples will not be used outside t

17、heir interval. This is useful to provide better accuracy with higher-degree interpolation.(这句很绕啊,自己看吧)下表总结了可插值属性的一些子属性:名称Scope 范围JSON类型说明epochPacketstring使用ISO8601规范来表示日期和时间nextTimePacketstring or number在时间间隔内下一个采样的时间,可以通过ISO8061方式,也可以通过与epoch秒数来定义。它决定了不同packet之间的采样是否有停顿。previousTimePacketString or

18、number在时间间隔内前一个采样的时间,可以通过ISO8061方式,也可以通过与epoch秒数来定义,它决定了不同packet之间的采样是否有停顿。InterpolationAlgorithmIntervalString用于插值的算法,有LAGTANGE,HERMITE和GEODESIC。默认是LAGRANGE。加入没有定义采样,那么这个属性值会被忽略。interpolationDegreeIntervalNumber定义了用来插值所使用的多项式的次数,1表示线性差值,2表示二次插值法,默认为1。如果使用GEODESIC插值算法,那么这个属性将被忽略。EventSource and Stre

19、aming如果将整个CZML文件安排在一个大的JSON数组中,这使增量加载变得很困难。虽然浏览器允许我们访问没有读取完的流数据,但是解析不完整的数据需要漫长而繁琐的字符串操作。为了高效,CZML使用浏览器的server-sent events(EventSource)API来处理流数据。在实际操作中,每一个CZML的packet包会被作为单独的一个事件传输到客户端。event: czmldata: / packet one event: czmldata: / packet two 当浏览器接收到一个packet后就会发出一个事件,事件中会包含刚刚接收到了数据。这样我们就可以通过增量的方式高效

20、的处理CZML数据。目前为止,我们都是使用一个packet包来描述一个对象,这个packet包含了所有这个对象的图形属性。我们还可以使用其他的方式,例如一个CZML文件或流可以包含多个packet,每个packet都有相同的id,分别描述同一个对象的不同方面的属性。事实上在大多数情况下我们使用两个packet来描述一个对象。当对象属性跨越多个时间间隔,或者一个时间间隔有很多歌时间戳采样时,这样做就很有用了。通过将一个属性定义打包进多个packet,我可以是数据更快的传输到Cesium中,减少用户等待的时间。当客户端接收到一个packet,它会遍历packet中的每一个属性。对于每个属性,它会遍

21、历属性定义的每个时间间隔。对于每个时间间隔,它会判断这个时间间隔是否已经定义,假如这个间隔已经定义,将更新已经存在的间隔,如果没有定义,那么就根据这个间隔创建一个新的。当更新一个已存在的时间间隔时,假如有子属性,那么子属性将覆盖原有的值。有一个例外,就是当已有的属性和新接收到的属性都包含时间戳采样时,新接收到的采样不会覆盖已有的,而是加到已有的采样列表中。当新的时间间隔与已有的发生重叠时,新的间隔拥有较高优先级,原有的间隔将被截断或者整个移除。这点必须要牢记。在同一个packet中的时间间隔的时间必须以增序排列,不同packet之间就没有要求。但是对于不连续的采样还是应该考虑合理的插值顺序。考

22、虑一下,我们有一个需要插值的属性,时间是0到10秒,间隔为1。第一个packet包含0到3秒,第一个包含8到10秒。在客户端还没有接收到包含4到7秒的packet时,我们可以渲染时间为5的场景吗?一种方式是我们就是使用已经接收到的两个packet来插值。这可能不太好,因为即使我们使用高次插值,在这个两个packet的间隙中得出的值可能也是错的。所以,我们最好还是先暂停等待中间的那个packet赶快到来。但是我们是怎么之间两个包之间有间隙的呢?我们可以猜想,刚开始的时候间隔是1秒,后来变成了5秒,再后来又变回了1秒,所以中间应该还有一个包。这个猜想只是逗你玩的,万一人家中间就是想少采样几个点呢。

23、这都不是事儿,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和nextT

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论