空间大地测量与GPS导航定位时间系统相互转换格里高利时通用时儒略日GPS时年积日相互转换讲解.docx

上传人:b****8 文档编号:8866231 上传时间:2023-02-02 格式:DOCX 页数:13 大小:98.17KB
下载 相关 举报
空间大地测量与GPS导航定位时间系统相互转换格里高利时通用时儒略日GPS时年积日相互转换讲解.docx_第1页
第1页 / 共13页
空间大地测量与GPS导航定位时间系统相互转换格里高利时通用时儒略日GPS时年积日相互转换讲解.docx_第2页
第2页 / 共13页
空间大地测量与GPS导航定位时间系统相互转换格里高利时通用时儒略日GPS时年积日相互转换讲解.docx_第3页
第3页 / 共13页
空间大地测量与GPS导航定位时间系统相互转换格里高利时通用时儒略日GPS时年积日相互转换讲解.docx_第4页
第4页 / 共13页
空间大地测量与GPS导航定位时间系统相互转换格里高利时通用时儒略日GPS时年积日相互转换讲解.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

空间大地测量与GPS导航定位时间系统相互转换格里高利时通用时儒略日GPS时年积日相互转换讲解.docx

《空间大地测量与GPS导航定位时间系统相互转换格里高利时通用时儒略日GPS时年积日相互转换讲解.docx》由会员分享,可在线阅读,更多相关《空间大地测量与GPS导航定位时间系统相互转换格里高利时通用时儒略日GPS时年积日相互转换讲解.docx(13页珍藏版)》请在冰豆网上搜索。

空间大地测量与GPS导航定位时间系统相互转换格里高利时通用时儒略日GPS时年积日相互转换讲解.docx

空间大地测量与GPS导航定位时间系统相互转换格里高利时通用时儒略日GPS时年积日相互转换讲解

进行空间大地测量所需时间系统的相互转换

1.时间标示法

从古至今,世界各国曾出现过多种历法,如罗马历、儒略日、格里高利以及我国的农历等,目前世界上广泛采用的历法是格里高利历。

1.1.格里高利时(通用时)

格里高利历也称公历,现被世界各国广泛采用。

格里高利历是一个由146097天所组成的400年周期为基础,1年的平均长度为365.2425天。

根据格里高利历1年被划分为12个月。

其标示时间时采用年、月、日、时、分、秒的方法。

这种计时反映季节变化,与日常生活密切相关,但非连续,不利于数学表达和科学计算

1.2.儒略日

儒略日是一种不涉及年、月等概念的长期连续的记日法,在天文学、空间大地测量和卫星导航定位中经常使用。

这种方法是由Scaliger于1583年提出的,为纪念他的父亲儒略而命名为儒略日。

儒略日的起点订在公元前4713年(天文学上记为-4712年)1月1日格林威治时间平午(世界时12:

00),即JD0指定为4713B.C.1月1日12:

00UT到4713B.C.1月2日12:

00UT的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时间、和年积日分别转换为儒略日,然后以儒略日为媒介,实现任意两个时间系统的相互转换,如下图所示:

 

转换思想

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))

 

2.2通用时与GPS时间间的相互转换

2.2.1由通用时转换到GPS时间(CommonTimeToGPSTime(pct,pgt))

主要分两步进行:

第一步:

计算GPS周

第二步:

计算一周内的秒数

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

usingnamespacestd;

typedefstructtagCOMMONTIME

{

intyear;

intmonth;

intday;

inthour;

intminute;

doublesecond;

}COMMONTIME;//通用时

typedefCOMMONTIME*PCOMMONTIME;

typedefstructtagTOD

{

longsn;//秒数的整数部分

doubletos;//秒数的小数部分

}TOD;

typedefTOD*PTOD;

typedefstruct

{

longday;//整数天数

TODtod;//一天内的秒数

}JULIANDAY;//儒略日

typedefJULIANDAY*PJULIANDAY;

typedefstructtagMJULIANDAY

{

longday;

TODtod;

}MJULIANDAY;//新儒略日

typedefMJULIANDAY*PMJIANDAY;

typedefstructtagTOW

{

longsn;//秒整数部分

doubletos;//秒小数部分

}TOW;

typedefTOW*PTOW;

typedefstructtagGPSTIME

{

intwn;//周数

TOWtow;//一周内的秒数

}GPSTIME;//GPS时

typedefGPSTIME*PGPSTIME;

typedefstructtagDOY

{

unsignedshortyear;

unsignedshortday;

TODtod;

}DOY;//年积日

typedefDOY*PDOY;

doubleFRAC(doublemorigin)

{

returnmorigin-long(morigin);//取小数部分

}

voidCommonTimeToJulianDay(PCOMMONTIMEpct,PJULIANDAYpjd)//通用时到儒略日的转换

{

if(pct->year<1900)

{

if(pct->year<80)

pct->year+=2000;

elsepct->year+=1900;

}

doubleut=pct->hour+pct->minute/60.0+pct->second/3600.0;

if(pct->month<=2)

{

pct->year-=1;

pct->month+=12;

}

pjd->day=int(365.25*pct->year)+int(30.6001*(pct->month+1))+pct->day+int(ut/24+1720981.5);

pjd->tod.sn=((pct->hour+12)%24)*3600+pct->minute*60+(int)pct->second;//秒的整数部分

pjd->tod.tos=pct->second-(int)pct->second;//秒的小数部分

}

voidJulianDayToCommonTime(PJULIANDAYpjd,PCOMMONTIMEpct)//儒略日到通用时的转换

{

doublex=pjd->day+(pjd->tod.sn+pjd->tod.tos)/(60.0*60.0*24);

inta=int(x+0.5);

intb=a+1537;

intc=int((b-122.1)/365.25);

intd=int(365.25*c);

inte=int((b-d)/30.6001);

pct->day=b-d-int(30.6001*e);

pct->month=e-1-12*int(e/14);

pct->year=c-4715-int((7+pct->month)/10);

pct->hour=(pjd->tod.sn/3600+12)%24;

pct->minute=(pjd->tod.sn%3600)/60;

pct->second=pjd->tod.sn%60+pjd->tod.tos;

intN=a%7;

}

voidJulianDayToGPSTime(PJULIANDAYpjd,PGPSTIMEpgt)//儒略日到GPS时的转换

{

doublex=pjd->day+(pjd->tod.sn+pjd->tod.tos)/(60.0*60.0*24);

pgt->wn=int((x-2444244.5)/7);

pgt->tow.sn=int(((pjd->day-2444244)%7+(pjd->tod.sn/(60.0*60.0*24)-0.5))*86400);

pgt->tow.tos=pjd->tod.tos;

}

voidGPSTimeToJulianDay(PGPSTIMEpgt,PJULIANDAYpjd)//GPS时到儒略日的转换

{

pjd->day=int(pgt->wn*7+double(pgt->tow.sn)/86400.0+2444244.5);

pjd->tod.sn=(pgt->tow.sn+43200)%86400;

pjd->tod.tos=pgt->tow.tos;

}

voidCommonTimeToGPSTime(PCOMMONTIMEpct,PGPSTIMEpgt)//通用时到GPS时的转换

{

PJULIANDAYpjd=newJULIANDAY;

CommonTimeToJulianDay(pct,pjd);

JulianDayToGPSTime(pjd,pgt);

}

voidGPSTimeToCommonTime(PGPSTIMEpgt,PCOMMONTIMEpct)//GPS时到通用时的转换

{

PJULIANDAYpjd=newJULIANDAY;

GPSTimeToJulianDay(pgt,pjd);

JulianDayToCommonTime(pjd,pct);

}

voidCommonTimeToDOY(PCOMMONTIMEpct,PDOYpdoy)

{

PCOMMONTIMEpcto=newCOMMONTIME;

pcto->year=pct->year;

pcto->month=1;

pcto->day=1;

pcto->hour=0;

pcto->minute=0;

pcto->second=0;

PJULIANDAYpjdo=newJULIANDAY;

doubleJD,JDO;

CommonTimeToJulianDay(pcto,pjdo);

JDO=pjdo->day+(pjdo->tod.sn+pjdo->tod.tos)/86400;

PJULIANDAYpjd=newJULIANDAY;

CommonTimeToJulianDay(pct,pjd);

JD=pjd->day+(pjd->tod.sn+pjd->tod.tos)/86400;

pdoy->day=short(JD-JDO+1);

pdoy->year=pct->year;

pdoy->tod.sn=long(pct->hour*3600

+pct->minute*60+pct->second);

pdoy->tod.tos=pct->second-int(pct->second);/*pct->hour*3600

+pct->minute*60+pct->second-pdoy->tod.sn;*/

}

voidDOYToCommonTime(PDOYpdoy,PCOMMONTIMEpct)

{

PCOMMONTIMEpcto=newCOMMONTIME;

pcto->year=pdoy->year;

pcto->month=1;

pcto->day=1;

pcto->hour=0;

pcto->minute=0;

pcto->second=0;

PJULIANDAYpjdo=newJULIANDAY;

doubleJD,JDO;

CommonTimeToJulianDay(pcto,pjdo);

JDO=pjdo->day+(pjdo->tod.sn+pjdo->tod.tos)/86400;

JD=JDO+pdoy->day+(pdoy->tod.sn+pdoy->tod.tos)/86400-1;

longa,b,c,d,e;

a=(long)(JD+0.5);

b=a+1537;

c=(long)((b-122.1)/365.25);

d=(long)(365.25*c);

e=(long)((b-d)/30.6001);

pct->day=short(b-d-(long)(30.6001*e)+FRAC(JD+0.5));

pct->month=short(e-1-12*(long)(e/14));

pct->year=short(c-4715-(long)((7+pct->month)/10));

pct->hour=short((pdoy->tod.sn+pdoy->tod.tos)/3600);

pct->minute=short((pdoy->tod.sn+pdoy->tod.tos

-pct->hour*3600)/60);

pct->second=pdoy->tod.sn+pdoy->tod.tos

-pct->hour*3600-pct->minute*60;

}

voidGPSTimeToDOY(PGPSTIMEpgt,PDOYpdoy)

{

PJULIANDAYpjd=newJULIANDAY;

GPSTimeToJulianDay(pgt,pjd);

PCOMMONTIMEpct=newCOMMONTIME;

JulianDayToCommonTime(pjd,pct);

CommonTimeToDOY(pct,pdoy);

}

voidDOYToGPSTime(PDOYpdoy,PGPSTIMEpgt)

{

PCOMMONTIMEpct=newCOMMONTIME;

DOYToCommonTime(pdoy,pct);

CommonTimeToGPSTime(pct,pgt);

}

voidJulianDayToDOY(PJULIANDAYpjd,PDOYpdoy)

{

PCOMMONTIMEpct=newCOMMONTIME;

JulianDayToCommonTime(pjd,pct);

CommonTimeToDOY(pct,pdoy);

}

voidDOYToJulianDay(PDOYpdoy,PJULIANDAYpjd)

{

PCOMMONTIMEpct=newCOMMONTIME;

DOYToCommonTime(pdoy,pct);

CommonTimeToJulianDay(pct,pjd);

}

voidmain()

{

PCOMMONTIMEpct=newCOMMONTIME;

PJULIANDAYpjd=newJULIANDAY;

PDOYpdoy=newDOY;

PGPSTIMEpgt=newGPSTIME;

pct->year=2011;

pct->month=1;

pct->day=6;

pct->hour=19;

pct->minute=38;

pct->second=45.26;

cout<<"转换之前的通用时(当地时间):

";

cout<year<<""<month<<""<day<<""<hour<<":

"<minute<<":

"<second<

cout<

CommonTimeToJulianDay(pct,pjd);//通用时->儒略日的转换

cout<<"通用时->儒略日的转换:

";

cout<day<<""<tod.sn<<""<tod.tos<

cout<

JulianDayToCommonTime(pjd,pct);//儒略日->通用时的转换

cout<<"儒略日->通用时的转换:

";

cout<year<<""<month<<""<day<<""<hour<<":

"<minute<<":

"<second<

cout<

JulianDayToGPSTime(pjd,pgt);//儒略日->GPS时的转换

cout<<"儒略日->GPS时的转换:

";

cout<wn<<""<tow.sn<<""<tow.tos<

cout<

GPSTimeToJulianDay(pgt,pjd);//GPS时->儒略日的转换

cout<<"GPS时->儒略日的转换:

";

cout<day<<""<tod.sn<<""<tod.tos<

cout<

CommonTimeToGPSTime(pct,pgt);//通用时->GPS时的转换

cout<<"通用时->GPS时的转换:

";

cout<wn<<""<tow.sn<<""<tow.tos<

cout<

GPSTimeToCommonTime(pgt,pct);//GPS时->通用时的转换

cout<<"GPS时->通用时的转换:

";

cout<year<<""<month<<""<day<<""<hour<<":

"<minute<<":

"<second<

cout<

CommonTimeToDOY(pct,pdoy);//通用时->年积日

cout<<"通用时->年积日:

";

cout<year<<""<day<<""<tod.sn<<""<tod.tos<

cout<

DOYToCommonTime(pdoy,pct);//年积日->通用时

cout<<"年积日->通用时:

";

cout<year<<""<month<<""<day<<""<hour<<":

"<minute<<":

"<second<

cout<

GPSTimeToDOY(pgt,pdoy);//GPS时->年积日

cout<<"GPS时->年积日:

";

cout<year<<""<day<<""<tod.sn<<""<tod.tos<

cout<

DOYToGPSTime(pdoy,pgt);//年积日->GPS时

cout<<"年积日->GPS时:

";

cout<wn<<""<tow.sn<<""<tow.tos<

cout<

JulianDayToDOY(pjd,pdoy);//儒略日->年积日

cout<<"儒略日->年积日:

";

cout<year<<""<day<<""<tod.sn<<""<tod.tos<

cout<

DOYToJulianDay(pdoy,pjd);//年积日->儒略日

cout<<"年积日->儒略日:

";

cout<day<<""<tod.sn<<""<tod.tos<

cout<

cout<<"经过各种转换后还原得到的通用时:

";

cout<year<<""<month<<""<day<<""<hour<<":

"<minute<<":

"<second<

cout<

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1