经纬志
首页 / Cesium / API 文档

CzmlDataSource

先看结论

CZML 是 Cesium 自带的时间化数据格式,一个数组描述整段动画: 物体什么时候在哪、长什么样、什么时候出现和消失。

最后验证 2026-11-03 · CesiumJS 1.121 · 更新 2026-10-27 · 引用本文
Cesium.CzmlDataSource.load(czml) → Promise<CzmlDataSource>

参数可以是 CZML 数组、JSON 字符串或资源地址。传数组时完全离线, 适合把演示数据内联在页面里。

文档结构

数组的第一个元素固定是 document,声明版本与时钟; 之后每个元素是一个 packet,对应一个随时间变化的对象。

[
  {
    "id": "document",
    "version": "1.0",
    "clock": {
      "interval": "2026-10-27T00:00:00Z/2026-10-27T00:02:00Z",
      "currentTime": "2026-10-27T00:00:00Z",
      "multiplier": 10,
      "range": "LOOP_STOP",
      "step": "SYSTEM_CLOCK_MULTIPLIER"
    }
  },
  {
    "id": "uav-01",
    "name": "无人机 01",
    "availability": "2026-10-27T00:00:00Z/2026-10-27T00:02:00Z",
    "position": {
      "epoch": "2026-10-27T00:00:00Z",
      "cartographicDegrees": [
        0,   116.39, 39.90, 800,
        60,  116.42, 39.93, 900,
        120, 116.45, 39.96, 700
      ]
    },
    "point": {
      "pixelSize": 10,
      "color": { "rgba": [77, 155, 255, 255] }
    },
    "path": {
      "resolution": 2,
      "width": 2,
      "material": { "polyline": { "color": { "rgba": [77, 155, 255, 180] } } }
    }
  }
]

时间与坐标的写法

字段格式说明
interval起/止 ISO8601,斜杠分隔时间区间,两端都包含
epochISO8601采样时间的零点,后续数值都是相对它的秒数
cartographicDegrees[秒, 经度, 纬度, 高度, ...]经纬高,球面坐标,最常用
cartesian[秒, x, y, z, ...]地心直角坐标,单位米
rgba[r, g, b, a]0 到 255 的整数,不是 0 到 1
cartesian2[x, y]二维向量,像素偏移常用

rgba 用 0 到 255。写 [0.3, 0.6, 1, 1] 会得到接近全黑的结果, 这是从 CZML 迁移时最高频的错误。CSS 里的颜色写法不能直接抄过来。

加载并同步时钟

Cesium.CzmlDataSource.load(czml).then(function (ds) {
  viewer.dataSources.add(ds);

  viewer.clock.startTime = Cesium.JulianDate.fromIso8601('2026-10-27T00:00:00Z');
  viewer.clock.stopTime = Cesium.JulianDate.fromIso8601('2026-10-27T00:02:00Z');
  viewer.clock.currentTime = Cesium.JulianDate.fromIso8601('2026-10-27T00:00:00Z');
  viewer.clock.multiplier = 10;
  viewer.clock.shouldAnimate = true;
  viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP;

  viewer.trackedEntity = ds.entities.getById('uav-01');
});

CZML 里的 clock 不会自动接管场景时钟。必须把 viewer.clock 的四项(起点、终点、当前时间、倍速)设成一致, 否则物体停在第一帧或者直接不可见。

常用成员

成员说明
ds.entitiespacket 转换出的实体集合,可用 id 查找
ds.clockCZML 自带的时钟设置,只读参考
ds.name数据源名称
ds.changedEventpacket 更新事件
viewer.dataSources.remove(ds, true)移除并销毁

可用但容易忽略的属性

CZML 的 packet 支持几乎所有实体的图形属性,字段名就是 Entity 的图形名: label、billboard、model、polyline、 polygon、ellipse、wall。 需要让属性随时间变化时,把数值换成 { "number": [秒, 值, ...] } 这类采样结构,而不是写死一个常量。

"label": {
  "text": "无人机 01",
  "font": "12px sans-serif",
  "pixelOffset": { "cartesian2": [0, -22] },
  "fillColor": { "rgba": [255, 255, 255, 255] }
},
"billboard": {
  "image": "/icons/uav.png",
  "scale": { "number": [0, 0.4, 120, 0.8] }
}

三个常见问题

1. 动画不动

按顺序检查:clock.shouldAnimate 是否为 true、Viewer 是否开了 requestRenderMode、packet 的 availability 是否覆盖当前时间。 三者任一不满足,画面都静止。

2. 物体跳变而不是平滑移动

position 的采样点之间默认按线性插值。需要平滑曲线时, 用 interpolationAlgorithm: "LAGRANGE" 与 interpolationDegree: 5,代价是采样点必须足够密。

3. 与 GeoJSON 混合使用

CZML 与 GeoJSON 可以同时加到 viewer.dataSources, 但两者各自带 clock 时以后添加的为准。多份时间化数据要统一时, 在添加完成后再显式设一次 viewer.clock 的四项。

引用本文

经纬志(2026)。《CzmlDataSource》。https://www.jingweizhi.com/cesium/api/czml-datasource.html(访问日期 2026-11-03)。