Changeset 10945 in ntrip


Ignore:
Timestamp:
Jun 24, 2026, 12:43:35 PM (26 hours ago)
Author:
stuerze
Message:

Added a Minimum Elevation parameter to BNC's RINEX Editing & QC feature

Location:
trunk/BNC
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/CHANGELOG.md

    r10942 r10945  
    33- ADDED: PPP-AR Algorithm description is now part of BNCs help contents
    44- ADDED: L1C/B (RINEX code: '1E') in QZSS Signal ID Mapping
     5- ADDED: Minimum Elevation parameter to BNC's RINEX Editing & QC feature [(#195)](https://software.rtcm-ntrip.org/ticket/195)
    56- FIXED: BNC is now able to work with com ports with higher numbers, e.g. COM11 or COM17  [(#205)](https://software.rtcm-ntrip.org/ticket/205)
    67- FIXED: Handling of ionospheric constraints [(#220)](https://software.rtcm-ntrip.org/ticket/220)
  • trunk/BNC/src/bnchelp.html

    r10944 r10945  
    128128&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.6.2 <a href="#reqcinp">Input Files</a><br>
    129129&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.6.3 <a href="#reqcout">Output Files</a><br>
    130 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.6.4 <a href="#reqclog">Logfiles</a><br>
    131 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.6.5 <a href="#reqcplots">Plots for Signals</a><br>
    132 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.6.6 <a href="#reqcdir">Directory for Plots</a><br>
    133 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.6.7 <a href="#reqcedit">Set Edit Options</a><br>
    134 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.6.8 <a href="#reqccommand">Command Line, No Window</a><br>
     130&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.6.4 <a href="#reqcminele">Minimum Elevation</a><br>
     131&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.6.5 <a href="#reqclog">Logfiles</a><br>
     132&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.6.6 <a href="#reqcplots">Plots for Signals</a><br>
     133&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.6.7 <a href="#reqcdir">Directory for Plots</a><br>
     134&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.6.8 <a href="#reqcedit">Set Edit Options</a><br>
     135&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.6.9 <a href="#reqccommand">Command Line, No Window</a><br>
    135136&nbsp; &nbsp; &nbsp; 2.7 <a href="#sp3comp"><b>SP3 Comparison</b></a><br>
    136137&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.7.1 <a href="#sp3input">Input SP3 Files</a><br>
     
    318319  <tr><td>7</td><td>BNC's 'Network' panel configured to ignore eventually occurring SSL error messages</td><td>2.2.2</td></tr>
    319320  <tr><td>8</td><td>BNC translating incoming RTCM Version 3 Observation streams to 15 min RINEX Version 4 Observation files</td><td>2.4</td></tr>
    320   <tr><td>9</td><td>Example for creating RINEX quality check analysis graphics output with BNC</td><td>2.6.5</td></tr>
    321   <tr><td>10</td><td>Example for satellite availability, elevation and PDOP plots as a result of a RINEX quality check analysis with BNC</td><td>2.6.5</td></tr>
    322   <tr><td>11</td><td>Sky plot examples for multipath, part of RINEX quality check analysis with BNC</td><td>2.6.5</td></tr>
    323   <tr><td>12</td><td>Sky plot examples for signal-to-noise ratio, part of RINEX quality check analysis with BNC</td><td>2.6.5</td></tr>
    324   <tr><td>13</td><td>Example for BNC's 'RINEX Editing Options' window</td><td>2.6.7</td></tr>
    325   <tr><td>14</td><td>Example for RINEX file concatenation with BNC</td><td>2.6.7</td></tr>
     321  <tr><td>9</td><td>Example for creating RINEX quality check analysis graphics output with BNC</td><td>2.6.6</td></tr>
     322  <tr><td>10</td><td>Example for satellite availability, elevation and PDOP plots as a result of a RINEX quality check analysis with BNC</td><td>2.6.6</td></tr>
     323  <tr><td>11</td><td>Sky plot examples for multipath, part of RINEX quality check analysis with BNC</td><td>2.6.6</td></tr>
     324  <tr><td>12</td><td>Sky plot examples for signal-to-noise ratio, part of RINEX quality check analysis with BNC</td><td>2.6.6</td></tr>
     325  <tr><td>13</td><td>Example for BNC's 'RINEX Editing Options' window</td><td>2.6.8</td></tr>
     326  <tr><td>14</td><td>Example for RINEX file concatenation with BNC</td><td>2.6.8</td></tr>
    326327  <tr><td>15</td><td>Example for comparing two SP3 files with satellite orbit and clock data using BNC</td><td>2.7</td></tr>
    327328  <tr><td>16</td><td>Graphical results from an example comparison of two SP3 files with satellite orbit and clock data using BNC</td><td>2.7.3</td></tr>
     
    19261927</p>
    19271928
    1928 <p><h4 id="reqclog">2.6.4 Logfile - optional</h4></p>
     1929<p><h4 id="reqcminele">2.6.4 Minimum Elevation - optional</h4></p>
     1930<p>
     1931Select a minimum for satellite elevation angles. Observations from a satellite not reaching or exceeding this minimum
     1932elevation will be excluded, no matter whether 'Action' is set to 'Edit/Concatenate' or 'Analyze'. Determining a satellite's
     1933elevation requires specifying a RINEX Navigation input file, see section 'Input Files'.
     1934</p>
     1935<p>
     1936Default is '0 deg', meaning that no elevation mask is applied and all observations are used regardless of the involved satellite's elevation angle.
     1937</p>
     1938
     1939<p><h4 id="reqclog">2.6.5 Logfile - optional</h4></p>
    19291940<p>
    19301941Specify the name of a logfile to save information on RINEX file Editing/Concatenation or Analysis. Default is an empty option field,
     
    22542265</p>
    22552266
    2256 <p><h4 id="reqcplots">2.6.5 Plots for Signals - mandatory if 'Action' is set to 'Analyze'</h4></p>
     2267<p><h4 id="reqcplots">2.6.6 Plots for Signals - mandatory if 'Action' is set to 'Analyze'</h4></p>
    22572268<p>
    22582269BNC can produce plots for multipath, signal-to-noise ratio, satellite availability, satellite elevation, and PDOP values.
     
    22922303<p>Figure 12: Sky plot examples for signal-to-noise ratio, part of RINEX quality check analysis with BNC</p>
    22932304
    2294 <p><h4 id="reqcdir">2.6.6 Directory for Plots - optional if 'Action' is set to 'Analyze'</h4></p>
     2305<p><h4 id="reqcdir">2.6.7 Directory for Plots - optional if 'Action' is set to 'Analyze'</h4></p>
    22952306<p>
    22962307If 'Analyze' is selected, specifying the path to a directory where plot files will be saved is optional.
     
    22992310</p>
    23002311
    2301 <p><h4 id="reqcedit">2.6.7 Set Edit Options - mandatory if 'Action' is set to 'Edit/Concatenate'</h4></p>
     2312<p><h4 id="reqcedit">2.6.8 Set Edit Options - mandatory if 'Action' is set to 'Edit/Concatenate'</h4></p>
    23022313<p>
    23032314Once the 'Edit/Concatenate' action is selected, you have to 'Set Edit Options'.
     
    23532364<p>Figure 14: Example for RINEX file concatenation with BNC</p>
    23542365
    2355 <p><h4 id="reqccommand">2.6.8 Command Line, No Window - optional</h4></p>
     2366<p><h4 id="reqccommand">2.6.9 Command Line, No Window - optional</h4></p>
    23562367<p>
    23572368BNC applies options from the configuration file but allows updating every one of them on the command line
     
    24312442<tr><td>reqcOutObsFile</td><td></td><td>RINEX Observation output file</td></tr>
    24322443<tr><td>reqcOutNavFile</td><td></td><td>RINEX Navigation output file</td></tr>
     2444<tr><td>reqcMinEle</td><td></td><td>Minimum Elevation</td></tr>
    24332445<tr><td>reqcOutLogFile</td><td></td><td>Logfile</td></tr>
    24342446<tr><td>reqcLogSummaryOnly</td><td></td><td>Summary of Logfile</td></tr>
     
    67066718   reqcOutObsFile        {Output observations file, full path [character string]}
    67076719   reqcOutNavFile        {Output navigation file, full path [character string]}
     6720   reqcMinEle            {Minimum satellite elevation in degrees [integer number: 0-90]}
    67086721   reqcOutLogFile        {Output logfile, full path [character string]}
    67096722   reqcLogSummaryOnly    {Output only summary of logfile [integer number: 0=no,2=yes]}
  • trunk/BNC/src/bncmain.cpp

    r10942 r10945  
    166166        "   reqcOutObsFile        {Output observations file, full path [character string]}\n"
    167167        "   reqcOutNavFile        {Output navigation file, full path [character string]}\n"
     168        "   reqcMinEle            {Minimum satellite elevation in degrees [integer number: 0-90]}\n"
    168169        "   reqcOutLogFile        {Output logfile, full path [character string]}\n"
    169170        "   reqcLogSummaryOnly    {Output only summary of logfile [integer number: 0=no,2=yes]}\n"
  • trunk/BNC/src/bncwindow.cpp

    r10942 r10945  
    12661266  _reqcLogSummaryOnly->setCheckState(Qt::CheckState(settings.value("reqcLogSummaryOnly").toInt()));
    12671267
     1268  _reqcMinEle = new QSpinBox();
     1269  _reqcMinEle->setMinimum(0);
     1270  _reqcMinEle->setMaximum(90);
     1271  _reqcMinEle->setSingleStep(1);
     1272  _reqcMinEle->setSuffix(" deg");
     1273  _reqcMinEle->setValue(settings.value("reqcMinEle").toInt());
     1274
    12681275  ir = 0;
    12691276  reqcLayout->addWidget(new QLabel("RINEX file editing, concatenation and quality check.<br>"), ir, 0, 1, 8);
     
    12931300  reqcLayout->addWidget(new QLabel("  Nav"), ir, 4);
    12941301  ++ir;
     1302  reqcLayout->addWidget(new QLabel("Minimum Elevation"), ir, 0);
     1303  reqcLayout->addWidget(_reqcMinEle, ir, 1);
     1304  ++ir;
    12951305  reqcLayout->addWidget(new QLabel("Logfile"), ir, 0);
    12961306  reqcLayout->addWidget(_reqcOutLogLineEdit, ir, 1);
     
    15431553  _reqcOutNavLineEdit->setWhatsThis(tr("<p>Specify the full path to a RINEX Navigation output file.</p><p>Default is an empty option field, meaning that no RINEX Navigation output file will be produced. <i>[key: reqcOutNavFile]</i></p>"));
    15441554  _reqcOutLogLineEdit->setWhatsThis(tr("<p>Specify the full path to a logfile.</p><p>Default is an empty option field, meaning that no 'RINEX Editing & QC' logfile will be produced. <i>[key: reqcOutLogFile]</i></p>"));
     1555  _reqcMinEle->setWhatsThis(tr("<p>Select a Minimum satellite Elevation.</p><p>BNC will ignore an observation if the associated satellite Elevation does not reach or exceed this minimum. This requires a RINEX Navigation input file to compute satellite elevations.</p><p>Default is '0 deg' meaning that no elevation mask is applied. <i>[key: reqcMinEle]</i></p>"));
    15451556  _reqcLogSummaryOnly->setWhatsThis(tr("<p>By default BNC produces a detailed 'Logfile' providing all information resulting from editing or analyzing RINEX data. If that is too much information, you can limit the logfile content to a short summary.</p><p>Tick 'Summary only' to suppress full logfile output and instead produce a logfile containing only summary information. <i>[key: reqcLogSummaryOnly]</i></p>"));
    15461557  _reqcPlotDirLineEdit->setWhatsThis(tr("<p>Specify a directory for saving plots in PNG format.</p><p>Default is an empty option field, meaning that plots will not be saved on disk. <i>[key: reqcPlotDir]</i></p>"));
     
    18931904  delete _reqcSkyPlotSignals;
    18941905  delete _reqcLogSummaryOnly;
     1906  delete _reqcMinEle;
    18951907  delete _reqcEditOptionButton;
    18961908  delete _sp3CompFileChooser;
     
    23922404  settings.setValue("reqcSkyPlotSignals", _reqcSkyPlotSignals->text());
    23932405  settings.setValue("reqcLogSummaryOnly", _reqcLogSummaryOnly->checkState());
     2406  settings.setValue("reqcMinEle", _reqcMinEle->value());
    23942407  // SP3 Comparison
    23952408  settings.setValue("sp3CompFile", _sp3CompFileChooser->fileName());
     
    30153028    enableWidget(enable, _reqcNavFileChooser);
    30163029    enableWidget(enable, _reqcOutLogLineEdit);
     3030    enableWidget(enable, _reqcMinEle);
    30173031    enableWidget(enable && enable10, _reqcEditOptionButton);
    30183032    enableWidget(enable && enable10, _reqcOutObsLineEdit);
  • trunk/BNC/src/bncwindow.h

    r10766 r10945  
    164164    QLineEdit* _reqcSkyPlotSignals;
    165165    QCheckBox* _reqcLogSummaryOnly;
     166    QSpinBox*  _reqcMinEle;
    166167
    167168    qtFileChooser* _sp3CompFileChooser;
  • trunk/BNC/src/rinex/reqcanalyze.cpp

    r10630 r10945  
    6868  _obsFileNames    = settings.value("reqcObsFile").toString().split(",", Qt::SkipEmptyParts);
    6969  _navFileNames    = settings.value("reqcNavFile").toString().split(",", Qt::SkipEmptyParts);
     70  _minEle          = settings.value("reqcMinEle").toDouble();
    7071  _reqcPlotSignals = settings.value("reqcSkyPlotSignals").toString();
    7172  _defaultSignalTypes << "G:1&2&5" << "R:1&2&3" << "J:1&2" << "E:1&5" << "S:1&5" << "C:2&6" << "I:5&9";
     
    209210        t_qcSat& qcSat = qcEpo._qcSat[satObs._prn];
    210211        setQcObs(qcEpo._epoTime, xyzSta, satObs, lastObsTime, qcSat);
     212        if (qcSat._eleSet && qcSat._eleDeg < _minEle) {
     213          qcEpo._qcSat.remove(satObs._prn);
     214          continue;
     215        }
    211216        updateQcSat(qcSat, _qcFile._qcSatSum[satObs._prn]);
    212217      }
     
    986991          double rho, eleSat, azSat;
    987992          topos(xyzSta(1), xyzSta(2), xyzSta(3), xc(1), xc(2), xc(3), rho, eleSat, azSat);
    988           if (round(eleSat * 180.0/M_PI) >= 0.0) {
     993          if (round(eleSat * 180.0/M_PI) >= _minEle) {
    989994            numExpObs++;
    990995          }
  • trunk/BNC/src/rinex/reqcanalyze.h

    r10937 r10945  
    212212  QVector<t_rnxObsFile*>     _rnxObsFiles;
    213213  QStringList                _navFileNames;
     214  double                     _minEle;
    214215  QString                    _reqcPlotSignals;
    215216  QMap<char, QVector<char> > _signalTypes;
  • trunk/BNC/src/rinex/reqcedit.cpp

    r10630 r10945  
    7373  }
    7474  _samplingRate   = settings.value("reqcSampling").toString().split("sec").first().toDouble();
     75  _minEle         = settings.value("reqcMinEle").toDouble();
    7576  _begTime        = bncTime(settings.value("reqcStartDateTime").toString().toLatin1().data());
    7677  _endTime        = bncTime(settings.value("reqcEndDateTime").toString().toLatin1().data());
     
    223224  t_reqcEdit::initRnxObsFiles(_obsFileNames, _rnxObsFiles, _logStream);
    224225
     226  // Read Ephemerides (needed to apply the elevation mask)
     227  // ------------------------------------------------------
     228  if (_minEle > 0.0 && _ephs.isEmpty()) {
     229    t_reqcEdit::readEphemerides(_navFileNames, _ephs, _logStream, _checkEph);
     230  }
     231
    225232  // Initialize output observation file
    226233  // ----------------------------------
     
    361368        if (sec % (int(_samplingRate)*10) == 0) {
    362369          applyLLI(obsFile, epo);
     370          if (_minEle > 0.0) {
     371            applyElevationMask(obsFile, epo);
     372          }
    363373          outObsFile.writeEpoch(epo);
    364374        }
     
    518528
    519529  _lli.clear();
     530}
     531
     532// Remove satellites below the minimum elevation angle
     533////////////////////////////////////////////////////////////////////////////
     534void t_reqcEdit::applyElevationMask(const t_rnxObsFile* obsFile,
     535                                    t_rnxObsFile::t_rnxEpo* epo) {
     536
     537  const ColumnVector& xyzSta = obsFile->xyz();
     538  if (xyzSta.size() != 3 || (xyzSta(1) == 0.0 && xyzSta(2) == 0.0 && xyzSta(3) == 0.0)) {
     539    return;
     540  }
     541
     542  std::vector<t_rnxObsFile::t_rnxSat> keptSats;
     543  for (unsigned iSat = 0; iSat < epo->rnxSat.size(); iSat++) {
     544    const t_rnxObsFile::t_rnxSat& rnxSat = epo->rnxSat[iSat];
     545
     546    t_eph* eph = 0;
     547    for (int ie = 0; ie < _ephs.size(); ie++) {
     548      if (_ephs[ie]->prn() == rnxSat.prn) {
     549        eph = _ephs[ie];
     550        break;
     551      }
     552    }
     553    if (eph) {
     554      ColumnVector xc(6);
     555      ColumnVector vv(3);
     556      if (eph->getCrd(epo->tt, xc, vv, false) == success) {
     557        double rho, eleSat, azSat;
     558        topos(xyzSta(1), xyzSta(2), xyzSta(3), xc(1), xc(2), xc(3), rho, eleSat, azSat);
     559        if (eleSat * 180.0/M_PI < _minEle) {
     560          continue;
     561        }
     562      }
     563    }
     564    keptSats.push_back(rnxSat);
     565  }
     566  epo->rnxSat = keptSats;
    520567}
    521568
  • trunk/BNC/src/rinex/reqcedit.h

    r10630 r10945  
    6363  void rememberLLI(const t_rnxObsFile* obsFile, const t_rnxObsFile::t_rnxEpo* epo);
    6464  void applyLLI(const t_rnxObsFile* obsFile, t_rnxObsFile::t_rnxEpo* epo);
     65  void applyElevationMask(const t_rnxObsFile* obsFile, t_rnxObsFile::t_rnxEpo* epo);
    6566  void addRnxConversionDetails(const t_rnxObsFile* obsFile, QMap<QString, QString>& txtMap);
    6667
     
    7677  double                 _rnxVersion;
    7778  double                 _samplingRate;
     79  double                 _minEle;
    7880  bncTime                _begTime;
    7981  bncTime                _endTime;
Note: See TracChangeset for help on using the changeset viewer.