⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readon.cpp

📁 gps 卫星位置的计算
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -