//ReadObsFun.cpp
#include <iostream>
#include "ReadOBSFun.h"
#include "CommonFun.h"
bool ReadOBSHeader(FILE *fp,GMOHDR &hdr)
{
char oneline[_MAX_LEN_ONELINE] = {'\0'};
char temp[_MAX_LEN_TEMP]={'\0'};
while( fgets(oneline,_MAX_LEN_ONELINE,fp) )//读取一行数据,存储在oneline数组中
{
if(strstr(oneline,"COMMENT"))//从字符串str1中查找是否有字符串str2
{
continue;
}
else if(strstr(oneline,"RINEX VERSION / TYPE"))
{
cpstr(temp,oneline,0,8,_MAX_LEN_TEMP);
hdr.versn=atof(temp);//atof()把字符串转化成浮点,版本号
cpstr(temp,oneline,40,59,_MAX_LEN_TEMP);
hdr.FileType=temp[0];//读取观测类型
}
else if(strstr(oneline,"MARKER NAME"))//天线标志的名称
{
cpstr(hdr.MarkName,oneline,0,59,sizeof(hdr.MarkName));
}
else if(strstr(oneline,"MARKER NUMBER"))//天线标志的编号
{
cpstr(hdr.MarkNum,oneline,0,19,sizeof(hdr.MarkNum));
}
else if (strstr(oneline, "MARKER TYPE"))//测量标志类型
{
cpstr(hdr.MarkType, oneline, 0, 19, sizeof(hdr.MarkType));
}
else if(strstr(oneline,"REC # / TYPE / VERS"))//接收机序列号、类型和版本号
{
cpstr(hdr.RecvSN,oneline,0,19,sizeof(hdr.RecvSN));
cpstr(hdr.RecvType,oneline,20,39,sizeof(hdr.RecvType));
cpstr(hdr.RecvVersn,oneline,40,59,sizeof(hdr.RecvVersn));
}
else if(strstr(oneline,"ANT # / TYPE"))//天线序列号以及类型
{
cpstr(hdr.AntSN,oneline,0,19,sizeof(hdr.AntSN));
cpstr(hdr.AntType,oneline,20,39,sizeof(hdr.AntType));
}
else if(strstr(oneline,"APPROX POSITION XYZ"))//标志的近似位置(WGS84)
{
cpstr(temp,oneline,0,13,_MAX_LEN_TEMP);
hdr.ApproxPos.x=atof(temp);
cpstr(temp,oneline,14,27,_MAX_LEN_TEMP);
hdr.ApproxPos.y=atof(temp);
cpstr(temp,oneline,28,41,_MAX_LEN_TEMP);
hdr.ApproxPos.z=atof(temp);
}
else if(strstr(oneline,"ANTENNA: DELTA H/E/N"))//1、天线高:高于标志的天线下表面高度;2、天线中心相对于标志在东向和北上的偏心
{
cpstr(temp,oneline,0,13,_MAX_LEN_TEMP);
hdr.AntDelta.H=atof(temp);
cpstr(temp,oneline,14,27,_MAX_LEN_TEMP);
hdr.AntDelta.E=atof(temp);
cpstr(temp,oneline,28,41,_MAX_LEN_TEMP);
hdr.AntDelta.N=atof(temp);
}
else if(strstr(oneline,"WAVELENGTH FACT L1/2"))//缺省的L1和L2载波的波长因子(1表示为全波,2表示为半波(载波为平方法测定),0(位于L2的位置上)表示用借手机你为单频仪器)
{
cpstr(temp,oneline,0,5,_MAX_LEN_TEMP);
hdr.WaveLen_L1=atoi(temp);
cpstr(temp,oneline,6,11,_MAX_LEN_TEMP);
hdr.WaveLen_L2=atoi(temp);
}
else if(strstr(oneline,"# / TYPES OF OBSERV"))//1、在本数据文件中所存储不同观测值类型的数量;2、观测值类型列表;3、如果超过9种观测值类型,则使用续行
{
cpstr(temp,oneline,0,5,_MAX_LEN_TEMP);
hdr.ObsvTypCount=atoi(temp);
if(hdr.ObsvTypCount<=9)
{
for(int i=1;i<=hdr.ObsvTypCount;i++)
{
cpstr(temp,oneline,6*i,6*i+5,_MAX_LEN_TEMP);
if(strstr(temp, "C1"))
hdr.ObsvType.push_back(C1);
else if(strstr(temp, "L1"))
hdr.ObsvType.push_back(L1);
else if(strstr(temp, "L2"))
hdr.ObsvType.push_back(L2);
else if(strstr(temp, "P1"))
hdr.ObsvType.push_back(P1);
else if(strstr(temp, "P2"))
hdr.ObsvType.push_back(P2);
else if(strstr(temp, "C2"))
hdr.ObsvType.push_back(C2);
else if(strstr(temp, "D1"))
hdr.ObsvType.push_back(D1);
else if(strstr(temp, "D2"))
hdr.ObsvType.push_back(D2);
else if(strstr(temp, "S1"))
hdr.ObsvType.push_back(S1);
else if(strstr(temp, "S2"))
hdr.ObsvType.push_back(S2);
else if(strstr(temp, "L5"))
hdr.ObsvType.push_back(L5);
}
}
else
{
for(int i=1;i<=9;i++)
{
cpstr(temp,oneline,6*i,6*i+5,_MAX_LEN_TEMP);
if(strstr(temp, "C1"))
hdr.ObsvType.push_back(C1);
else if(strstr(temp, "L1"))
hdr.ObsvType.push_back(L1);
else if(strstr(temp, "L2"))
hdr.ObsvType.push_back(L2);
else if(strstr(temp, "P1"))
hdr.ObsvType.push_back(P1);
else if(strstr(temp, "P2"))
hdr.ObsvType.push_back(P2);
else if(strstr(temp, "C2"))
hdr.ObsvType.push_back(C2);
else if(strstr(temp, "D1"))
hdr.ObsvType.push_back(D1);
else if(strstr(temp, "D2"))
hdr.ObsvType.push_back(D2);
else if(strstr(temp, "S1"))
hdr.ObsvType.push_back(S1);
else if(strstr(temp, "S2"))
hdr.ObsvType.push_back(S2);
else if(strstr(temp, "L5"))
hdr.ObsvType.push_back(L5);
}
fgets(oneline,_MAX_LEN_TEMP,fp);
cpstr(temp,oneline,6,11,_MAX_LEN_TEMP);
if(strstr(temp, "C1"))
hdr.ObsvType.push_back(C1);
else if(strstr(temp, "L1"))
hdr.ObsvType.push_back(L1);
else if(strstr(temp, "L2"))
hdr.ObsvType.push_back(L2);
else if(strstr(temp, "P1"))
hdr.ObsvType.push_back(P1);
else if(strstr(temp, "P2"))
hdr.ObsvType.push_back(P2);
else if(strstr(temp, "C2"))
hdr.ObsvType.push_back(C2);
else if(strstr(temp, "D1"))
hdr.ObsvType.push_back(D1);
else if(strstr(temp, "D2"))
hdr.ObsvType.push_back(D2);
else if(strstr(temp, "S1"))
hdr.ObsvType.push_back(S1);
else if(strstr(temp, "S2"))
hdr.ObsvType.push_back(S2);
else if(strstr(temp, "L5"))
hdr.ObsvType.push_back(L5);
cpstr(temp,oneline,12,17,_MAX_LEN_TEMP);
if(strstr(temp, "C1"))
hdr.ObsvType.push_back(C1);
else if(strstr(temp, "L1"))
hdr.ObsvType.push_back(L1);
else if(strstr(temp, "L2"))
hdr.ObsvType.push_back(L2);
else if(strstr(temp, "P1"))
hdr.ObsvType.push_back(P1);
else if(strstr(temp, "P2"))
hdr.ObsvType.push_back(P2);
else if(strstr(temp, "C2"))
hdr.ObsvType.push_back(C2);
else if(strstr(temp, "D1"))
hdr.ObsvType.push_back(D1);
else if(strstr(temp, "D2"))
hdr.ObsvType.push_back(D2);
else if(strstr(temp, "S1"))
hdr.ObsvType.push_back(S1);
else if(strstr(temp, "S2"))
hdr.ObsvType.push_back(S2);
else if(strstr(temp, "L5"))
hdr.ObsvType.push_back(L5);
}
}
else if(strstr(oneline,"INTERVAL"))//观测值的(历元)间隔/s
{
cpstr(temp,oneline,0,9,_MAX_LEN_TEMP);
hdr.intval=atof(temp);
}
else if(strstr(oneline,"LEAP SECONDS"))//自1980年1月6号以来的跳秒数
{
cpstr(temp,oneline,0,5,_MAX_LEN_TEMP);
hdr.LeapSec=atoi(temp);
}
else if(strstr(oneline,"TIME OF FIRST OBS"))//数据文件中第一个观测记录的时刻(4数字年,月,日,时,分,秒)
{
cpstr(temp,oneline,0,5,_MAX_LEN_TEMP);
hdr.FrstObsv.year=atoi(temp);
cpstr(temp,oneline,6,11,_MAX_LEN_TEMP);
hdr.FrstObsv.month=atoi(temp);
cpstr(temp,oneline,12,17,_MAX_LEN_TEMP);
hdr.FrstObsv.day=atoi(temp);
cpstr(temp,oneline,18,23,_MAX_LEN_TEMP);
hdr.FrstObsv.hour=atoi(temp);
cpstr(temp,oneline,24,29,_MAX_LEN_TEMP);
hdr.FrstObsv.minute=atoi(temp);
cpstr(temp,oneline,30,42,_MAX_LEN_TEMP);
hdr.FrstObsv.second=atof(temp);
}
else if(strstr(oneline,"TIME OF LAST OBS"))//数据文件中最后一个观测记录的时刻(4数字年,月,日,时,分,秒)
{
cpstr(temp,oneline,0,5,_MAX_LEN_TEMP);
hdr.LastObsv.year=atoi(temp);
cpstr(temp,oneline,6,11,_MAX_LEN_TEMP);
hdr.LastObsv.month=atoi(temp);
cpstr(temp,oneline,12,17,_MAX_LEN_TEMP);
hdr.LastObsv.day=atoi(temp);
cpstr(temp,oneline,18,23,_MAX_LEN_TEMP);
hdr.LastObsv.hour=atoi(temp);
cpstr(temp,oneline,24,29,_MAX_LEN_TEMP);
hdr.LastObsv.minute=atoi(temp);
cpstr(temp,oneline,30,42,_MAX_LEN_TEMP);
hdr.LastObsv.second=atof(temp);
}
else if(strstr(oneline,"END OF HEADER"))
{
break;
}
}
return 1;
}
bool ReadOBSREC(FILE *fp,GPSREC &gpsrec,GMOHDR &hdr)
//每调用此函数一次,读取一个时刻的记录信息
{
if(!fp)
return 0;
else
{
//Reading RecHdr
char oneline[_MAX_LEN_ONELINE] = {'\0'};
char temp[_MAX_LEN_TEMP]={'\0'};
fgets(oneline,_MAX_LEN_ONELINE,fp);
cpstr(temp,oneline,1,2,_MAX_LEN_TEMP);
gpsrec.hdr.epoch.ye
评论1