QReadOFile
一、参数初始化
MG_PPP可以读取RINEX2.0或RINEX3.0的数据,将有关头文件、观测数据等参数进行初始化,有一些参数的初始值被设置成了-1。
二、读取单历元数据。
2.1、版本号为2.X
2.1.1、头文件
包括:RINEX VERSION / TYPE、PGM / RUN BY / DATE、COMMENT、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的信息。
包含几个函数的运用:
-mid()提取指定子字符串;第一个参数是子字符串位置,第二个参数为字符串字符个数;注意C++中第一个位置是0。
-trimmed()返回值为去除了开头和结尾的空白字符串,空白指QChar::isSpace()返回值为true,比如’\t’,’\n’,’\v’,’\f’,’\r’和’ '。
-simplified()返回字符串开头和结尾除去空白的字符串,并且内部的空白字符也去掉,这里的空白字符和上面的一样。
.left()与.right()分别是正向取字符串和反向取字符串。
Qt::CaseInsensitive表示对大小写不敏感,Qt::CaseSensitive 表示对大小写敏感。
针对头文件没有时间信息的情况,MG_PPP在头文件读取结束后将第一个历元的时间信息作为文件的开始时间,用了两个函数.pos()和.seek(),用于定位文件游标的位置以及查找并回到指定位置。
2.1.2 观测值
详见观测数据结构说明
2.2、版本号为3.X
2.2.1、头文件
头文件在"SYS / # / OBS TYPES"字段上的处理有些不同
else if (tempLine.contains("SYS / # / OBS TYPES",Qt::CaseInsensitive))
{//Renix 3.0 added header file
if (RinexVersion < 3) continue;
obsVarNamesVer3 tempObsType;
tempObsType.SatType = tempLine.mid(0, 1);
tempObsType.obsNum3ver = tempLine.mid(3, 3).trimmed().toInt();
QString obstypeName = "";
int flag = 0, read_hang_num = 0, i = 0;
read_hang_num = (int)(tempObsType.obsNum3ver/13.01);// tempObsType.obsNum3ver if a multiple of 13 read one less line
for (i = 0; i < tempObsType.obsNum3ver;i++)
{
obstypeName = tempLine.mid(6 + flag * 4, 4).trimmed();
flag++;
tempObsType.obsNames3ver.append(obstypeName);
//Exceeding 13 parsing the next line
if (flag % 13 == 0 && read_hang_num > 0)
{
tempLine = m_readOFileClass.readLine();
flag = 0; read_hang_num--;
}
}
m_obsVarNamesVer3.append(tempObsType);//Save this system data
}
2.2.2、不同系统观测数据的观测频段信息
不同观测系统的卫星以不同的PRN编号区分,IGS规定如下:
1、卫星编号
GPS、GELILEO、BEIDOU以及IRNSS是按照PRN顺次排序的,GLONASS观测系统的卫星以槽号指定,SBAS系统的卫星PRN号已过百,则将其后PRN-100后的数值作为后两位编号,QZSS同理。自此卫星编号已确定
2、观测码
观测码有三个部分组成,“tna”,分别是观测值类型、频率以及跟踪模式。
MG_PPP用到的观测值类型是前两种,伪距C以及载波L,不涉及“D”和“S”。在观测码中凡是以C开头则表明是伪距观测值,以L开头则表明是载波观测值。列出几种不同观测系统所支持观测码的详细列表以及定义方式如下:
下面这调代码中包含对RINEX 3.XX中不同频率的操作,分别是单频观测值和双频组合观测值
void QReadOFile::ProcessCLPos(obsVarNamesVer3 epochSystem)
2.2.3 观测值
详见观测数据结构信息
单频
首先判断观测系统:GPS、GLONASS、BDS和GELILEO。虽然在MG_PPP的注释中除了G、E、C、R还提到了S,即SBAS观测系统,但在实际的数据读入部分并不涉及SBAS,MG_PPP会针对不同观测系统不同频段的名称进行存储,具体规则如下:
if(epochSystem.SatType.contains("G", Qt::CaseInsensitive))
{// GPS 1 2 5 frqence
frqenceStr[0] = "1"; frqenceStr[1] = "2"; frqenceStr[2] = "5";
prioLen = 8;
//缺少Y、M、D
prioArry[0] = "P"; prioArry[1] = "W"; prioArry[2] = "C";
prioArry[3] = "I"; prioArry[4] = "L"; prioArry[5] = "S";
prioArry[6] = "Q"; prioArry[7] = "X";
}
else if(epochSystem.SatType.contains("R", Qt::CaseInsensitive))
{// GLONASS 1、2、3
frqenceStr[0] = "1"; frqenceStr[1] = "2"; frqenceStr[2] = "3";
prioLen = 5;
//缺少A、B
prioArry[0] = "P"; prioArry[1] = "C"; prioArry[2] = "Q";
prioArry[3] = "X"; prioArry[4] = "I";
}
else if(epochSystem.SatType.contains("C", Qt::CaseInsensitive))
{// BDS 1 7 6 or 2,缺少5、8
// "2" -> "6" -> "7" is for BDS-III
frqenceStr[0] = "2"; frqenceStr[1] = "6"; frqenceStr[2] = "7"; frqenceStr[3] = "1";
prioLen = 3;
//缺少D、P、L、S、Z
prioArry[0] = "I"; prioArry[1] = "Q"; prioArry[2] = "X";
}
else if(epochSystem.SatType.contains("E", Qt::CaseInsensitive))
{// Galileo 1 5 7 8,缺少6
frqenceStr[0] = "1"; frqenceStr[1] = "5"; frqenceStr[2] = "7"; frqenceStr[3] = "8";
prioLen = 6;
//缺少I
prioArry[0] = "C"; prioArry[1] = "Q"; prioArry[2] = "A";
prioArry[3] = "B"; prioArry[4] = "X"; prioArry[5] = "Z";
}
双频组合观测值
通过定义QStringList wantList
分别将不同观测系统中双频组合存入ObsTypePos.C1Type
或ObsTypePos.L1Type
中。
由if(isInSystem(*(ObsTypePos.SatType.toLatin1().data())) && (ObsTypePos.C1Pos.length()*ObsTypePos.C2Pos.length() == 0))
判断某些观测系统是否只有单频观测。
三、调用结构
在QReadOFile.cpp
中,依次调用如下:
1、void QReadOFile::getMultEpochData(QVector< QVector< SatlitData > >&multEpochData,int epochNum)
2、void QReadOFile::getEpochData(QVector< SatlitData > &epochData) //读一个历元的数据
3、readEpochVer3(epochData); 或者 readEpochVer2(epochData);
4.1 void QReadOFile::getHeadInf() //读头文件信息
4.2 bool QReadOFile::getOneSatlitData(QString &dataString,SatlitData &oneSatlite) //读一个卫星的数据
4.3 void QReadOFile::getWantData_2(SatlitData &oneSatlit) //选择需要的观测值
4.3 void QReadOFile::getWantData_3(SatlitData &oneSatlit)
4.4 void QReadOFile::getFrequencyVer2(SatlitData &oneSatlite) //
4.4 void QReadOFile::getFrequencyVer3(SatlitData &oneSatlite)