📄 readon.cpp
字号:
N_data[(i*36+10)+j_replace*4+4 ] = f1;
N_data[(i*36+10)+j_replace*4+5 ] = f2;
fprintf(fp_temp1,"7\t%20.11e %20.11e\n",
N_data[(i*36+10)+j_replace*4+4 ],N_data[(i*36+10)+j_replace*4+5 ]);
fprintf(fp_temp1,"*************************************************************\n");
//if(k==336)
//星历中的数据块的数目
fgets(szBuf,MAX_BUF,flNavMsg);//继续读取一行(8)
i++;
}
m_DIM=k;
fprintf(fp_temp1,"********数据的维数为%d************\n",k);
fclose(fp_temp1);
}
void CReadON::Cal_Sate_Coord(EPHEMERIS ephemeris,double OBS_GPStime,double* svpos)
{
double omega = 7.2921151467E-5;//地球自转角速度,弧度/秒
double mu = 3.986004415e14;//地球引力常数
double Error = 1.0e-12;
double n;
double tk,mk,ek1,ek2,ek,es;
double vk,phik;
double deltau,deltar,deltai;
double uk,rk,ik;
double xk,yk;
double omegak;
// double Es1,u01,u1,r1,I1,x0,y0,u,r,i,x01,y01;
// double u0,fs,Es,as,es,L,L1;
tk=ephemeris.Toe; //参考历元
//计算归化时间
//归化时间是相对于星历参考时间Toe而言的
//******************************* tk = ( t - toe ) ******************************
tk = (OBS_GPStime - ephemeris.Toe);
//如果观测历元与所提供的星历信息不属于同一个星期
//这种情况应该较少出现
if(tk > 302400.0) tk = tk - 604800.0;
if(tk < -302400.0) tk = tk + 604800.0;
// tk=0;
//计算卫星运行的平均角速度n
//****************************** n = (GM/a^3)^.5 + @n ***************************
n = sqrt(mu)/(ephemeris.sqrt_of_A*ephemeris.sqrt_of_A*ephemeris.sqrt_of_A)
+ ephemeris.Delta_n;
//计算平近点角mk
//****************************** Ms = M0 + n * ( t - toe ) **********************
mk = ephemeris.M0 + n * tk;
//迭代计算偏近点角ek
//****************************** Es = Ms + es * SIN( Es ) ************************
ek1 = mk; //Es0
do
{
ek2 = mk + ephemeris.e*sin(ek1);
if( fabs(ek2-ek1) <= Error ) break;
ek1 = ek2;
}while(1); // should be 10e-10
ek = ek1;// Es
//计算真近点角vk(即卫星在轨道上距近地点的角度)
//*********************** fs ******************************************************
// if(Get_atan(cos(ek)-ephemeris.e,sqrt(1.0-ephemeris.e*ephemeris.e)*sin(ek),vk)==0)
// ;
// return false;
es=ephemeris.e;
vk=atan((sqrt(1-es*es)*sin(ek))/(cos(ek)-es));
//计算升交距角phik
//***********************phik: u0 = fs + ws *******************************************
phik = vk + ephemeris.omega;//EpheInfo->omega为近地点角距,即升交点和近地点的距离
//得到了卫星在轨道上到升交点的距离
//计算摄动改正
//*********************** @u, @r, @i ********************************************
deltau = ephemeris.Cus*sin(2.0*phik) + ephemeris.Cuc*cos(2.0*phik);
deltar = ephemeris.Crc*cos(2.0*phik) + ephemeris.Crs*sin(2.0*phik);
deltai = ephemeris.Cic*cos(2.0*phik) + ephemeris.CIS*sin(2.0*phik);
//*********************** u, r, i ************************************************
uk = phik + deltau;//经过摄动改正的升交距角
rk = (ephemeris.sqrt_of_A*ephemeris.sqrt_of_A)*(1.0-ephemeris.e*cos(ek))+deltar;
//经过摄动改正的卫星直径
ik = ephemeris.i0 + deltai + ephemeris.I_DOT*tk;//改正轨道倾角
//计算升交点经度,即升交点在WGS84坐标系下的经度,即轨道平面坐标系X轴和WGS84坐标系X轴的夹角
//// compute omegak ,L
omegak = ephemeris.OMEGA0+(ephemeris.OMEGA_DOT-omega)*tk
- omega*ephemeris.Toe;
//计算卫星在轨道平面的位置
//卫星失径*改正后的升交距角
xk = rk*cos(uk);
yk = rk*sin(uk);
//轨道平面坐标系的X轴指向升交点
svpos[0] = xk*cos(omegak) - yk*cos(ik)*sin(omegak); // satellite X
svpos[1] = xk*sin(omegak) + yk*cos(ik)*cos(omegak); // satellite Y
svpos[2] = yk*sin(ik); // satellite Z
}
void CReadON::Read_G_Header(FILE *flNavMsg)
{
GLO_G_HEADER HEADER;
fgets(szBuf,MAX_BUF,flNavMsg);
FILE* fp_temp;
fp_temp = fopen("G-Header-Check.txt","w");
///////////////////////////////////////////////////////////////////
// 读版本 char HEADER.Version[5]
///////////////////////////////////////////////////////////////////
if(strstr(szBuf,"RINEX"))
sscanf(szBuf,"%s",HEADER.Version);
// sscanf(szBuf,"%s",HEADER.FileType);
fprintf(fp_temp,"************************************\n");
fprintf(fp_temp,"The G-Rinex version: %s\n",HEADER.Version);
// fprintf(fp_temp,"The N-Rinex type: %s\n",HEADER.FileType);
Begin:;
fgets(szBuf,MAX_BUF,flNavMsg);
////////////////////////////////////////////////////////////////////
// 读CORR TO SYSTEM TIME
////////////////////////////////////////////////////////////////////
if(strstr(szBuf,"CORR TO SYSTEM TIME"))
{
DtoE(szBuf);
sscanf(szBuf,"%d %d %d %lf",
&HEADER.year,
&HEADER.month,
&HEADER.day,
&HEADER.Time);
fprintf(fp_temp,"The corr to system time: %d\t%d\t%d\t%e\n",
HEADER.year,
HEADER.month,
HEADER.day,
HEADER.Time);
goto Begin;
}
if(strstr(szBuf,"END OF HEADER"))
{
fprintf(fp_temp,"End of Header!\n");
fprintf(fp_temp,"************************************\n");
goto EndHead;
}
goto Begin;
EndHead:;
fclose(fp_temp);
}
int CReadON::Get_SP3_Dimension(FILE *fp_SP3)
{
do {
fgets (szBuf, MAX_BUF, fp_SP3);
strMid (szBuf, azBuf, 0, 1);
strTrim (azBuf, mzBuf);
if (!strcmp (mzBuf, "*"))
m_DIM++;
}while (!feof (fp_SP3));
fclose(fp_SP3);
return m_DIM;
}
void CReadON::Read_SP3_Data(FILE *fp_SP3, CSingleDoubleArray& S_data,SP3_EPHEMERIS ephemeris,int &m_DIM)
{
int i,j;
i=0;
double f1, f2, f3, f4;
int num=0;
char sign;
FILE* fp_temp;
fp_temp=fopen("SP3-Data-Check.txt","w");
do {
fgets (szBuf, MAX_BUF, fp_SP3);
strMid (szBuf, azBuf, 0, 3);
strTrim (azBuf, mzBuf);
}while ((strcmp (mzBuf, "* ")));
while(!feof(fp_SP3))
{
fprintf(fp_temp,"*************第 %d 个数据*****************\n",i+1);
sscanf(szBuf, "%c %d %d %d %d %d %lf",&sign,&ephemeris.year, &ephemeris.month,
&ephemeris.day, &ephemeris.hour, &ephemeris.minute, &ephemeris.second);
fprintf(fp_temp,"time:%d-%d-%d %d:%d:%lf \n", ephemeris.year, ephemeris.month,
ephemeris.day, ephemeris.hour, ephemeris.minute, ephemeris.second);
S_data[i * 146] = ephemeris.year;
S_data[i * 146 + 1] = ephemeris.month;
S_data[i * 146 + 2] = ephemeris.day;
S_data[i * 146 + 3] = ephemeris.hour;
S_data[i * 146 + 4] = ephemeris.minute;
S_data[i * 146 + 5] = ephemeris.second;
for(j = 0; j < 28 ; j++)
{
fgets (szBuf, MAX_BUF, fp_SP3);
sscanf(szBuf, "%c %d %lf %lf %lf %lf",&sign,&num,&f1, &f2, &f3, &f4);
S_data[ i*146 + j * 5 + 6] = (double)num;
S_data[ i*146 + j * 5 + 7] = f1;
S_data[ i*146 + j * 5 + 8] = f2;
S_data[ i*146 + j * 5 + 9] = f3;
S_data[ i*146 + j * 5 + 10] = f4;
fprintf(fp_temp,"%2.0f %15.7lf %15.7lf %15.7lf %15.7lf\n", //num,f1,f2,f3,f4
S_data[ i*146 + j * 5 + 6],S_data[ i*146 + j * 5 + 7], S_data[ i*146 + j * 5 + 8],
S_data[ i*146 + j * 5 + 9], S_data[ i*146 + j * 5 + 10]);
}
fprintf(fp_temp,"*************************************************************\n");
do {
fgets (szBuf, MAX_BUF, fp_SP3);
strMid (szBuf, azBuf, 0, 3);
strTrim (azBuf, mzBuf);
if (!strcmp (mzBuf, "EOF"))
break;
}while (strcmp (mzBuf, "* "));
// strMid (szBuf, azBuf, 0, 3);
// strTrim (azBuf, mzBuf);
// if (!strcmp (mzBuf, "EOF"))
// break;
i++;
}
fprintf(fp_temp,"********数据的维数为%d************\n",m_DIM);
fclose(fp_temp);
}
void CReadON::Read_G_Data(FILE *flNavMsg, double *G_data,G_EPHEMERIS ephemeris,int &m_DIM)
{
int i,j,k=0;
i=0;
//读取RINEX文件中所有的卫星的星历数据存放在内存中
//用于存放:年,月,日期,小时,分钟
//读取过程中存放每行中的四个数字
double f1, f2, f3, f4;
FILE* fp_temp;
fp_temp=fopen("G-Data-Check.txt","w");
fgetpos(flNavMsg,&pos);
while (!feof (flNavMsg))
{
{ for (j=0; j<=3; j++)
fgets (szBuf, MAX_BUF, flNavMsg);
if(feof (flNavMsg))
break;
k++;
}
}
fsetpos(flNavMsg,&pos);
//没有到文件末尾之前
fgets(szBuf,MAX_BUF,flNavMsg);
while(!feof(flNavMsg))
{
DtoE(szBuf);
sscanf(szBuf, "%d %d %d %d %d %d %lf %lf %lf %lf",
&ephemeris.m, &ephemeris.year ,&ephemeris.month, &ephemeris.day,&ephemeris.hour, &ephemeris.minute,
&ephemeris.second, &f1, &f2, &f3);
fprintf(fp_temp,"*************第 %d 个数据*****************\n",i+1);
fprintf(fp_temp,"改正前:m-%d %d %d %d %d %d %lf %.11e %.11e %.11e\n",
ephemeris.m, ephemeris.year ,ephemeris.month, ephemeris.day,ephemeris.hour, ephemeris.minute,
ephemeris.second, f1, f2, f3);
//check time value
if(ephemeris.second == 60.0) { ephemeris.second = 0.0; ephemeris.minute +=1; }
if(ephemeris.minute == 60 ) { ephemeris.minute = 0; ephemeris.hour +=1; }
if(ephemeris.hour == 24) { ephemeris.hour = 0; ephemeris.day +=1; }
//k
G_data[i*22+0] = ephemeris.m;
G_data[i*22+1] = ephemeris.year;
G_data[i*22+2] = ephemeris.month;
G_data[i*22+3] = ephemeris.day;
G_data[i*22+4] = ephemeris.hour;
G_data[i*22+5] = ephemeris.minute;
G_data[i*22+6] = ephemeris.second;//second
G_data[i*22+7] = f1; //
G_data[i*22+8] = f2; //
G_data[i*22+9] = f3; //
fprintf(fp_temp,"改正后:m-%d %d %d %d %d %d %lf %.11e %.11e %.11e\n",
ephemeris.m, ephemeris.year ,ephemeris.month, ephemeris.day,ephemeris.hour, ephemeris.minute,
ephemeris.second, f1,f2,f3);
int j_replace=0;
//读取其他三行
for(j=0; j<3; j++)
{
fgets(szBuf,MAX_BUF,flNavMsg);
DtoE(szBuf);
sscanf( szBuf, "%lf %lf %lf %lf", &f1, &f2, &f3, &f4);
G_data[(i*22+10)+j*4] = f1;
G_data[(i*22+10)+j*4+1] = f2;
G_data[(i*22+10)+j*4+2] = f3;
G_data[(i*22+10)+j*4+3] = f4;
j_replace=j;
fprintf(fp_temp,"%d\t%20.11e %20.11e %20.11e %20.11e\n",
j+1,G_data[(i*22+10)+j*4], G_data[(i*22+10)+j*4+1],
G_data[(i*22+10)+j*4+2], G_data[(i*22+10)+j*4+3]);
}
fprintf(fp_temp,"*************************************************************\n");
//星历中的数据块的数目
fgets(szBuf,MAX_BUF,flNavMsg);//继续读取一行
i++;
}
m_DIM=k;
fprintf(fp_temp,"********数据的维数为%d************\n",k);
fclose(fp_temp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -