MG_PPP(四)

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.C1TypeObsTypePos.L1Type中。
if(isInSystem(*(ObsTypePos.SatType.toLatin1().data())) && (ObsTypePos.C1Pos.length()*ObsTypePos.C2Pos.length() == 0))判断某些观测系统是否只有单频观测。


三、调用结构

QReadOFile.cpp中,依次调用如下:

 1void QReadOFile::getMultEpochData(QVector< QVector< SatlitData > >&multEpochData,int epochNum)
2void QReadOFile::getEpochData(QVector< SatlitData > &epochData)  //读一个历元的数据
3readEpochVer3(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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值