📄 getgmo.cpp
字号:
///////////////////////////////////////////////20 125 148
#include "GetGMO.h"
#include "Rinex.h"
#include "Substr.h"
#include "time.h"
#include <stdlib.h>
#include <list>
#include <fstream>
#include "iostream.h"
GMOHDR GetGMOHDR(char *filename)//GPS观测信息头文件
{
GMOHDR gmoh;
PGMOHDR pgmoh=&gmoh;
ifstream infile(filename,ios::in|ios::nocreate);
if(!infile)
{
cerr<<"open file error!"<<endl;
exit(1);
}
while(!infile.eof())
{
char str[100];
infile.getline(str,100,'\n');
if(!strcmp("RINEX VERSION / TYPE",substr(str,60,79)))//版本号
{
pgmoh->ver_major=atoi(substr(str,5,5));
pgmoh->ver_minor=atoi(substr(str,7,8));
}
if(!strcmp("MARKER NAME",substr(str,60,70)))//
{
strcpy(pgmoh->mark_name,substr(str,0,59));
}
if(!strcmp("MARKER NUMBER",substr(str,60,72)))//
{
strcpy(pgmoh->mark_number,substr(str,0,59));
}
if(!strcmp("REC # / TYPE / VERS",substr(str,60,78)))//
{
strcpy(pgmoh->rcvr_sn,substr(str,0,19));
strcpy(pgmoh->rcvr_type,substr(str,20,39));
strcpy(pgmoh->rcvr_ver,substr(str,40,59));
}
if(!strcmp("ANT # / TYPE",substr(str,60,71)))//
{
strcpy(pgmoh->ant_sn,substr(str,0,19));
strcpy(pgmoh->ant_type,substr(str,20,39));
}
if(!strcmp("ANTENNA: DELTA H/E/N",substr(str,60,79)))//天线高 相位偏差
{
pgmoh->ant_delta.upping=atof(substr(str,0,13));
pgmoh->ant_delta.easting=atof(substr(str,14,27));
pgmoh->ant_delta.northing=atof(substr(str,28,41));
}
if(!strcmp("APPROX POSITION XYZ",substr(str,60,78)))//标准近似位置
{
pgmoh->approx_pos.x=atof(substr(str,0,13));
pgmoh->approx_pos.y=atof(substr(str,14,27));
pgmoh->approx_pos.z=atof(substr(str,28,41));
}
if(!strcmp("INTERVAL",substr(str,60,67)))//采集数据时间间隔
{
pgmoh->interval=atof(substr(str,0,9));
}
if(!strcmp("TIME OF FIRST OBS",substr(str,60,76)))//结束时间
{
pgmoh->start.year=atoi(substr(str,0,5));
pgmoh->start.month=atoi(substr(str,6,11));
pgmoh->start.day=atoi(substr(str,12,17));
pgmoh->start.hour=atoi(substr(str,18,23));
pgmoh->start.minute=atoi(substr(str,24,29));
pgmoh->start.second=atof(substr(str,30,35));
}
if(!strcmp("TIME OF LAST OBS",substr(str,60,75)))//开始时间
{
pgmoh->end.year=atoi(substr(str,0,5));
pgmoh->end.month=atoi(substr(str,6,11));
pgmoh->end.day=atoi(substr(str,12,17));
pgmoh->end.hour=atoi(substr(str,18,23));
pgmoh->end.minute=atoi(substr(str,24,29));
pgmoh->end.second=atof(substr(str,30,35));
}
if(!strcmp("LEAP SECONDS",substr(str,60,71)))//自1980 1 6 以来的跳秒数
{
pgmoh->leap_seconds=atof(substr(str,0,5));
}
if(!strcmp("# / TYPES OF OBSERV",substr(str,60,78)))//观测值数量及类型
{
pgmoh->obs_type_number=atoi(substr(str,0,5));
if(pgmoh->obs_type_number<=9) //不必续航
for(int i=0;i<pgmoh->obs_type_number;i++)
{
if(!strcmp("L1",substr(str,10+6*i,11+6*i)))
pgmoh->obs_type_list[i]=L1; //L1,L2,P1,P2.......均为枚举类型
if(!strcmp("L2",substr(str,10+6*i,11+6*i)))
pgmoh->obs_type_list[i]=L2;
if(!strcmp("P1",substr(str,10+6*i,11+6*i)))
pgmoh->obs_type_list[i]=P1;
if(!strcmp("P2",substr(str,10+6*i,11+6*i)))
pgmoh->obs_type_list[i]=P2;
if(!strcmp("S1",substr(str,10+6*i,11+6*i)))
pgmoh->obs_type_list[i]=S1;
if(!strcmp("S2",substr(str,10+6*i,11+6*i)))
pgmoh->obs_type_list[i]=S2;
if(!strcmp("C1",substr(str,10+6*i,11+6*i)))
pgmoh->obs_type_list[i]=C1;
if(!strcmp("D1",substr(str,10+6*i,11+6*i)))
pgmoh->obs_type_list[i]=D1;
if(!strcmp("T1",substr(str,10+6*i,11+6*i)))
pgmoh->obs_type_list[i]=T1;
}
if(pgmoh->obs_type_number>9) //不必续航
cerr<<"观测值类型大于9!!!!!请续航"<<endl;
}
if(!strcmp("# OF SATELLITES",substr(str,60,74)))//记录在案的卫星数量
{
pgmoh->size=atof(substr(str,0,5));
}
if(!strcmp("END OF HEADER",substr(str,60,72)))
{
break;
}
}
return gmoh;
}
void GetGMOREC(char* filename, list <PGMOREC>& RecList)//GPS观测信息 记录数据
{
ifstream infile(filename,ios::in|ios::nocreate); // 定义输入文件流对象,以输入方式打开磁盘文件 filename
if(!infile)
{
cerr<<"open file error!"<<endl;
exit(1);
}
GMOHDR gmoh;/////////////////////////////
gmoh=GetGMOHDR(filename);///////////////获取观测值类型的数量
int obs_type=gmoh.obs_type_number;//////
while(!infile.eof())
{
char str[100];
infile.getline(str,100,'\n');
if(!strcmp("END OF HEADER",substr(str,60,72)))
while(!infile.eof())
{
PGMOREC pgmor=new GMOREC;//定义指针
infile.getline(str,100,'\n');
pgmor->sign_of_use=atoi(substr(str,28,28));//pgmor->sign_of_use 表示历元观测标志 0 表示有效
if(pgmor->sign_of_use==0)
{
pgmor->epoch.year=atoi(substr(str,1,2));
pgmor->epoch.month=atoi(substr(str,4,5));
pgmor->epoch.day=atoi(substr(str,7,8));
pgmor->epoch.hour=atoi(substr(str,10,11));
pgmor->epoch.minute=atoi(substr(str,13,14));
pgmor->epoch.second=atof(substr(str,15,25));
pgmor->num_sat=atoi(substr(str,29,31)); //该历元观测到的卫星数
pgmor->rcvr_clk_bias=atof(substr(str,68,79));// 接收机鈡差
for (int i=0;i<pgmor->num_sat;i++)
pgmor->prn_lst[i]=atoi(substr(str,33+i*3,34+i*3));//读取卫星号 观测卫星都是GPS卫星
//以下读取各卫星的观测值
for(i=0;i<pgmor->num_sat;i++)
{
infile.getline(str,100,'\n');
for(int j=0;j<obs_type;j++) // obs_type 观测值类型(L1,P1.......)数量
pgmor->value[i][j]=atof(substr(str,16*j,16*j+13));
}
}
/*
if(pgmor->sign_of_use==0)
{
pgmor->num_sat=atoi(substr(str,29,31)); //该历元观测到的卫星数
for(int i=0;i<pgmor->num_sat;i++)
infile.getline(str,100,'\n');
}
*/
if(pgmor->sign_of_use!=0) //该时刻观测值无效
{
int k=atoi(substr(str,29,31)); //接下来的k行均无效
for(int i=0;i<k;i++)
infile.getline(str,100,'\n');
}
RecList.push_back(pgmor);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -