Cesium JulianDate Clock timeLine(十八)

julianday

代表天文朱利安日期,它是自4712年1月1日(公元前4713年)正午以来的天数。为了提高精度,该类存储的日期部分和秒数部分是分开的。并且为了算术安全和表示闰秒,该日期始终存储在国际原子时间标准中 (TimeStandard.TAI) 

而这其中的Julian可能我们会有些陌生,但是提起他的另一个名字“凯撒大帝”,我们应该就熟悉很多了,其有效的日期范围是从公元前4713年1月1日到公元9999年12月31日。

 

 

 

 julianDayNumber 是指整数天,因为是从公元前4713年开始计数的,所以这个数可能会很大;secondsOfDay 是指这一天过了多少秒;timeStandard则是指所用时间的标准,Cesium中主要有两种 Cesium.TimeStandard.TAI(国际原子时间标准)和Cesium.TimeStandard.UTC(协调世界时时间标准,这和JS中的时间标准是一样的)。

 

常用方法

1.获得现在时间

new Cesium.JulianDate.now()

 一般很少用这种日期格式,所以会转换成其他的

 

2.转换为JavaScript那种日期

从提供的实例创建JavaScript日期。由于JavaScript日期只能精确到最近的毫秒,不能表示闰秒,因此考虑改用JulianDate.toGregorianDate。如果提供的JulianDate在闰秒期间,则使用前一秒。

Cesium.JulianDate.toDate(julianDate)

 

 

3.转换为Iso8601标准

new Cesium.JulianDate.toIso8601(now);

 

4.增加小时、分、秒

Cesium.JulianDate.addHours(now, 10,a);
Cesium.JulianDate.addMinutes(now, 10,b);
Cesium.JulianDate.addSeconds(now, 10,c);

 

5.计算日期差

Cesium.JulianDate.daysDifference(a, now)

是左边减右边,同理有secondsDifference

 

clock

Clock中默认开始时间(startTime)为当前时间,终止时间(stopTime)为24小时后,并能获取当前时间(currentTime)。

我们都知道cesium在容器初始化时都会自动把clock对象挂载到容器对象上,所以对开发者来说可以不用自己手动去创建,当然也不建议自己去手动创建多个clock对象(除非你有特殊的需求,需要多个时钟对象)

clock对象是一个同步系统时间的一个对象,想要实现时间驱动数据的动态化渲染,都需要clock对象去创建一个时间序列。一般来说电脑屏幕的刷新率都是60hz,cesium定义的是每秒刷新60次,每帧需要的时间大概是16.67mm。

// Create a clock that loops on Christmas day 2013 and runs in real-time.
const clock = new Cesium.Clock({
   startTime : Cesium.JulianDate.fromIso8601("2013-12-25"),//起始时间
   currentTime : Cesium.JulianDate.fromIso8601("2013-12-25"),//现在时间
   stopTime : Cesium.JulianDate.fromIso8601("2013-12-26"),//终止时间
  /*
  UNBOUNDED 使时钟沿其当前方向前进
  CLAMPED 时间停止
  LOOP_STOP 重新循环
  */
   clockRange : Cesium.ClockRange.LOOP_STOP,
   clockStep : Cesium.ClockStep.SYSTEM_CLOCK_MULTIPLIER//确定对Clock#tick的调用是依赖于帧还是依赖于系统时钟。
});

tick方法,Cesium内部每一帧都会调用该方法,实现时间状态的更新和检测。 涉及到时间的细节很多,比如TimeInterval,TimeConstants。

 

timeline

就是这根东西

 

 

 

zoomTo(startTime, stopTime),就是把他当前缩放到所设置的时间范围

timeline是cesium中的一个小部件,用于显示和控制当前场景的时间。timeline.makeLabel是timeline的一个私有方法,用于生成时间轴上的标签。

timeline.makeLabel方法接受一个数字作为参数,表示儒略日(Julian day)的值,然后根据当前时间格式和时区来返回一个字符串作为标签。

例如,如果你想让时间轴上的标签显示为北京时间(UTC+8),你可以这样重写timeline.makeLabel方法:

var date = new Date();
var h = 0 - date.getTimezoneOffset();
timeline.makeLabel = function(e) {
return Cesium.JulianDate.toIso8601(e.addHours(h), 0);
};

以下代码经常出现

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

// 定义时间线参数,设置开始时间、结束时间和当前时间刻度颜色
this.viewer.timeline.zoomTo(start.clone(), stop.clone());
this.viewer.timeline.makeLabel(time => time.toString());
this.viewer.timeline.updateFromClock();
this.viewer.timeline.scrubColor= "rgb(255 ,255 ,255)";
 
timeline.updateFromClock() 是 Timeline 类的一个方法,它根据时钟的变化更新时间轴1。它通常由 CesiumWidget 自动调用1

你可以参考cesium的文档来了解更多关于timeline小部件的用法和示例。

Source: Conversation with Bing, 2/28/2023(1) Timeline - Cesium Documentation. https://cesium.com/learn/cesiumjs/ref-doc/Timeline.html Accessed 2/28/2023.
(2) Cesium小插件改造--clock和timeline - 编程猎人. https://www.programminghunter.com/article/7261954756/ Accessed 2/28/2023.
(3) Make it easier to change Timeline and Animation timezone #2066. https://github.com/CesiumGS/cesium/issues/2066 Accessed 2/28/2023.
(4) Widget date/time internationalization/localization #5663 - GitHub. https://github.com/CesiumGS/cesium/issues/5663 Accessed 2/28/2023.

 

 

 
posted @ 2023-02-22 19:28  一摩尔时光  阅读(1744)  评论(0编辑  收藏  举报