空間大地測量與GPS導航定位時間系統相互轉換,格里高利時通用時儒略日,GPS時,年積日相互轉換

進行空間大地測量所需時間系統的相互轉換
                                    
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時間、和年積日分別轉換爲儒略日,然後以儒略日爲媒介,實現任意兩個時間系統的相互轉換,如下圖所示:







轉換思想
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<iostream>
using namespace std;
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
{
    long day;
    TOD  tod;
}MJULIANDAY;//新儒略日
typedef MJULIANDAY *PMJIANDAY;
typedef struct tagTOW
{
    long sn;//秒整數部分
    double tos;//秒小數部分
}TOW;
typedef TOW *PTOW;
typedef struct tagGPSTIME
{
    int wn; //週數
    TOW tow;//一週內的秒數
}GPSTIME;//GPS時
typedef GPSTIME *PGPSTIME;
typedef struct tagDOY
{
    unsigned short year;
    unsigned short day;
    TOD tod;    
}DOY;//年積日
typedef DOY *PDOY;
double FRAC(double morigin)
{
    return morigin-long(morigin);// 取小數部分
}
void CommonTimeToJulianDay(PCOMMONTIME pct,PJULIANDAY pjd) //通用時到儒略日的轉換
{
    if(pct->year<1900)
    {
        if(pct->year<80)
        pct->year+=2000;
        else pct->year+=1900;
    }
    double ut=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;//秒的小數部分
}
void JulianDayToCommonTime(PJULIANDAY pjd,PCOMMONTIME pct)//儒略日到通用時的轉換
{
    double x=pjd->day+(pjd->tod.sn+pjd->tod.tos)/(60.0*60.0*24);
    int a=int(x+0.5);
    int b=a+1537;
    int c=int((b-122.1)/365.25);
    int d=int(365.25*c);
    int e=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;
    int N=a%7;
}
void JulianDayToGPSTime(PJULIANDAY pjd,PGPSTIME pgt)//儒略日到GPS時的轉換
{
    double x=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;
}
void GPSTimeToJulianDay(PGPSTIME pgt,PJULIANDAY pjd)//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;
}
void CommonTimeToGPSTime(PCOMMONTIME pct,PGPSTIME pgt)//通用時到GPS時的轉換
{
    PJULIANDAY pjd=new JULIANDAY;
    CommonTimeToJulianDay(pct,pjd);
    JulianDayToGPSTime(pjd,pgt);
}
void GPSTimeToCommonTime(PGPSTIME pgt,PCOMMONTIME pct)//GPS時到通用時的轉換
{
    PJULIANDAY pjd=new JULIANDAY;
    GPSTimeToJulianDay(pgt,pjd);
    JulianDayToCommonTime(pjd,pct);
}
void CommonTimeToDOY (PCOMMONTIME pct, PDOY pdoy)
{
    PCOMMONTIME pcto=new COMMONTIME;
    pcto->year=pct->year;
    pcto->month=1;
    pcto->day=1;
    pcto->hour=0;
    pcto->minute=0;
    pcto->second=0;

    PJULIANDAY pjdo=new JULIANDAY;

    double JD,JDO;
    CommonTimeToJulianDay(pcto,pjdo);
    JDO=pjdo->day+(pjdo->tod.sn+pjdo->tod.tos)/86400;

    PJULIANDAY pjd=new JULIANDAY;
    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;*/
}
void DOYToCommonTime (PDOY pdoy, PCOMMONTIME pct)
{
    PCOMMONTIME pcto=new COMMONTIME;
    pcto->year=pdoy->year;
    pcto->month=1;
    pcto->day=1;
    pcto->hour=0;
    pcto->minute=0;
    pcto->second=0;
    PJULIANDAY pjdo=new JULIANDAY;
    double JD,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;
    long a,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;
}
void GPSTimeToDOY (PGPSTIME pgt, PDOY pdoy)
{
    PJULIANDAY pjd=new JULIANDAY;
    GPSTimeToJulianDay (pgt, pjd);
    PCOMMONTIME pct=new COMMONTIME;
    JulianDayToCommonTime (pjd,pct);
    CommonTimeToDOY (pct,pdoy);
}
void DOYToGPSTime (PDOY pdoy, PGPSTIME pgt)
{
    PCOMMONTIME pct=new COMMONTIME;
    DOYToCommonTime (pdoy,pct);
    CommonTimeToGPSTime (pct, pgt);
}
void JulianDayToDOY (PJULIANDAY pjd, PDOY pdoy)
{
    PCOMMONTIME pct=new COMMONTIME;
    JulianDayToCommonTime (pjd, pct);
    CommonTimeToDOY (pct,pdoy);
}
void DOYToJulianDay (PDOY pdoy, PJULIANDAY pjd)
{
    PCOMMONTIME pct=new COMMONTIME;
    DOYToCommonTime (pdoy,pct);
    CommonTimeToJulianDay(pct,pjd);
}
void main()
{
          PCOMMONTIME pct=new COMMONTIME;
          PJULIANDAY pjd=new JULIANDAY;
          PDOY pdoy=new DOY;
          PGPSTIME pgt= new GPSTIME;
          pct->year=2011;
          pct->month=1;
          pct->day=6;
          pct->hour=19;
          pct->minute=38;
          pct->second=45.26;
           cout<<"轉換之前的通用時(當地時間):";
           cout<<pct->year<<" "<<pct->month<<" "<<pct->day<<" "<<pct->hour<<":"<<pct->minute<<":"<<pct->second<<endl;
           cout<<endl;
           CommonTimeToJulianDay( pct, pjd);//通用時->儒略日的轉換
           cout<<"通用時->儒略日的轉換:";
           cout<<pjd->day<<"  "<<pjd->tod.sn<<"  "<<pjd->tod.tos<<endl;
           cout<<endl;
           JulianDayToCommonTime( pjd, pct);//儒略日->通用時的轉換
           cout<<"儒略日->通用時的轉換:";
           cout<<pct->year<<" "<<pct->month<<" "<<pct->day<<" "<<pct->hour<<":"<<pct->minute<<":"<<pct->second<<endl;
           cout<<endl;
           JulianDayToGPSTime( pjd, pgt);//儒略日->GPS時的轉換
           cout<<"儒略日->GPS時的轉換:";
           cout<<pgt->wn<<"  "<<pgt->tow.sn<<"  "<<pgt->tow.tos<<endl;
           cout<<endl;
           GPSTimeToJulianDay( pgt, pjd);//GPS時->儒略日的轉換
           cout<<"GPS時->儒略日的轉換:";
           cout<<pjd->day<<"  "<<pjd->tod.sn<<"  "<<pjd->tod.tos<<endl;
           cout<<endl;
           CommonTimeToGPSTime( pct, pgt);//通用時->GPS時的轉換
           cout<<"通用時->GPS時的轉換:";
           cout<<pgt->wn<<"  "<<pgt->tow.sn<<"  "<<pgt->tow.tos<<endl;
           cout<<endl;
           GPSTimeToCommonTime( pgt, pct);//GPS時->通用時的轉換
           cout<<"GPS時->通用時的轉換:";
              cout<<pct->year<<" "<<pct->month<<" "<<pct->day<<" "<<pct->hour<<":"<<pct->minute<<":"<<pct->second<<endl;
           cout<<endl;
           CommonTimeToDOY ( pct, pdoy);//通用時->年積日
           cout<<"通用時->年積日:";
           cout<<pdoy->year<<"  "<<pdoy->day<<"  "<<pdoy->tod.sn<<"  "<<pdoy->tod.tos<<endl;
           cout<<endl;
           DOYToCommonTime (pdoy,  pct);//年積日->通用時
           cout<<"年積日->通用時:";
           cout<<pct->year<<" "<<pct->month<<" "<<pct->day<<" "<<pct->hour<<":"<<pct->minute<<":"<<pct->second<<endl;
           cout<<endl;
           GPSTimeToDOY ( pgt, pdoy);//GPS時->年積日
           cout<<"GPS時->年積日:";
           cout<<pdoy->year<<"  "<<pdoy->day<<"  "<<pdoy->tod.sn<<"  "<<pdoy->tod.tos<<endl;
           cout<<endl;
           DOYToGPSTime (pdoy,  pgt);//年積日->GPS時
           cout<<"年積日->GPS時:";
           cout<<pgt->wn<<"  "<<pgt->tow.sn<<"  "<<pgt->tow.tos<<endl;
           cout<<endl;
           JulianDayToDOY (pjd, pdoy);//儒略日->年積日
           cout<<"儒略日->年積日:";
           cout<<pdoy->year<<"  "<<pdoy->day<<"  "<<pdoy->tod.sn<<"  "<<pdoy->tod.tos<<endl;
           cout<<endl;
           DOYToJulianDay ( pdoy, pjd);//年積日->儒略日
           cout<<"年積日->儒略日:";
           cout<<pjd->day<<"  "<<pjd->tod.sn<<"  "<<pjd->tod.tos<<endl;
           cout<<endl;
           cout<<"經過各種轉換後還原得到的通用時:";
           cout<<pct->year<<" "<<pct->month<<" "<<pct->day<<" "<<pct->hour<<":"<<pct->minute<<":"<<pct->second<<endl;
           cout<<endl;
}
發佈了58 篇原創文章 · 獲贊 6 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章