📄 gpsobsmsg.cpp
字号:
#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 + -