Skip to content

Clock 时钟

viewer.clock 属性表示系统时钟,类型为 Clock,其使用的时间为 儒略日(Julian Day)

clock

属性

startTime:开始时间,默认为程序启动时的时间

endTime:结束时间,默认为开始时间的 24 小时后

currentTime:当前时间,当前时间是实时改变的

multiplier:时间速率,时间运行的快慢,默认为 1 正常时间速度。

clockRange:时钟运行到结束时间后如何处理,暂停/重新开始/继续

onTick:时钟运行事件,触发频率相当高

onStop:时钟暂停事件

常见代码

设置时钟的起止时间

ts
viewer.clock.startTime = start.clone();
viewer.clock.stopTime = stop.clone();
viewer.clock.currentTime = start.clone();
viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP;
viewer.clock.multiplier = 1;

设置时间轴上的时间范围

ts
viewer.timeline.zoomTo(start.clone(), stop.clone());

格式化时间显示

  • 格式化时间轴上的时间显示

timeline

时间轴上的时间显示格式是 UTC 格式,很不符合我们的观看习惯,我们可以通过覆写时间轴的 makeLabel 方法来实现自定义格式化,makeLabel 是一个私有方法,文档中看不到,其源码如下。

ts
/**
 * @private
 */
Timeline.prototype.makeLabel = function (time) {
  const gregorian = JulianDate.toGregorianDate(time);
  const millisecond = gregorian.millisecond;
  let millisecondString = " UTC";
  if (millisecond > 0 && this._timeBarSecondsSpan < 3600) {
    millisecondString = Math.floor(millisecond).toString();
    while (millisecondString.length < 3) {
      millisecondString = `0${millisecondString}`;
    }
    millisecondString = `.${millisecondString}`;
  }
  return `${timelineMonthNames[gregorian.month - 1]} ${gregorian.day} ${
    gregorian.year
  } ${twoDigits(gregorian.hour)}:${twoDigits(gregorian.minute)}:${twoDigits(
    gregorian.second
  )}${millisecondString}`;
};

可以看到就是接收一个时间值然后根据该时间返回一个字符串,我们将其修改为

ts
viewer.timeline.makeLabel = function (time) {
  const julianDT = new Cesium.JulianDate();
  Cesium.JulianDate.addHours(time, 8, julianDT);
  var gregorianDT = Cesium.JulianDate.toGregorianDate(julianDT);

  let hour = gregorianDT.hour + "";
  let minute = gregorianDT.minute + "";
  let second = gregorianDT.second + "";
  return `${gregorianDT.year}年${gregorianDT.month}月${
    gregorianDT.day
  }日${hour.padStart(2, "0")}:${minute.padStart(2, "0")}:${second.padStart(
    2,
    "0"
  )}`;
};

因为北京时间是东八区区时,所以我们加了 8 个小时,这样才能显示正常的北京时间,运行效果

  • 格式化动画部件上的时间

animation

动画部件和时间轴是两个部件,是相对独立的,上面我们格式化时间轴上的时间显示,并没有作用到动画组件上,我们可以按照相同的思路来完成动画部件上时间格式化。

动画部件的类型为 Animation,该类有一个属性 viewModel,类型为 AnimationViewModel,这里面提供了格式的方法。

查看文档可以看到也是传入一个时间,返回一个字符串

dateTimeFormatter

所以我们编写以下代码

ts
viewer.animation.viewModel.timeFormatter = function (datetime, viewModel) {
  const julianDT = new Cesium.JulianDate();
  Cesium.JulianDate.addHours(datetime, 8, julianDT);
  let gregorianDate = Cesium.JulianDate.toGregorianDate(julianDT);
  let hour = gregorianDate.hour + "";
  let minute = gregorianDate.minute + "";
  let second = gregorianDate.second + "";
  return `${hour.padStart(2, "0")}:${minute.padStart(2, "0")}:${second.padStart(
    2,
    "0"
  )}`;
};
viewer.animation.viewModel.dateFormatter = function (datetime, viewModel) {
  const julianDT = new Cesium.JulianDate();
  Cesium.JulianDate.addHours(datetime, 8, julianDT);
  let gregorianDate = Cesium.JulianDate.toGregorianDate(julianDT);
  return `${gregorianDate.year}年${gregorianDate.month}月${gregorianDate.day}日`;
};

MGis 地理三维库