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

📄 getrnxo.cpp

📁 卫星单点定位程序
💻 CPP
字号:
#include "GetRnxO.h"

void* GetGMO (char *FileName)
{
	int		i,j;
	char	markname[][21] = 	//标签名称
	{ 
		"RINEX VERSION / TYPE",
		"PGM / RUN BY / DATE",
		"MARKER NAME",
		"MARKER NUMBER",
		"OBSERVER / AGENCY",
		"REC # / TYPE / VERS",
		"ANT # / TYPE",
		"APPROX POSITION XYZ",
		"ANTENNA: DELTA H/E/N",
		"WAVELENGTH FACT L1/2",
		"# / TYPES OF OBSERV",
		"INTERVAL",
		"TIME OF FIRST OBS",
		"TIME OF LAST OBS",
		"RCV CLOCK OFFS APPL",
		"LEAP SECONDS",
		"# OF SATELLITES",
		"PRN / # OF OBS",
		"END OF HEADER",
	};
	char	mark_number[_MAX_RNXO_MARK_NUMBER];	//数据字符串
	char	mark_name[_MAX_RNXO_MARK_NAME];		//文件头标签
//	long	fpos,fpos0;							//文件位置指针
	PGMO	gmo;
	FILE	*datafile;
	long	fpos, fpos0;
	int		nr1	= 100;							//历元已分配空间的 历元 数



	gmo	= (PGMO) malloc ( sizeof (GMO));
	if (gmo == NULL)	{
		printf ("内存分配错误!");
		return NULL;
	}
	memset (gmo, 0, sizeof (GMO));			//结构中的所有都置 0

	datafile	= fopen (FileName, "r");
	if (datafile == NULL)	{
		printf ("观测数据文件不存在,请检查文件是否存在!");
		free (gmo);
		return NULL;
	}
	
	for ( ; ; )	{
		int tmp1=0;        //数据类型标签序号
		fgets (mark_number, _MAX_RNXO_MARK_NUMBER, datafile);		//读入数据字符串
		if (strlen(mark_number) < 60)	{
			continue;
		}
		fgets (mark_name, _MAX_RNXO_MARK_NAME, datafile);			//读入标签字符串
		for (i=0; i<19; i++)	{
			tmp1	= strncmp(mark_name, markname[i], strlen(markname[i]));	//逐个比较标签
			if (tmp1!=0) {
				continue;
			}
			tmp1	= i;

			switch (tmp1)	{
				case 0:				//RINEX VERSION / TYPE
					sscanf (mark_number, "%d.%d", &gmo->hdr.ver_major, 
						&gmo->hdr.ver_minor);	
					break;

				case 1:				//PGM / RUN BY / DATE
//					strncpy (gmo->hdr.Pgm, mark_number, 20);
//					strncpy (gmo->hdr.RunBy, mark_number+20, 20);
//					strncpy (gmo->hdr.Date, mark_number+40, 20);	
					break;

				case 2:				//MARKER NAME
					strncpy (gmo->hdr.marker_name, mark_number,
						_MAX_RNX_MARKER_NAME - 1);
					break;

				case 3:				//MARKER NUMBER
					strncpy (gmo->hdr.marker_number, mark_number,
						_MAX_RNX_MARKER_NUMBER - 1);
					break;

				case 4:				//OBSERVER / AGENCY
					break;

				case 5:				//REC # / TYPE / VERS
					strncpy (gmo->hdr.rcvr_sn, mark_number, _MAX_RNX_RCVR_SN-1);
					strncpy (gmo->hdr.rcvr_type, mark_number+_MAX_RNX_RCVR_SN-1,
						_MAX_RNX_RCVR_TYPE - 1);
					strncpy (gmo->hdr.rcvr_ver, mark_number + _MAX_RNX_RCVR_SN
						+ _MAX_RNX_RCVR_TYPE - 2, _MAX_RNX_RCVR_VER - 1);
					break;
				case 6:				//ANT # / TYPE
					strncpy (gmo->hdr.ant_sn, mark_number, _MAX_RNX_ANT_SN - 1);
					strncpy (gmo->hdr.ant_type, mark_number + _MAX_RNX_ANT_SN-1,
						_MAX_RNX_ANT_TYPE - 1);
					i=i;
					break;

				case 7:				//APPROX POSITION XYZ
					gmo->hdr.approx_pos.z	= csatof(mark_number + 28, 14);
					gmo->hdr.approx_pos.y	= csatof(mark_number + 14, 14);
					gmo->hdr.approx_pos.x	= csatof(mark_number, 14);
					break;
					
				case 8:				//ANTENNA: DELTA H/E/N
					gmo->hdr.ant_delta.northing	= csatof(mark_number + 28, 14);
					gmo->hdr.ant_delta.easting	= csatof(mark_number + 14, 14);
					gmo->hdr.ant_delta.upping	= csatof(mark_number, 14);
					break;
					
				case 9:				//WAVELENGTH FACT L1/2
					gmo->hdr.wavelen_fact[1]	= csatol(mark_number + 6, 6);
					gmo->hdr.wavelen_fact[0]	= csatol(mark_number, 6);
					break;
					
				case 10:			//# / TYPES OF OBSERV
					sscanf(mark_number, "%6ld", &gmo->hdr.obs_type_number);
					for (j=0; j<gmo->hdr.obs_type_number; j++)	{
						strncpy(gmo->hdr.obs_type[j], mark_number+10+j*6, 2);
					}
					break;
					
				case 11:			//INTERVAL
					gmo->hdr.interval	= csatof(mark_number, 10);
					break;
					
				case 12:			//TIME OF FIRST OBS
					gmo->hdr.start_time.second	= csatof(mark_number + 30, 13);
					gmo->hdr.start_time.minute	= (unsigned char) csatol(mark_number + 24, 6);
					gmo->hdr.start_time.hour	= (unsigned char) csatol(mark_number + 18, 6);
					gmo->hdr.start_time.day		= (unsigned char) csatol(mark_number + 12, 6);
					gmo->hdr.start_time.month	= (unsigned char) csatol(mark_number + 6, 6);
					gmo->hdr.start_time.year	= (unsigned short) csatol(mark_number, 6);
					break;
					
				case 13: 			//TIME OF LAST OBS
					gmo->hdr.end_time.second	= csatof(mark_number + 30, 13);
					gmo->hdr.end_time.minute	= (unsigned char) csatol(mark_number + 24, 6);
					gmo->hdr.end_time.hour		= (unsigned char) csatol(mark_number + 18, 6);
					gmo->hdr.end_time.day		= (unsigned char) csatol(mark_number + 12, 6);
					gmo->hdr.end_time.month		= (unsigned char) csatol(mark_number + 6, 6);
					gmo->hdr.end_time.year		= (unsigned short) csatol(mark_number, 6);
					break;
					
				case 14:			//RCV CLOCK OFFS APPL
					gmo->hdr.rcvr_clock_offs_appl	= csatol(mark_number, 6);
					break;
					
				case 15:			//LEAP SECONDS
					gmo->hdr.leap_seconds	= csatol(mark_number, 6);
					break;

				case 16:			//# OF SATELLITES
					;
					break;

				case 17:			//PRN / # OF OBS
					;
					break;
				default :
					break;

			}
			break;
		}
		//如果读到文件头结束标签则计算观测值种类并结束文件头读取
		if (tmp1 == 18)	{	
			for (i=0 ; i<gmo->hdr.obs_type_number; i++)	{
				for (j=0; j<_MAX_CNT_OBS_TYPE; j++)	{
					if (strncmp (gmo->hdr.obs_type[i], gop[j].obs_id,
						_MAX_ROID - 1) == 0)
					{
						gmo->hdr.gop[i]	= j;
						if (j == 0 || j == 2)	{
							if (gmo->hdr.wavelen_fact[gop[j].wl_pos-1] == 2) {
								gmo->hdr.gop[i]++;
							}
						}
						break;
					}
				}
			}
			break;
		}
	}
	
	gmo->record	= (PGMOREC) malloc (nr1 * sizeof (GMOREC));
	memset(gmo->record, 0, nr1 * sizeof (GMOREC));
	for ( ; ; )	{		

		fpos0	= ftell (datafile);	//取得读取前的文件指针位置
		
		fpos	= GetGMORecord (datafile, &gmo->record[gmo->hdr.epoch_number], 
			gmo->hdr.obs_type_number, fpos0);
		if (fpos == -2)	{
			break;
		}
		if (fpos == -1)	{
			fseek (datafile, fpos0, SEEK_SET);
		}
		if (fpos > 0)	{
			gmo->hdr.epoch_number++;
			if (gmo->hdr.epoch_number == nr1)	{
				PGMOREC	rec;
				nr1	+= 100;
				rec	= (PGMOREC) malloc (nr1 * sizeof (GMOREC));
				memset(rec, 0, nr1 * sizeof (GMOREC));
				memcpy (rec,gmo->record, (nr1-100) * sizeof (GMOREC));
				free (gmo->record);
				gmo->record	= rec;
			}
			fpos0	= fpos;
		}
	}
	return gmo;
}


//读取单一历元的数据
long GetGMORecord (FILE *datafile,		//包含观测数据的文件指针
				  PGMOREC rec,			//记录结构指针
				  long obs_type_number,	//观测类型数
				  long fpos)			//文件位置
{
	char	str[_MAX_RNXO_DATA]	= {0};	//单行数据
	long	counter				= 0;	//已读取观测数据个数
	long	sum					= 0;	//总观测数据个数
	int		i,j;

	fseek (datafile, fpos, SEEK_SET);
	if (feof(datafile) != 0)	{		//读到文件尾
			return -2;
		}

	for ( ; ; )	{
		fgets(str, _MAX_RNXO_DATA, datafile);
		if (feof(datafile) != 0)	{		//读到文件尾
			return -2;
		}
		if (strlen(str) < 14)	{				//字符串长度小于 一个数据长度
			continue;
		}
		
		//读取历元时刻
		rec->epoch.year		= (unsigned short) csatol(str+1, 2);
		rec->epoch.month	= (unsigned char) csatol(str+4, 2);
		rec->epoch.day		= (unsigned char) csatol(str+7, 2);
		rec->epoch.hour		= (unsigned char) csatol(str+10, 2);
		rec->epoch.minute	= (unsigned char) csatol(str+13, 2);
		rec->epoch.second	= csatof(str+16, 11);
		if (rec->epoch.year > 79)	{
			rec->epoch.year+=1900;
		}
		else	{
			rec->epoch.year+=2000;
		}

		rec->sat_num		= csatol(str+30, 3);
		//读取 PRN 列表
		j	= 0;
		for (i=0; i < (rec->sat_num+11)/12; i++)	{
			if (i > 0) {		//卫星数超过一行,使用续行
				fgets(str, _MAX_RNXO_DATA, datafile);
			}
			for ( ; j<rec->sat_num && j<(i+1)*12; j++)	{
				rec->sat_list[j]	= csatol(str+33+j%12*3, 2);
			}
		}
		//如果有接收机钟的偏差
		if (strlen(str) > 68)	{
			rec->rcvr_clk_bias	= csatof(str+68, 12);
		}

		//读取观测值
		rec->obs	= (GPSOBS *) malloc (obs_type_number * rec->sat_num * sizeof (GPSOBS));
		memset(rec->obs, 0, obs_type_number * rec->sat_num * sizeof (GPSOBS));
		sum	= obs_type_number * rec->sat_num;
		for (counter = 0; counter < sum; )	{				//读取观测值数据
			if (feof(datafile) != 0)	{					//读到文件尾
				return -2;
			}
			if (((counter % obs_type_number) % 5) == 0)	{	//是否读取新的数据行
				fgets(str, _MAX_RNXO_DATA, datafile);
			}
			for (i=0; i < (long)strlen(str)/16; i++)	{
				csatoobs(str + i * 16, &rec->obs[counter]);
				counter++;
			}
		}
		if (counter == sum)	{
			return ftell(datafile);
		}
	}

	return -1;
}


//将一个字符串转换成一个GPS观测数据
GPSOBS * csatoobs(const char *str, GPSOBS *obs)
{
	obs->tag2	= csatol(str + 15, 1);
	obs->tag1	= csatol(str + 14, 1);
	obs->value	= csatof(str, 14);
	return obs;
}


⌨️ 快捷键说明

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