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

📄 getgmo.cpp

📁 读取GPS的Rinex观测文件
💻 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 + -