//基本广播星历块
struct EPHEMERISBLOCK
//每小时一个卫星对应一个基本星历块
{
//PRN 号
int i1PRN;
double f8a0,f8a1,f8a2;//时间改正数
//六个轨道参数
double f8IODE,f8Crs,f8Deltan,f8M0;// ORBIT - 1
double f8Cuc,f8e,f8Cus,f8SqrtA;// ORBIT - 2
double f8Toe,f8Cic,f8OMEGA,f8Cis;// ORBIT - 3
double f8i0,f8Crc,f8omega,f8OMEGAdot;// ORBIT - 4
double f8IDOT,f8GpsWeekNumber,f8L2C,f8L2P;// ORBIT - 5
double f8SatAccuracy,f8SatHealth,f8TGD,f8IODC;// ORBIT - 6
};
void CGPS0168View::OnGps()
{
// TODO: Add your command handler code here
CString str;
CFileDialog
dlg(TRUE,".06n","*.06n",OFN_HIDEREADONLY,"GPS
文
件
(*.06)|*.06n",NULL);
if (dlg.DoModal()==IDOK)
{
str=dlg.GetFileName();
}
int i4HeadLineNum = 0;
//打开文件
CStdioFile pfEph;
BOOL IsEn = pfEph.Open(str, CFile::modeRead);
if(!IsEn) return ;
//读入头文件
CString strLine;
while(IsEn)
{
IsEn = pfEph.ReadString(strLine);
i4HeadLineNum++;
int index = strLine.Find("END OF HEADER");
if( -1 != index )
break;
}
//计算星历块数
int AllNum = 0;
while(IsEn)
{
IsEn = pfEph.ReadString(strLine);
AllNum++;
}
//临时读入星历块
int i4AllBlockNum = (AllNum + 1) / 8;
EPHEMERISBLOCK *pTemEpheme = new EPHEMERISBLOCK[i4AllBlockNum];
CGPSTime
double *nsecond=new double[i4AllBlockNum];
if(!pTemEpheme || !pGpsTime) return ;
//将文件指针调整到数据位置
pfEph.SeekToBegin();
for(int i=0; i
nsecond[i]=pGpsTime[i].InitgGpsTime(year, month, day, hour, minute, msecond);
IsEn = pfEph.ReadString(strLine);
strLine.Replace('D', 'e');
sscanf(strLine,"%lf %lf %lf %lf",&IODE, &Crs, &DeltN, &M0);
//读 Cuc,e,Cus,sqrtA
IsEn = pfEph.ReadString(strLine);
strLine.Replace('D', 'e');
sscanf(strLine,"%lf %lf %lf %lf",&Cuc, &e, &Cus, &sqrtA);
//Toe,Cic,OMEGA,Cis;
IsEn = pfEph.ReadString(strLine);
strLine.Replace('D', 'e');
sscanf(strLine,"%lf %lf %lf %lf",&Toe, &Cic, &OMEGA, &Cis);
//i0,Crc,w,OMEGADOT
IsEn = pfEph.ReadString(strLine);
strLine.Replace('D', 'e');
sscanf(strLine,"%lf %lf %lf %lf",&i0, &Crc, &omega, &OMEGADOT);
//IDOT,L2Cod,GPSWeek,L2PCod
IsEn = pfEph.ReadString(strLine);
strLine.Replace('D', 'e');
sscanf(strLine,"%lf %lf %lf %lf", &IDOT, &L2C, &GPSWeek, &L2P);
//AccuracyofSat,HealthofSat,TGD,IODC
IsEn = pfEph.ReadString(strLine);
strLine.Replace('D', 'e');
sscanf(strLine,"%lf %lf %lf %lf",&AccuracyofSat, &HealthofSat, &TGD, &IODC);
//
IsEn = pfEph.ReadString(strLine);
//赋值
pTemEpheme[i].i1PRN = mPrn;
pTemEpheme[i].f8a0 = a0;
pTemEpheme[i].f8a1 = a1;
pTemEpheme[i].f8a2 = a2;
//&IODE, &Crs, &DeltN, &M0
pTemEpheme[i].f8IODE = IODE;
pTemEpheme[i].f8Crs = Crs;
pTemEpheme[i].f8Deltan = DeltN;
pTemEpheme[i].f8M0 = M0;
//&Cuc, &e, &Cus, &sqrtA
pTemEpheme[i].f8Cuc = Cuc;
pTemEpheme[i].f8e = e;
pTemEpheme[i].f8Cus = Cus;
pTemEpheme[i].f8SqrtA = sqrtA;
//Toe,Cic,OMEGA,Cis;
pTemEpheme[i].f8Toe = Toe;
pTemEpheme[i].f8Cic = Cic;
pTemEpheme[i].f8OMEGA = OMEGA;
pTemEpheme[i].f8Cis = Cis;
//i0,Crc,omega,OMEGADOT
pTemEpheme[i].f8i0 = i0;
pTemEpheme[i].f8Crc = Crc;
pTemEpheme[i].f8omega = omega;
pTemEpheme[i].f8OMEGAdot = OMEGADOT;
//iDOT,L2Cod,GPSWeek,L2PCod
pTemEpheme[i].f8IDOT = IDOT;
pTemEpheme[i].f8L2C = L2C;
pTemEpheme[i].f8L2P = L2P;
pTemEpheme[i].f8GpsWeekNumber = GPSWeek;
//AccuracyofSat,HealthofSat,TGD,IODC
pTemEpheme[i].f8SatAccuracy = AccuracyofSat;
pTemEpheme[i].f8SatHealth = HealthofSat;
pTemEpheme[i].f8TGD = TGD;
pTemEpheme[i].f8IODC = IODC;
}
pfEph.Close();
//计算重复星历数
int i4RepeatNum = 0;
for(i=0; i
EPHEMERISBLOCK[m_i4EphemerisBlockNum];
//CGPSTime *m_pGpsTime=new CGPSTime[m_i4EphemerisBlockNum];
double *m_nsecond=new double[m_i4EphemerisBlockNum];
if(!m_pGpsEphemeris) return ;
int k = 0;
for(i=0; i1.0E-12);
double x=sin(E1)*sqrt(1-pow(GPS.f8e,2));
double y=cos(E1)-GPS.f8e;
double f;
if (x>0)
{
if (y>0)
{
f=atan(x/y);
}
else f=atan(x/y)+2*PI;
}
else
{
f=atan(x/y)+PI;
}
double u1=GPS.f8omega+f;
double tu=GPS.f8Cuc*cos(2*u1)+GPS.f8Cus*sin(2*u1);
double tr=GPS.f8Crc*cos(2*u1)+GPS.f8Crs*sin(2*u1);
double ti=GPS.f8Cic*cos(2*u1)+GPS.f8Cis*sin(2*u1);
double u=u1+tu;
double r=pow(GPS.f8SqrtA,2)*(1-GPS.f8e*cos(E1))+tr;
double q=GPS.f8i0+ti+GPS.f8IDOT*(m_nsecond[i]-GPS.f8Toe);
double lx=r*cos(u);
double ly=r*sin(u);
double
L=GPS.f8OMEGA+(GPS.f8OMEGAdot-We)*m_nsecond[i]-GPS.f8OMEGAdot*GPS.f8Toe;
//L=L/180*PI;
double tx=lx*cos(L)-ly*cos(q)*sin(L);
double ty=lx*sin(L)+ly*cos(q)*cos(L);
double tz=ly*sin(q);
fprintf(fp,"%4d",m_pGpsEphemeris[i].i1PRN);
fprintf(fp,"%25.3lf",tx);
fprintf(fp,"%25.3lf",ty);
fprintf(fp,"%25.3lf\n",tz);
}
fclose(fp);
}
//从年 月 日 转换为 GPS 周秒
int CGpsTime::InitgGpsTime (int nYear, int nMounth, int nDay, int nHour, int nMinute, double
dSecond)
{
int DayofMonth = 0;
int DayofYear = 0;
int weekno = 0;
int dayofweek;
int m;
if (nYear < 1980 || nMounth < 1 || nMounth > 12 || nDay < 1 || nDay > 31)
//计算从 1980 年到当前的前一年的天数
for( m = 1980 ; m < nYear ; m++ )
{
return -1;
if ( (m%4 == 0 && m%100 != 0) || (m%400 == 0) )
{
DayofYear += 366;
}
else
DayofYear += 365;
}
//计算当前一年内从元月到当前前一月的天数
for( m = 1;m < nMounth; m++)
{
if(m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12)
DayofMonth += 31;
else if (m==4 || m==6 || m==9 || m==11)
DayofMonth += 30;
else if (m ==2)
{
if ( (nYear%4 == 0 && nYear%100 != 0) || (nYear%400 == 0) )
else
DayofMonth += 29;
DayofMonth += 28;
}
}
DayofMonth = DayofMonth + nDay - 6;//加上当月天数/减去 1980 年元月的 6 日
weekno = (DayofYear + DayofMonth) / 7;//计算 GPS 周
dayofweek = (DayofYear + DayofMonth) % 7;
//计算 GPS 周秒时间
m_dWeekSecond = dayofweek*86400 + nHour*3600 + nMinute*60 + dSecond;
m_nWeek = weekno;
return weekno;
}