进行空间大地测量所需时间系统的相互转换
1.时间标示法
从古至今,世界各国曾出现过多种历法,如罗马历、儒略日、格里高利以及我国的农历等,目前世界上广泛采用的历法是格里高利历。
1.1.格里高利时(通用时)
格里高利历也称公历,现被世界各国广泛采用。格里高利历是一个由146097天所组成的400年周期为基础,1年的平均长度为365.2425天。根据格里高利历1年被划分为12个月。其标示时间时采用年、月、日、时、分、秒的方法。这种计时反映季节变化,与日常生活密切相关,但非连续,不利于数学表达和科学计算
1.2.儒略日
儒略日是一种不涉及年、月等概念的长期连续的记日法,在天文学、空间大地测量和卫星导航定位中经常使用。这种方法是有Scaliger与1583年提出的,为纪念他的父亲儒略而命名为儒略日。儒略日的起点订在公元前4713年(天文学上记为 -4712 年)1月1日格林威治时间平午(世界时12:00),即JD 0 指定为 4713 B.C. 1月1日12:00 UT到4713 B.C. 1月2日12:00 UT的24小时。每一天赋予了一个唯一的数字。由于儒略日数字位数太多,国际天文学联合会于1973年采用简化儒略日(MJD),其定义为 MJD = JD - 2400000.5。MJD相应的起点是1858年11月17日世界时0时。 例如1979年10月1日零时儒略日数为2,444,147.5。
1.3.GPS时
GPS系统内部所采用的时间系统是GPS时间,GPS时以1980年1月6日子夜为起点,用周数(一个星期七天)和周内的秒数来表示
1.4.年积日
所谓年积日就是指的是从每年的1月1日起开始累计的天数,计数从1开始(即每年1月1日的年积日为1),如2004年5月1日的年积日为122。用他可以方便的求出一年内两个时刻T1和T2间的时间间隔。
2.各个时间系统的相互转换
各个时间系统都有严格的转换公式,其转换的主要思想是把通用时、
GPS时间、和年积日分别转换为儒略日,然后以儒略日为媒介,实现任意两个时间系统的相互转换,如下图所示:
年积日儒略日通用时GPS时转换思想
2.1通用时与儒略日间的相互转换
2.1.1由通用时转换到儒略日(CommonTimeToJulianDay( pct, pjd)) 其中
如果M≤2,则y=Y-1,m=M+12 如果M>2,则y=Y,m=M
JD为儒略日,Y为年,M为月,D为日,UT为世界时。
2.1.2由儒略日转换到通用时(JulianDayToCommonTime( pjd, pct)) a?INT?JD?0.5? b?a?1537JD?INT?365.25y??INT??30.6001?m?1????D?UT24?1720981.5
??b?122.1?365.25?? c?INT?d?INT?365.25.c?
e?INT???b?d?30.6001??
D?b?d?INT?30.6001e??FRAC?JD?0.5?
M?e?1?12?INT?e14??月?Y?c?4715?INT???7?M?10??N?mod?INT?JD?0.5?,7??日??年?...??星期几。N?0,星期一;N?1,星期二;2.2通用时与GPS时间间的相互转换
2.2.1由通用时转换到GPS时间(CommonTimeToGPSTime( pct, pgt)) 主要分两步进行: 第一步:计算GPS周
GPSWEEK?INT???JD?2444244.5?7??第二步:计算一周内的秒数
2.2.2由GPS时间转换到通用时(GPSTimeToCommonTime( pgt, pct)) 第一步:由GPS时间转换到儒略日 第二步:由儒略日转换到通用时
2.3儒略日与年积日之间的相互转换
2.3.1由儒略日转换到年积日(JulianDayToDOY (pjd, pdoy)) 主要分三步进行: 第一步:计算出通用时
第二步:计算出当年1月1日的儒略日 第三步:两个儒略日求差加1,得出年积日
2.3.2年积日转换到儒略日(DOYToJulianDay ( pdoy, pjd)) 主要分一下两步进行:
第一步:计算出当年1月1日的儒略日JD1 第二步:年积日加JD1减1得儒略日
2.4GPS时与年积日间的相互转换
参照儒略日与年积日之间转换方法进行就可以得到结果。 GPS时转换到年积日(GPSTimeToDOY ( pgt, pdoy)) 年积日转换到GPS时(DOYToGPSTime (pdoy, pgt))
3.算例及结果
通过在VC++6.0环境下编写了各个坐标系统的相互转换,并得到了转换的
结果,在试验中使用的已知数据是即使数据,取的时间是当时时间2011年1月7日19时38分45.26秒,用这个已知数据代入函数中,分别求得各个时间系统的GPS时、儒略时、年积日时,并通过各个时间系统的各自相互转换,最后输出的结果如下图所示
通过上图我们可以看出,得到的结果还是非常满意的,程序基本完成了各个时间系统的相互转换,从各个时间相互转换后得到的时间结果,并还原成转换前的数据,得到的结果都是完全符合,由此可见我们的计算结果是正确的,
4.心得体会
这次编程试验,虽说这次试验比较简单,但还是花了较长的时间,修修改改的,以前看到过类似程序,觉得自己应该没啥问题,应该很简单,自己能轻易拿下,可真做起来并不是这么一回事,总是出现一些小bug,不知道问题出在那里,明明感觉公式输入对的,语法也没啥问题,偏偏结果不对,与期望的值差别很大,最后经过调试总算解决了这些问题,比如有次明明记得公式输入是正确的,最后发现还是不小心输错了,结果导致错误。经过这次编程,这次试验,使自己的编程水平有了较大的提高,以前很多的时候都是只看程序,感觉很简单,并不自己动手,其实其中很多问题,只有自己亲自经历才知道一些简单的东西也会出问题,卡住思维,最后经过努力解决了问题,心里还是蛮开心的,有一定的成就感。经
过这次试验,学到了很多东西,有比较深的感触,对VC++不像以前那么排斥了,不像以前总感觉有点儿惧怕它,现在总算不抵触他了,希望在以后的学习中能够喜欢上它。
5.附录(程序中的源代码)
#include
typedef struct tagCOMMONTIME {
int year; int month;
int day;
int hour; int minute; double second;
}COMMONTIME;//通用时
typedef COMMONTIME *PCOMMONTIME; typedef struct tagTOD {
long sn; //秒数的整数部分 double tos;//秒数的小数部分
}TOD;
typedef TOD *PTOD; typedef struct {
long day; //整数天数 TOD tod; //一天内的秒数
}JULIANDAY;//儒略日
typedef JULIANDAY *PJULIANDAY; typedef struct tagMJULIANDAY {