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

📄 gpsobsmsg.cpp

📁 根据GPS卫星观测文件(.00O)与星历文件(.00N)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <string>
#include <vector>
#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>

#include "GPSOBSMSG.h"
#include "func.h"
#include "Predefine.h"

 
 
using namespace std;

void JudgeObsType(unsigned char* obsTypeList,string s,const int  pos) 
{
	if(s == "L1") obsTypeList[pos] = L1;
	else if(s == "L2") obsTypeList[pos] = L2;
	else if(s == "C1") obsTypeList[pos] = C1;
	else if(s == "P1") obsTypeList[pos] = P1;
	else if(s == "P2") obsTypeList[pos] = P2;
	else if(s == "D1") obsTypeList[pos] = D1;
	else if(s == "D2") obsTypeList[pos] = D2;
	else if(s == "T1") obsTypeList[pos] = T1;
	else if(s == "T2") obsTypeList[pos] = T2;
	else if(s == "S1") obsTypeList[pos] = S1;
	else if(s == "S2") obsTypeList[pos] = S2;
 
}
 
GPSOBSMSGHDR& GPSOBSMSGHDR::ReadObsHeader(ifstream& in)
{
	char sTemp[255];
	char sDataTemp[20];
	string sCheck;
	short it;
	in.getline(sTemp,200);   //忽略此行
	strMid(&byMajorVer,sTemp,20,1);  //为O文件
 	strMid(&byMinorVer,sTemp,40,1);   //为GPS文件
 

	in.getline(sTemp,200);   //pgm/runby/..忽略
	


	in.getline(sTemp,200);
	sCheck.assign(&sTemp[60],&sTemp[60+7]);
	while(sCheck == "COMMENT") {
 
		in.getline(sTemp,200);
		sCheck.assign(&sTemp[60],&sTemp[60+7]);
	}
	sCheck.assign(&sTemp[60],&sTemp[60+8]);
	if(sCheck == "OBSERVER"){
 
		in.getline(sTemp,200);
	}

    sCheck.assign(&sTemp[60],&sTemp[60+7]);
	while(sCheck == "COMMENT") {
 
		in.getline(sTemp,200);
		sCheck.assign(&sTemp[60],&sTemp[60+7]);
	}
	sCheck.assign(&sTemp[60],&sTemp[60+11]);
	if(sCheck == "MARKER NAME"){
 		strMid(szMarkName,sTemp,0,60);
 
	}
	in.getline(sTemp,240);
	sCheck.assign(&sTemp[60],&sTemp[60+13]);
	if(sCheck == "MARKER NUMBER"){
 	     strMid(szMarkNumber,sTemp,0,19);
 
	}
	else {
		sCheck.assign(&sTemp[60],&sTemp[60+19]);
		if(sCheck == "REC # / TYPE / VERS"){}
		 
	}
	in.getline(sTemp,200);
	sCheck.assign(&sTemp[60],&sTemp[60+19]);
//	if(sCheck == "REC # / TYPE / VERS")  //无需存储
//		cout<<"OK";   
	in.getline(sTemp,200);
	sCheck.assign(&sTemp[60],&sTemp[60+12]);
//	if(sCheck == "ANT # / TYPE")
//		cout<<"ant # type\n";
	in.getline(sTemp,200);
	sCheck.assign(&sTemp[60],&sTemp[60+19]);
	if(sCheck == "APPROX POSITION XYZ"){
		strMid(sDataTemp,sTemp,0,14);
		ApproxPos.dx = atof(sDataTemp);
		strMid(sDataTemp,sTemp,14,14);
		ApproxPos.dy = atof(sDataTemp);
		strMid(sDataTemp,sTemp,28,14);
		ApproxPos.dz = atof(sDataTemp);
 
	}
	else {
		cerr<<"The file is bad!\n";
		exit(1);
	}
	in.getline(sTemp,200);
	sCheck.assign(&sTemp[60],&sTemp[60+8]);
	if(sCheck == "ANTENNA:"){
		strMid(sDataTemp,sTemp,0,14);
		dAntHeight = atof(sDataTemp);
		strMid(sDataTemp,sTemp,14,14);
		AntOffset.East = atof(sDataTemp);
		strMid(sDataTemp,sTemp,28,14);
		AntOffset.North = atof(sDataTemp);
	}
	in.getline(sTemp,200);
	sCheck.assign(&sTemp[60],&sTemp[60+20]);
	if(sCheck == "WAVELENGTH FACT L1/2"){
	 	byL1Fact = sTemp[5];	
		byL2Fact =sTemp[11];
 
	}
	in.getline(sTemp,200);
	sCheck.assign(&sTemp[60],&sTemp[60+20]);  
	if(sCheck == "WAVELENGTH FACT L1/2")  //为可选项(可扩充)
	{    in.getline(sTemp,200);  }

	//判断都有哪些观测值
	sCheck.assign(&sTemp[60],&sTemp[60+19]);  
	if(sCheck == "# / TYPES OF OBSERV"){
		strMid(sDataTemp,sTemp,0,6);
		byNumberOfObsType = atoi(sDataTemp);		 
 
		if(byNumberOfObsType <= 9)
		{
			for(it = 0 ; it < byNumberOfObsType ; it++)
			{
				strMid(sDataTemp,sTemp,10 + 6*it,2);
		        sCheck.assign(&sDataTemp[0],&sDataTemp[2]);
		        JudgeObsType(byObsTypeList,sCheck,it);
 
			}
			byObsTypeList[it] = '\0';
		}
		else{
			for(it = 0 ; it < 9 ; it++)
			{
				strMid(sDataTemp,sTemp,10 + 6*it,2);
		        sCheck.assign(&sDataTemp[0],&sDataTemp[2]);
		        JudgeObsType(byObsTypeList,sCheck,it);
			}
			in.getline(sTemp,200);
			for(it = 9 ; it < byNumberOfObsType ; it++)
			{
				strMid(sDataTemp,sTemp,10 + 6*it,2);
		        sCheck.assign(&sDataTemp[0],&sDataTemp[2]);
		        JudgeObsType(byObsTypeList,sCheck,it);
				
			}
			byObsTypeList[it] = '\0';
		}

//	 	for(it = 0;byObsTypeList[it] != 0;it++)
//		    cout<<byObsTypeList[it]<<",";
	}

	//interval
	in.getline(sTemp,200);
	sCheck.assign(&sTemp[60],&sTemp[60+8]);
	if(sCheck == "INTERVAL"){
		strMid(sDataTemp,sTemp,0,10);
		wInterval = atoi(sDataTemp);
//		cout<<wInterval<<endl;
		in.getline(sTemp,200);
	}
	
	sCheck.assign(&sTemp[60],&sTemp[60+17]);
	if(sCheck == "TIME OF FIRST OBS"){
		strMid(sDataTemp,sTemp,0,6);
		tmStart.wYear = atoi(sDataTemp);
		strMid(sDataTemp,sTemp,6,6);
		tmStart.byMonth = atoi(sDataTemp);
		strMid(sDataTemp,sTemp,12,6);
		tmStart.byDay = atoi(sDataTemp);
		strMid(sDataTemp,sTemp,18,6);
		tmStart.byHour = atoi(sDataTemp);
		strMid(sDataTemp,sTemp,24,6);
		tmStart.byMinute = atoi(sDataTemp);
		strMid(sDataTemp,sTemp,30,13);
		tmStart.bySecond = atoi(sDataTemp);//note:没读时间系统的信息
 

		in.getline(sTemp,200);
	}
//	else throw file_error(); 
    
	sCheck.assign(&sTemp[60],&sTemp[60+16]);
	if(sCheck == "TIME OF LAST OBS"){
		strMid(sDataTemp,sTemp,0,6);
		tmEnd.wYear = atoi(sDataTemp);
		strMid(sDataTemp,sTemp,6,6);
		tmEnd.byMonth = atoi(sDataTemp);
		strMid(sDataTemp,sTemp,12,6);
		tmEnd.byDay = atoi(sDataTemp);
		strMid(sDataTemp,sTemp,18,6);
		tmEnd.byHour = atoi(sDataTemp);
		strMid(sDataTemp,sTemp,24,6);
		tmEnd.byMinute = atoi(sDataTemp);
		strMid(sDataTemp,sTemp,30,13);
		tmEnd.bySecond = atoi(sDataTemp);//note:没读时间系统的信息
 
		in.getline(sTemp,200);
	}

	sCheck.assign(&sTemp[60],&sTemp[60+19]);
	if(sCheck == "RCV CLOCK OFFS APPL") {//是否使用实时确定出的接收机
		           //钟偏差进行了改正
		in.getline(sTemp,200);
	}

	sCheck.assign(&sTemp[60],&sTemp[60+12]);
	if(sCheck == "LEAP SECONDS"){//跳秒数
		in.getline(sTemp,200);
	}
	sCheck.assign(&sTemp[60],&sTemp[60+15]);
	if(sCheck == "# OF SATELLITES"){  //文件中存储有观测值的卫星数量
 
		in.getline(sTemp,200);
	}
	sCheck.assign(&sTemp[60],&sTemp[60+14]);
	while(sCheck == "PRN / # OF OBS"){
 		in.getline(sTemp,200);
		sCheck.assign(&sTemp[60],&sTemp[60+14]);
	}
	sCheck.assign(&sTemp[60],&sTemp[60+13]);
//	if(sCheck == "END OF HEADER")
//		cout<<"END OF HEADER!\n";

 return *this;
}

/*
GPSOBS::GPSOBS(const GPSOBS& from)
{ 
	this->tagObs = from.tagObs;
	 byPRN = from.byPRN;
     dC1   = from.dC1;
	 dP1   = from.dP1;
	 dP2   = from.dP2;
	 dL1   = from.dL1;
	 byL1LLI = from.byL1LLI; 
	 byL1Strength = from.byL1Strength;
	 dL2          = from.dL2;
	 byL2LLI      = from.byL2LLI;
	 byL2Streagth = from.byL2Streagth;
	 dT1          = from.dT1;
	 dT2          = from.dT2;
	 dD1          = from.dD1;
	 dD2          = from.dD2;
	 dS1          = from.dS1;
	 dS2          = from.dS2;
 
	 this->tagGSignal = from.tagGSignal ; 
}

GPSOBS& GPSOBS::operator = (const GPSOBS& from)
{
	 this->tagObs = from.tagObs;
	 byPRN    = from.byPRN;
     dC1      = from.dC1;
	 dP1      = from.dP1;
	 dP2      = from.dP2;
	 dL1      = from.dL1;
	 byL1LLI  = from.byL1LLI; 
	 byL1Strength = from.byL1Strength;
	 dL2          = from.dL2;
	 byL2LLI      = from.byL2LLI;
	 byL2Streagth = from.byL2Streagth;
	 dT1          = from.dT1;
	 dT2          = from.dT2;
	 dD1          = from.dD1;
	 dD2          = from.dD2;
	 dS1          = from.dS1;
	 dS2          = from.dS2;
 
	 this->tagGSignal = from.tagGSignal ; 

	 return *this;
}
 
*/	


OneEpochORec::OneEpochORec(const OneEpochORec& r)
{
	this->tagGSignal = r.tagGSignal;
	this->tmEpoch = r.tmEpoch;
	this->ObsList.assign(r.ObsList.begin(),r.ObsList.end());
}

 
int OneEpochORec::Size()
{
	return this->ObsList.size();
}

OneEpochORec::~OneEpochORec()
{
//    for_each (this->ObsList.begin() , this->ObsList.end() , CDeleteObject());  //此句不懂为什么会有问题
	vector<GPSOBS*>::iterator iter_obs;
	iter_obs = this->ObsList.begin();
	CString str;
	str.Format("%d",this->ObsList.size());
//	AfxMessageBox(str);
	if(this->ObsList.size() != 0)
	{
		for( ; iter_obs!= this->ObsList.end();iter_obs++)
		{
//		  delete iter_obs;
			(*iter_obs)->~GPSOBS();
		  str.Format("%d",this->ObsList.size()-1);
//		  AfxMessageBox(str);
		}

	}


	this->ObsList.clear();
}


GPSOBSMSG::GPSOBSMSG(ifstream& ofile)
{
//	ofstream test("test.txt");//use for testing用于测试单历元观测数据有无按卫星号大小排号序

	int i =0;
	int k = 0;

	Hdr.ReadObsHeader(ofile);
	int numOfObsType = Hdr.byNumberOfObsType;
	OneEpochORec* pEpochObs ;


	char strTemp[255];
	char resTemp[20];
	int numOfSat;
	int aa =0;
	do
	{
	  pEpochObs = new OneEpochORec;

	  //读取第一行
	  ofile.getline(strTemp,200);

     //输入时间
	  strMid(resTemp,strTemp,1,2);
	  pEpochObs->tmEpoch. wYear = atoi(resTemp);
	  if(pEpochObs->tmEpoch. wYear <81) pEpochObs->tmEpoch. wYear += 2000;

	  strMid(resTemp,strTemp,1+3,2);
	  pEpochObs-> tmEpoch.byMonth = atoi(resTemp);

	  strMid(resTemp,strTemp,4+3,2);
	  pEpochObs-> tmEpoch.byDay = atoi(resTemp);

	  strMid(resTemp,strTemp,7+3,2);
	  pEpochObs-> tmEpoch.byHour = atoi(resTemp);

	  strMid(resTemp,strTemp,10+3,2);
      pEpochObs-> tmEpoch.byMinute = atoi(resTemp);

	  strMid(resTemp,strTemp,12+3,11);
	  pEpochObs-> tmEpoch.bySecond = atoi(resTemp);

	  //输入历元标志
	  strMid(resTemp,strTemp,15+11+2,1);
	  pEpochObs-> tagGSignal = atoi(resTemp);


	 //卫星数
	 strMid(resTemp,strTemp,28+1,3);
	 numOfSat = atoi(resTemp);
     if(numOfSat != 0)
	 {
		 this->ReadOneEpochRec(ofile,numOfObsType, pEpochObs,numOfSat,strTemp);
	 }	

	 /* //用于测试单历元观测数据有无按卫星号大小排号序
	 for(int f = 0;f<pEpochObs->ObsList.size();f++)
	 {
		 test<<(pEpochObs->ObsList[f])->byPRN<<"\t";
	 }
      test<<endl;
	  */


	 if(numOfSat == 0) break;

	 this->pEpochObsList.push_back(pEpochObs);	 
 
	 i++;

	}while( !ofile.eof());

	this->X = 0;
	this->Y = 0;
	this->Z = 0;

	pEpochObs = new OneEpochORec;
	delete pEpochObs;



   
	////////////////////////设置变量的初始值
	this->B = 0;
	this->L = 0;
	this->H = 0;
	this->Model = 1;//默认的对流层改正模型为Saastamonen模型
 
}

GPSOBSMSG& GPSOBSMSG::ReadOneEpochRec(ifstream& ofile,const int numOfObsType,
		OneEpochORec* pOneEpoch,int numOfSat,char* SatPrnList)  //070223
{
	int i = 0;
	int j = 0;
	int k = 0;
	char strTemp[255];
	char resTemp[20];
	GPSOBS* pObs;

	vector<GPSOBS*>::iterator iter_Obs;

 	int* prnList = new int[numOfSat];

	for( i =0 ; i<numOfSat ;i++)
	{
		 strMid(resTemp,SatPrnList,29+3+1+3*i,2);
		 prnList[i] = atoi(resTemp);		 
	 }

 for(k = 0;k<numOfSat;k++)
 {//for 1
	 pObs = new GPSOBS;

	 pObs->byPRN = prnList[k];
	 pObs->tagObs = true;

	 ofile.getline(strTemp,200);

		for(i=0;i<numOfObsType;i++)
		{//for2
			 
			if (i==5){
				ofile.getline(strTemp,200);
				j = i - 5;
			}
		    //输入观测值
			unsigned char c = this->Hdr.byObsTypeList[i];
			switch(c)
			{
			case L1:
				strMid(resTemp,strTemp,0+16*j,14);
				pObs->dL1 = atof(resTemp);
				break;
			case L2:
				strMid(resTemp,strTemp,0+16*j,14);
				pObs->dL2 = atof(resTemp);
				break;
			case C1:
				strMid(resTemp,strTemp,0+16*j,14);
				pObs->dC1 = atof(resTemp);
				break;
			case P1:
				strMid(resTemp,strTemp,0+16*j,14);
				pObs->dP1  = atof(resTemp);
				break;
			case P2:
				strMid(resTemp,strTemp,0+16*j,14);
				pObs->dP2  = atof(resTemp);
				break;
			case D1:
				strMid(resTemp,strTemp,0+16*j,14);
				pObs->dD1 = atof(resTemp);
				break;
			case D2:
				strMid(resTemp,strTemp,0+16*j,14);
				pObs->dD2 = atof(resTemp);
				break;
			case T1:
				strMid(resTemp,strTemp,0+16*j,14);
				pObs->dT1 = atof(resTemp);
				break;
			case T2:
				strMid(resTemp,strTemp,0+16*j,14);
				pObs->dT2  = atof(resTemp);
				break;
			case S1:
				strMid(resTemp,strTemp,0+16*j,14);
				pObs->dS1  = atof(resTemp);
				break;
			case S2:
				strMid(resTemp,strTemp,0+16*j,14);
				pObs->dS2 = atof(resTemp);
				break;
			}//结束switch
			j++;
		}//end for2
		j=0;

		//将观测值按卫星号的大小进行排序
		iter_Obs = pOneEpoch->ObsList.begin();
		if(pOneEpoch->ObsList.size() != 0)
		{
			for(; iter_Obs != pOneEpoch->ObsList.end();iter_Obs ++)
			{
				if((*iter_Obs)->byPRN > pObs->byPRN )
					break;
			}

		}
		if(iter_Obs == pOneEpoch->ObsList.end())
		{
			pOneEpoch->ObsList.push_back(pObs);
		}
		else

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -