📄 readon.cpp
字号:
#include "stdafx.h"
#include "ReadON.h"
#include "math.h"
CReadON::CReadON()
{
m_DIM=0;
}
CReadON::~CReadON()
{
}
/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
//
//将字符串中的D、d、E 转化为 e
void CReadON::DtoE(char s[])
{
int i;
int c;
for( i = 0 ;i<MAX_BUF ; i++)
{
c = s[i];
if(c == 'D'||c =='d'||c =='E')
s[i] ='e';
if(c =='\n')
break;
}
}
/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
//
// Caculate x=atan(y/z)
//
/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
BOOL CReadON::Get_atan(double X, double Y, double &result)
{
if((X==0)&&(Y==0))
return FALSE;
else if(X==0)
{
if(Y>0)
result=PI/2.0;
else
result=PI*3.0/2.0;
return TRUE;
}
else if(Y==0)
{
if(X>0)
result=0.0;
else
result=PI;
return TRUE;
}
else
{
result=atan(fabs(Y/X));
if ((Y>0)&&(X<0)) result=PI-result;
else if ((Y<0)&&(X<0)) result=PI+result;
else if ((Y<0)&&(X>0)) result=2*PI-result;
return TRUE;
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
int CReadON::GetGPSTime(int year, int month, int day, int hour, int minute, double second, double *gpstime)
{
int dayofw, dayofy, yr, ttlday, m, weekno;
int dinmth[ 13 ] ={0,31,28,31,30,31,30,31,31,30,31,30,31};
//// Check limits of day, month and year
if (year < 1981 || month < 1 || month > 12 || day < 1 || day > 31)
weekno = 0;
//// Convert day, month and year to day of year
if (month == 1)
dayofy = day;
else
{
dayofy = 0;
for (m=1; m<=(month-1); m++)
{
dayofy += dinmth[m];
if ( m==2 )
{
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
dayofy += 1;
}
}
dayofy += day;
}
//// Convert day of year and year into week number and day of week
ttlday = 360;
for (yr=1981; yr<=(year-1); yr++)
{
ttlday += 365;
if (yr % 4 == 0 && yr % 100 != 0 || yr % 400 ==0)
ttlday += 1;
}
ttlday += dayofy; //总天数
weekno = ttlday/7; //总星期数
dayofw = ttlday - 7 * weekno; //一星期总的天数
*gpstime = (hour * 3600 + minute * 60 + second + dayofw * 86400);
return weekno;
}
//////////////////////////////////////////////////////////////////////
void strMid(char* pszSrc, char* pszDest, size_t pos, size_t count)
{
size_t len;
len = strlen (pszSrc);
if (len>pos) {
memcpy (pszDest, pszSrc + pos, __min(count, len-pos+1));
pszDest[__min(count, len-pos+1) ] = 0;
}
}
void strTrim (char* pszSrc, char* pszDest) {
size_t len;
size_t i;
len = strlen (pszSrc);
for (i=0; i<len; i++) {
if (pszSrc[i] == ' ') {
}
else {
strcpy (pszDest, pszSrc+i);
len -= i;
break;
}
}
for (i=len-1; i>0; i--) {
if (pszDest[i] == ' ' || pszDest[i] == '\n') {
}
else {
pszDest[i+1] = 0;
break;
}
}
}
//////////////////////////////////////////////////////////////////////
//READ NAV
void CReadON::Read_N_Header(FILE *flNavMsg)
{
GPS_N_HEADER HEADER;
fgets(szBuf,MAX_BUF,flNavMsg);
#ifdef PRINT_N_HEADER
FILE* fp_temp;
fp_temp = fopen("N-Header-Check.txt","w");
#endif
///////////////////////////////////////////////////////////////////
// 读版本 char HEADER.Version[5]
///////////////////////////////////////////////////////////////////
if(strstr(szBuf,"RINEX"))
sscanf(szBuf,"%s",HEADER.Version);
#ifdef PRINT_N_HEADER
fprintf(fp_temp,"************************************\n");
fprintf(fp_temp,"The N-Rinex version: %s\n",HEADER.Version);
#endif
Begin:;
fgets(szBuf,MAX_BUF,flNavMsg);
////////////////////////////////////////////////////////////////////
// 读电离层参数
// double HEADER.Ion_Alpha/Belta[4] A0-A3 B0-B3
////////////////////////////////////////////////////////////////////
if(strstr(szBuf,"ION ALPHA"))
{
DtoE(szBuf);
sscanf(szBuf,"%lf %lf %lf %lf",
&HEADER.IonAlpha[0],
&HEADER.IonAlpha[1],
&HEADER.IonAlpha[2],
&HEADER.IonAlpha[3]);
#ifdef PRINT_N_HEADER
fprintf(fp_temp,"The Ion Alpha: %e\t%e\t%e\t%e\n",
HEADER.IonAlpha[0],
HEADER.IonAlpha[1],
HEADER.IonAlpha[2],
HEADER.IonAlpha[3]);
#endif
goto Begin;
}
if(strstr(szBuf,"ION BETA"))
{
DtoE(szBuf);
sscanf(szBuf,"%lf %lf %lf %lf",
&HEADER.IonBeta[0],
&HEADER.IonBeta[1],
&HEADER.IonBeta[2],
&HEADER.IonBeta[3]);
#ifdef PRINT_N_HEADER
fprintf(fp_temp,"The Ion Belta: %e\t%e\t%e\t%e\n",
HEADER.IonBeta[0],
HEADER.IonBeta[1],
HEADER.IonBeta[2],
HEADER.IonBeta[3]);
#endif
goto Begin;
}
////////////////////////////////////////////////////////////////////////
// 读取UTC时间的历书参数
// double HEADER.DeltaUtc[4] A0 A1 T W
////////////////////////////////////////////////////////////////////////
if(strstr(szBuf,"DELTA-UTC"))
{
DtoE(szBuf);
sscanf(szBuf,"%lf %lf %ld %ld",
&HEADER.DeltaUtc_A[0],
&HEADER.DeltaUtc_A[1],
&HEADER.DeltaUtc_TW[0],
&HEADER.DeltaUtc_TW[1]);
#ifdef PRINT_N_HEADER
fprintf(fp_temp,"The DeltaUtc A0 A1: %.15e\t%.15e\nThe DeltaUtc T W: %d\t%d\n",
HEADER.DeltaUtc_A[0],
HEADER.DeltaUtc_A[1],
HEADER.DeltaUtc_TW[0],
HEADER.DeltaUtc_TW[1]);
#endif
goto Begin;
}
///////////////////////////////////////////////////////
// 读秒跳 HEADER.m_iLeap 秒
///////////////////////////////////////////////////////
if(strstr(szBuf,"LEAP SECONDS"))
{
sscanf(szBuf,"%d",&HEADER.iLeapSeconds);
#ifdef PRINT_N_HEADER
fprintf(fp_temp,"The Second Leap: %d\n",HEADER.iLeapSeconds);
#endif
goto Begin;
}
if(strstr(szBuf,"END OF HEADER"))
{
#ifdef PRINT_N_HEADER
fprintf(fp_temp,"End of Header!\n");
fprintf(fp_temp,"************************************\n");
#endif
goto EndHead;
}
goto Begin;
EndHead:;
#ifdef PRINT_N_HEADER
fclose(fp_temp);
#endif
}
void CReadON::Read_N_Data(FILE *flNavMsg,double* N_data,EPHEMERIS ephemeris,int &m_DIM)
{
int i,j,k=0;
i=0;
//读取RINEX文件中所有的卫星的星历数据存放在内存中
//用于存放:年,月,日期,小时,分钟
//读取过程中存放每行中的四个数字
double f1, f2, f3, f4;
FILE* fp_temp1;
fp_temp1=fopen("N-Data-Check.txt","w");
fgetpos(flNavMsg,&pos);
while (!feof (flNavMsg))
{
{ for (j=0; j<=7; j++)
{fgets (szBuf, MAX_BUF, flNavMsg);}
if(feof (flNavMsg))
break;
k++;
}
}
// matrix a(k,36);
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.PRN, &ephemeris.year ,&ephemeris.month, &ephemeris.day,&ephemeris.hour, &ephemeris.minute,
&ephemeris.second, &ephemeris.a0, &ephemeris.a1, &ephemeris.a2);
fprintf(fp_temp1,"*************第 %d 个数据*****************\n",i+1);
fprintf(fp_temp1,"改正前:PRN-%d %d %d %d %d %d %lf %.11e %.11e %.11e\n",
ephemeris.PRN, ephemeris.year ,ephemeris.month, ephemeris.day,ephemeris.hour, ephemeris.minute,
ephemeris.second, ephemeris.a0, ephemeris.a1, ephemeris.a2);
//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
N_data[i*36+0] = ephemeris.PRN;
N_data[i*36+1] = ephemeris.year;
N_data[i*36+2] = ephemeris.month;
N_data[i*36+3] = ephemeris.day;
N_data[i*36+4] = ephemeris.hour;
N_data[i*36+5] = ephemeris.minute;
N_data[i*36+6] = ephemeris.second;//second
N_data[i*36+7] = ephemeris.a0;//SV clock bias (seconds)
N_data[i*36+8] = ephemeris.a1;//SV clock drift (sec/sec)
N_data[i*36+9] = ephemeris.a2;//SV clock drift rate (sec/sec2)
fprintf(fp_temp1,"改正后:PRN-%d %d %d %d %d %d %lf %.11e %.11e %.11e\n",
ephemeris.PRN, ephemeris.year ,ephemeris.month, ephemeris.day,ephemeris.hour, ephemeris.minute,
ephemeris.second, ephemeris.a0, ephemeris.a1, ephemeris.a2);
int j_replace=0;
//读取其他的六行
for(j=0; j<6; j++)
{
fgets(szBuf,MAX_BUF,flNavMsg);
DtoE(szBuf);
sscanf( szBuf, "%lf %lf %lf %lf", &f1, &f2, &f3, &f4);
N_data[(i*36+10)+j*4] = f1;
N_data[(i*36+10)+j*4+1] = f2;
N_data[(i*36+10)+j*4+2] = f3;
N_data[(i*36+10)+j*4+3] = f4;
j_replace=j;
fprintf(fp_temp1,"%d\t%20.11e %20.11e %20.11e %20.11e\n",
j+1,N_data[(i*36+10)+j*4], N_data[(i*36+10)+j*4+1],
N_data[(i*36+10)+j*4+2], N_data[(i*36+10)+j*4+3]);
}
fgets(szBuf,MAX_BUF,flNavMsg);//继续读取一行(7)
DtoE(szBuf);
sscanf( szBuf, "%lf %lf", &f1, &f2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -