在天文和卫星轨道计算中,有关儒略日的计算是一个绕不开的话题。本章阐述下Cesium中有关儒略日的处理方法。

涉及到的时间系统,如UTC,TAI等,这里不再详细阐述,读者自行阅读专业书籍或者网上查询。

Cesium中,使用JulianDate模块来处理儒略日的计算,具体为Cesium软件包目录中的文件:"\Source\Core\JulianDate.js"。

几种时间系统

首先简要阐述下几个不同时间系统的概念。

  1. UTC(coordinated universal time),也称协调时间时。也就是我们现在日常使用的时间。
  2. TAI(International Atomic Time),也称原子时。
  3. DAT,跳秒,或者闰秒,是UTC和TAI之间的差别。
  4. TT(terrestrial time),或者为TDT,也称地球动力学时。
  5. UT1(Universal Time1),也称格林威治平太阳时,在UT0的基础上加入了极移修正。是以地球自转为基准得到的,也是目前使用的世界时标准。

以上几个时间系统中,UT1与地球自转紧密相连,因此不是均匀的。其余诸如UTC,TAI和TT是均匀流逝的,有点像牛顿的绝对时空观里的时间。

不同场合使用不同的时间系统,就像阴历与阳历一样,都是对时间的计数方式而已,我们要弄清楚的就是他们之间的转换关系。

UTC时间与UT1最为接近,且UTC是均匀流逝的,所以UTC作为我们日常使用的时间。但是由于地球的自转速度越转越慢,因此为了协调UT1时间和UTC时间,过个几年会有润秒的出现,即UTC时间减慢一秒,具体可搜索润秒的详细描述,此处不再详述。

下面给出上述几种时间的相互转换关系
UT1=UTC+(UT1−UTC)DAT=TAI−UTCTAI=UTC+DATTT=TAI+32.184sUT1=UTC+(UT1-UTC) \\ DAT=TAI-UTC\\ TAI=UTC+DAT\\ TT=TAI+32.184sUT1=UTC+(UT1−UTC)DAT=TAI−UTCTAI=UTC+DATTT=TAI+32.184s
上式中,最近的一次跳秒发生在2017年1月1日零时(UTC),因此目前跳秒数DAT为37s。

第一个式子有关UT1的写法可能会感到奇怪。前面说了,UT1的时间流逝是不均匀的,而UTC的时刻我们是知道的,因此IERS公报中给出UTC与UT1的差值:(UT1-UTC),只要将这个差值加上UTC时间即可得到UT1。

儒略日的计算

儒略日(Julian day,JD)是指由公元前4713年1月1日,协调世界时中午12时开始所经过的天数,当然这个天数是包含小数点的。显然,儒略日使用自然累加的天数作为时间的计时方式,是一种均匀流逝的绝对时间。

儒略日的计算涉及到闰年、闰月的处理,计算公式各种程序语言版本的都有。读者可参考书籍中的算法》

注意,儒略日的计算公式只涉及到年月日时分秒的计算,并不管是UTC还是TAI时间。当是TAI时间时,则计算得到的儒略日是正确的;而当是UTC时间时,因为有跳秒的存在,计算得到的儒略日就是“假的”,因此需要主动加上跳秒。

例如:
UTC时间:2020年9月5日12:00:00s,对应的TAI时间为2020年9月5日12:00:37s。
因为我们知道,自2017年1月1日00:00:00s,跳秒为37s。

所以说,给定UTC时间,在转换为TAI时间时,必须知道跳秒数,即前面提到的DATDATDAT。
Cesium中,JulianDate模块中,维护了历次跳秒的时刻及跳秒数的数表(见下),在计算UTC向TAI转换时,需要查这个表,以便判断对应的跳秒数。

JulianDate.leapSeconds = [new LeapSecond(new JulianDate(2441317, 43210.0, TimeStandard.TAI), 10), // January 1, 1972 00:00:00 UTCnew LeapSecond(new JulianDate(2441499, 43211.0, TimeStandard.TAI), 11), // July 1, 1972 00:00:00 UTCnew LeapSecond(new JulianDate(2441683, 43212.0, TimeStandard.TAI), 12), // January 1, 1973 00:00:00 UTCnew LeapSecond(new JulianDate(2442048, 43213.0, TimeStandard.TAI), 13), // January 1, 1974 00:00:00 UTCnew LeapSecond(new JulianDate(2442413, 43214.0, TimeStandard.TAI), 14), // January 1, 1975 00:00:00 UTCnew LeapSecond(new JulianDate(2442778, 43215.0, TimeStandard.TAI), 15), // January 1, 1976 00:00:00 UTCnew LeapSecond(new JulianDate(2443144, 43216.0, TimeStandard.TAI), 16), // January 1, 1977 00:00:00 UTCnew LeapSecond(new JulianDate(2443509, 43217.0, TimeStandard.TAI), 17), // January 1, 1978 00:00:00 UTCnew LeapSecond(new JulianDate(2443874, 43218.0, TimeStandard.TAI), 18), // January 1, 1979 00:00:00 UTCnew LeapSecond(new JulianDate(2444239, 43219.0, TimeStandard.TAI), 19), // January 1, 1980 00:00:00 UTCnew LeapSecond(new JulianDate(2444786, 43220.0, TimeStandard.TAI), 20), // July 1, 1981 00:00:00 UTCnew LeapSecond(new JulianDate(2445151, 43221.0, TimeStandard.TAI), 21), // July 1, 1982 00:00:00 UTCnew LeapSecond(new JulianDate(2445516, 43222.0, TimeStandard.TAI), 22), // July 1, 1983 00:00:00 UTCnew LeapSecond(new JulianDate(2446247, 43223.0, TimeStandard.TAI), 23), // July 1, 1985 00:00:00 UTCnew LeapSecond(new JulianDate(2447161, 43224.0, TimeStandard.TAI), 24), // January 1, 1988 00:00:00 UTCnew LeapSecond(new JulianDate(2447892, 43225.0, TimeStandard.TAI), 25), // January 1, 1990 00:00:00 UTCnew LeapSecond(new JulianDate(2448257, 43226.0, TimeStandard.TAI), 26), // January 1, 1991 00:00:00 UTCnew LeapSecond(new JulianDate(2448804, 43227.0, TimeStandard.TAI), 27), // July 1, 1992 00:00:00 UTCnew LeapSecond(new JulianDate(2449169, 43228.0, TimeStandard.TAI), 28), // July 1, 1993 00:00:00 UTCnew LeapSecond(new JulianDate(2449534, 43229.0, TimeStandard.TAI), 29), // July 1, 1994 00:00:00 UTCnew LeapSecond(new JulianDate(2450083, 43230.0, TimeStandard.TAI), 30), // January 1, 1996 00:00:00 UTCnew LeapSecond(new JulianDate(2450630, 43231.0, TimeStandard.TAI), 31), // July 1, 1997 00:00:00 UTCnew LeapSecond(new JulianDate(2451179, 43232.0, TimeStandard.TAI), 32), // January 1, 1999 00:00:00 UTCnew LeapSecond(new JulianDate(2453736, 43233.0, TimeStandard.TAI), 33), // January 1, 2006 00:00:00 UTCnew LeapSecond(new JulianDate(2454832, 43234.0, TimeStandard.TAI), 34), // January 1, 2009 00:00:00 UTCnew LeapSecond(new JulianDate(2456109, 43235.0, TimeStandard.TAI), 35), // July 1, 2012 00:00:00 UTCnew LeapSecond(new JulianDate(2457204, 43236.0, TimeStandard.TAI), 36), // July 1, 2015 00:00:00 UTCnew LeapSecond(new JulianDate(2457754, 43237.0, TimeStandard.TAI), 37), // January 1, 2017 00:00:00 UTC
];

JulianDate的结构和计算

Cesium中,使用JulianDate模块包含了相关的计算函数。
可以使用构造函数可以创建一个JulianDate对象,对象内部仅包含两个属性,且仅对应TAI时间:

  • dayNumber: 保留儒略日的整数部分,单位为天;
  • secondsOfDay:保留儒略日的小数部分,单位为秒;

之所以用两个参数来表示儒略日,是为了最大可能的保证数据的精度。例如J2000时刻,儒略日为2451545天。光整数天就需要7位有效数字,如果表示到1ms的精度,则儒略日为:2451545.00000001天,可以看出超出了一般双精度15位有效数字。因此使用内部使用整数天和不足一天的秒数来保存,从而保证了儒略日数据的精度。

直接的构造函数如下:

function JulianDate(julianDayNumber, secondsOfDay, timeStandard)

其中,timeStandard表示时间类型,只有两种选择:UTC和TAI。没有则默认为UTC。当为UTC类型时,构造函数内部需要将UTC时间转换为TAI时间(涉及到跳秒数表的查询)。

其它的构造函数有:JulianDate.fromGregorianDate、JulianDate.fromDate等。

下面给出了使用两种构造函数创建JulianDate对象的代码例子:

//  使用ES6 module, 引用Cesium代码包里的源代码文件
import JulianDate from "../Source/Core/JulianDate.js";
import GregorianDate from "../Source/Core/GregorianDate.js";//  使用GregorianDate时间类型创建,默认为UTC时间
var jd1 = JulianDate.fromGregorianDate(new GregorianDate(2020,9,5,0,0,0,0));
console.log(jd1);//  直接使用儒略日的整数天和一天内的秒数创建,默认为UTC时间
var jd2 =new JulianDate(2459097, 43200.0);
console.log(jd2);/*  输出都是(TAI时间):
JulianDate {dayNumber: 2459097, secondsOfDay: 43237}
*/

Cesium中的儒略日JulianDate相关推荐

  1. Cesium中Clock控件及时间序列瓦片动态加载

    前言 前面已经写了两篇博客介绍Cesium,一篇整体上简单介绍了Cesium如何上手,还有一篇介绍了如何将Cesium与分布式地理信息处理框架Geotrellis相结合.Cesium的强大之处也在于其 ...

  2. STK/Component/Cesium中的月球坐标系的计算

    下图中,已如某飞行器在地球惯性系(ICRS或GCRS或ICRF)中T时刻的位置,那么如何求解此飞行器T时刻在月球坐标系下的位置(速度)? 显然,这个问题涉及到两个方面,一是月球相对地球的位置(即地月的 ...

  3. Cesium 中两种添加 model 方法的区别

    概述 Cesium 中包含两种添加 model 的方法,分别为: 通过 viewer.entities.add() 函数添加 通过 viewer.scene.primitives.add() 函数添加 ...

  4. Cesium中的坐标系及转换

    在我们开始学习Entity之前,我们首先需要先学习下Cesium中的坐标系,Cesium中有多个坐标系,在进行添加Entity时经常会使用到. 一.坐标系介绍 我们先来列举下Cesium中的坐标系:W ...

  5. Cesium中Homebutton改变默认跳转位置 【转】

    在Cesium中,Homebutton的默认跳转位置是美国,那么在开发中我们如何更改这个默认跳转位置呢,这就要更改一下源代码了: Camera.DEFAULT_VIEW_RECTANGLE = Rec ...

  6. Cesium中绘制矩形,根据四角/对角坐标绘制矩形

    Cesium中绘制矩形,根据四角/对角坐标绘制矩形 import store from '@/store/index' import * as Cesium from 'cesium'export d ...

  7. Cesium中的相机—旋转矩阵

    在学习坐标旋转的时候,一不小心就会把坐标系的旋转和矢量的旋转弄错,这里给出详细的两种旋转过程: 两种旋转矩阵的定义 下面仅以绕Z轴旋转为例,给出两种旋转的过程定义. 坐标系旋转,点不变(见下左图) 两 ...

  8. Cesium中添加entitie模型,实现贴地。

    1.Cesium中添加entitie模型,实现贴地. 2. 添加模型 const createModel = (url) => {const entity = viewer.entities.a ...

  9. Cesium中使用Sampler3D,3D纹理,实现体渲染

    Cesium中使用Sampler3D,3D纹理,实现体渲染 Cesium目前(20221231)还不支持直接使用3D纹理,但是其实内部已经可以WebGL2,而且内置常量也有3DTexture.所以,可 ...

最新文章

  1. Centos6.5升级gcc for qt5.3.1
  2. 利用 GitHub 搭建独立 Web 网站
  3. python运行界面英文翻译_python使用百度api翻译中英文
  4. Kerberos打开debug日志
  5. java实现顺序表和链表_Java: 实现顺序表和单链表的快速排序
  6. sql语句为什么大写居多_懂EXCEL就会SQL,从此查数不求人
  7. 为什么20的阶乘是负的Java_为什么 n 为20 阶乘为负数
  8. java vm 参数及设置(转载)
  9. javah生成java头文件
  10. win7安装mysql后“应用程序无法启动因为应用程序的并行配置不正
  11. 去除idea中代码的波浪线(黄色警告线)
  12. JavaScript 技术篇 - 实现一键压缩、格式化js代码实例演示,将js代码压缩为min.js方法,Notepad++工具JSTool插件安装
  13. vim 怎么显示空格_vi查看空格、制表符等特殊符号
  14. Android车载导航的一些困境
  15. java计算机毕业设计小区失物招领网站源程序+mysql+系统+lw文档+远程调试
  16. linux的gromacs模拟分子运动,动力学模拟gromacs(绝对详细).ppt
  17. 农委系统先进集体推荐报告_关于开展全省农林农经系统先进集体和先进工作者(劳动模范)评选推荐工作的通知...
  18. 基于Python实现的实时聊天系统
  19. 【GaussDB】初始GaussDB和GaussDB版本介绍
  20. nginx下强制跳转到www域名,域名重定向

热门文章

  1. 爱快可以外接文件服务器吗,听说爱快路由器也支持NAS了?
  2. 转不撞南墙不回头——树规总结
  3. sqlserver连接池及查看连接数相关
  4. TANRIC:肿瘤相关lncRNA数据库
  5. AHRS系统的基本构成
  6. 浏览器劫持事件处置(麻辣香锅)
  7. 为什么要用大写L替换小写L(l),idea提醒literal ‘xxx‘ ends with lowercase ‘l‘
  8. 关于物联网你需要知道的一切
  9. gcc环境配置时遇到的问题
  10. android pad的屏幕纯多少,16:9比例10.1寸屏幕,Galaxy Tab S4可以说是一部好的安卓平板...