CZML是一个JSON模式,描述time-dynamic(时间、动态)图形场景,主要是为了显示在web浏览器中运行铯。它描述了线,点,广告牌(标记),模型,和其他图形原语,并指定他们如何随时间变化。虽然铯富客户端API,CZML允许它是数据驱动的,这样一个通用的铯查看器可以显示丰富的场景不需要任何自定义代码。在许多方面,铯和CZML之间的关系类似于谷歌地球和KML之间的关系。CZML和KML数据格式来描述场景在各自的客户,是由各种各样的应用程序,甚至可能手写。并且都是足够client-agnostic,其他兼容的客户端可以描述的场景渲染。CZML有许多重要的特征,所以:


1:CZML基于Json


2:CZML可以准确描述的属性值随着时间的变化。例如,一条线可以为一个间隔的时间和红蓝。客户也将能够插入time-tagged样本。如果指定车辆的位置在两次,客户端可以准确地显示车辆的位置之间的两次使用CZML-specified插值算法。每一个属性是time-dynamic。


3:CZML结构高效,增量流到客户端。整个文档不需要出现在客户现场之前显示。在很多情况下,个人客户甚至可能加入和离开流虽然在进步。


4. CZML优化客户消费,它的目标是紧凑,容易解析。这也是相当可由人类读和写。


5. CZML是可扩展的。虽然CZML的主要目的是交流一个场景virtual-globe-like客户机,该格式可以很容易地扩展到其他静态或交流time-dynamic数据更复杂的客户端。例

如,time-dynamic数据可能会显示在一个二维图。


6. CZML是一个开放的格式。我们希望尽可能多的项目,利用它,希望有一天形式化与标准的身体,如“[”。


7. 一个开源库,编写CZMLczml-writer。


CZML结构    

注意:这是一项正在进行中的工作,反映出我们的计划不是我们目前的能力。    

CZML是JSON的子集,这意味着一个有效CZML文档也是一个有效的JSON文档。具体

来说,CZML文档包含一个JSON数组,数组中的每个object-literal元素是CZML包。

CZML包描述场景中的图形化一个对象的属性,如一个单一的飞机。    注意:

我们使用javascript注释在评论这些例子,即使在技术上都不允许在JSON。


[

   // packetone

   {

      "id": "GroundControlStation"

      "position": { "cartographicDegrees": [-75.5, 40.0,0.0] },

      "point": {

          "color": { "rgba": [0, 0, 255, 255] },

       }

   },

   // packettwo

   {

      "id": "PredatorUAV",

       // ...

   }

]


每个包都有一个id属性识别对象描述。IDs不需要guid - uri好好id但是他们需要惟一地标识一个对象在一个CZML源和其他CZML源加载到相同的范围。我们将在本文后面详细讨论范围。


如果没有指定一个id,客户端将自动生成一个唯一的一个。然而,这可以防止以后包指的是为了这个对象,例如,添加更多的数据。


除了id、数据包包含零个或多个(但通常是一个或多个)属性定义对象的图形特征。在上面的示例中,我们指定了“GroundControlStation”对象定位在WGS 84东经-75.5度,北纬40.0度,和身高0.0米,一个蓝色的点(点)画在它的位置。..


CZML有许多标准属性定义,包括添加的属性点,广告牌、模型、线、和其他图形到现场。可用的属性CZML内容页面上详细描述。在这一页,我们主要关心的是如何将数据结构。例如,我们描述一个属性可以指定,它有两个不同的值在两个不同的间隔时间。



间隔:


在最一般情况下,CZML属性的值是一个JSON数组,数组中的每个元素是一个对象字面定义属性的值不同的时间间隔。任何给定对象文字描述的间隔在使用一个指定的数组ISO8601间隔间隔属性字符串。


{

  "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

       },

   ]

}


 这里我们定义someProperty属性两个间隔,第一个从中午到下午一点UTC属性的值是5,和其他从下午一点到下午两点钟UTC属性的值是6。的价值将会改变立即当跨越两个间隔之间的边界。我们使用数字来指示值,因为这是一个number-type财产。一些属性,特别是属性表示位置,允许多种格式中指定的值,如笛卡尔X,Y,Z位置或制图经度、纬度、高度位置。CZML内容页面列出了每个属性的类型的数据支持,和价值的名称使用。    间隔属性是可选的。如果没有指定,间隔是认为所有的时间跨度。它没有多大意义指定多个无限的间隔,或间隔重叠在一般情况下,



{

  "id": "myObject",

  "someProperty": {

      "interval": "2012-04-30T12:00:00Z/14:00:00Z",

      "number": 5

   }

}



就像以前一样,间隔属性可以省略,如果它跨越。对于简单值的属性,如上面所示的属性数量,并与一个值,该值可以更简洁:



{

  "id": "myObject",

  "someProperty": 5

}


这个缩写符号是有效的任何属性的值可以表示的一个简单的JSON数据类型:字符串、数字,或布尔



综合值:


更复杂的组合值,如笛卡儿的位置或颜色,使用JSON数组表示。笛卡儿的位置,有三个元素,数组对应X,Y,和Z元件的位置,分别。


{

  "id": "myObject",

  "someComplexProperty": {

      "cartesian": [1.0, 2.0, 3.0]

   }

}



复合值必须始终指定在一个间隔,即使这间隔是无限的如下所示。如果该值,(1.0,2.0,3.0),被允许complexProperty直接的价值,这将是必要的为客户解释CZML看的内容确定数组的数组是一个间隔或一个值列表。所以,为了简单起见,我们不允许这样。    CZML内容页面描述了各种类型的数据进行编码的数组。


样本属性值:


到目前为止,我们已经讨论了如何指定一个值为一个属性,以及如何为属性指定不同的值在不同的离散间隔。一些属性(以及CZML内容页面会告诉你它)也允许您指定time-tagged样本客户机将插入到计算的值属性在任何给定的时间。时间使用ISO8601指定字符串。


{  

   // ...  

  "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  

       ]  

   }  

}


这里我们指定的值是中午(1.0,2.0,3.0),(4.0,5.0,6.0)一分钟后,和(7.0,8.0,9.0),后一分钟。如果客户当前的时钟是30秒过去中午,将价值之间的线性插值(1.0,2.0,3.0)和(4.0,5.0,6.0)或(2.5,3.5,4.5)。



简洁,次时代以来也可以以秒为单位指定。虽然这可能是不如指定每次使用一个精确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  

       ]  

   }  

}


最后,有一些额外的属性使用time-tagged指定样本,可选sub-properties控制插值。


{  

   // ...  

  "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

   },  

}


interpolationAlgorithm指定算法用于插入的值在不同的时间提供数据。可能的值见下表。interpolationDegree属性指定使用的多项式插值的程度。例如,1表示线性插值和2意味着二次插值法。如果没有指定这些属性,使用线性插值。    没有必要对每个样本的时间间隔,其中包含的,但外面的样品将不会使用他们的时间间隔。这有助于提供更好的与高插值精度。   

下表总结了sub-properties interpolatable属性。




ventSource和流媒体


把整个CZML文档放在一个大的JSON数组很难增量加载文档。今天的web浏览器允许一些访问流之前完成,但是解析和解释不完整的数据需要缓慢而繁琐的字符串操作。自高性能流媒体,CZML也可能使用现代浏览器的server-sent事件流(EventSource)API。当使用这个API,每个CZML数据包被发送到客户端作为一个单独的事件:



event: czml

data: {  

   // packetone  

}  


event: czml

data: {  

   // packettwo  

}


因此,浏览器会引发一个事件,当收到每个数据包,包含的数据只是一个包。这使我们能够逐步过程CZML数据具有优良的性能。


到目前为止,我们可能暗示一个对象表示使用单个数据包描述所有与此相关的图形对象。但这并非一定如此。一个CZML流或文档可以包含多个数据包相同的id,描述同一对象的不同方面。


事实上,在某些情况下,两个包甚至可以描述相同的对象的属性。这是有用的,当属性定义在许多间隔或当一个区间包含许多time-tagged样本。通过将属性的完整定义分解成多个包,我们可以得到相关数据到铯早以减少用户必须等待的时间铯开始呈现。


当客户端接收到CZML数据包,它穿过每个属性包含在包中。对于每个属性,它穿过每个属性定义的时间间隔。对于每一个时间间隔,它决定如果指定的间隔已定义的属性。如果时间间隔已经定义,现有的更新间隔;否则,创建一个新的。


当更新现有的区间,任何提供sub-property价值取代现有的价值,如果任何。唯一的例外是当以前的属性值和新的属性值包含time-tagged样本。在这种情况下,样本的样本添加到列表的时间间隔。


当一个新的区间重叠现有的间隔,新的时间优先和现有的间隔完全截断或删除。这是重要的要记住,因为将测试后间隔对截断间隔在确定间隔是否新的或更新现有的一个。


样品在一个时间间隔必须要求通过增加时间在一个包中。在包,但是,它不是必要的样品提供在任何特定的顺序。然而,必须注意确保合理的插值时流不连续样本。



有时考虑的属性时,采样值0.0到0.0,包容,每隔1.0秒。第一个包包含倍0.0到0.0,第二个包含倍8.0到8.0。客户还没有收到第三个包包含倍4.0到4.0。我们可以渲染场景时5.0吗?



一种方法是插入两包。这可能是一个坏主意,因为插值在这种差距会导致一个非常wrong-looking场景,尤其是高插补。所以,我们真的想暂停动画,显示某种“缓冲…”信息给用户,并等待的差距。但是我们如何知道有差距?我们可以推断有差距,因为我们有1.0秒的步骤,然后5.0秒的差距,然后再1.0秒的差距。但这并不是可靠的;也许对象只是移动更慢,间隔,所以我们需要更少的样本。



CZML提供了一个解决方案的形式两个额外的sub-properties使用time-tagged样本: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  

   }  

}

这些属性告诉CZML 3.0客户端后,下一个样品的时间是4.0。如果下一个示例3.0 8.0后,在上面的例子中,客户端知道有差距,和之前它将等待更多数据内插在这一差距。


没有必要指定previousTime和nextTime,尽管一个或另一个在不同的情况下可能会更方便。如果是指定的,相邻插值之前检查样品。


可用性:( Availability)

除了id属性,CZML包有一个额外的特殊属性:可用性。

{  

  "id": "PredatorUAV",

  "availability":"2012-04-30T12:00:00Z/14:00:00Z",

   // ...  

}

可用性属性表明当对象的数据可用。如果数据对象的已知可以在当前动画时间,但是客户还没有数据(可能因为晚些时候将抵达一个包),客户端将会暂停一条消息“缓冲……“虽然它等待接收数据。可以单个字符串属性指定一个时间间隔,或一个字符串数组代表间隔


后面的铯包更新这个可用性如果它改变或被发现是不正确的。例如,一个SGP4传播算子可能报告的可用性,但后来传播算子将抛出一个异常,需要调整。如果这个可选属性不存在,对象被认为是对所有时间可用。可用性是局限于一个特定CZML流,所以两种不同流可以列出不同的可用性为单个对象。在一个流,最后一个可用性声明一个对象是一个实际上和任何可用性在之前的数据包将被忽略。如果一个对象是可用的,客户期望的对象至少有一个属性,它预计需要定义的所有属性。如果对象没有任何属性,或属性定义需要但不是在动画的时间

(扩展)Extending CZML

CZML可以扩展自定义属性。尽量减少冲突,我们建议用户前缀与某种类型的标识符的自定义属性。