source: ntrip/trunk/BNC/src/rinex/rnxobsfile.h@ 6719

Last change on this file since 6719 was 6719, checked in by stuerze, 9 years ago

Some mandatory RINEX v3 header lines in observation files are added. That's of interest especially for merging RINEX v3 files. Within RINEX files, which are generated from RTCM streams, these lines are empty because of missing information in RTCM. But as soon this information is available from station logs the respective lines will be filled as well.

File size: 6.9 KB
Line 
1// Part of BNC, a utility for retrieving decoding and
2// converting GNSS data streams from NTRIP broadcasters.
3//
4// Copyright (C) 2007
5// German Federal Agency for Cartography and Geodesy (BKG)
6// http://www.bkg.bund.de
7// Czech Technical University Prague, Department of Geodesy
8// http://www.fsv.cvut.cz
9//
10// Email: euref-ip@bkg.bund.de
11//
12// This program is free software; you can redistribute it and/or
13// modify it under the terms of the GNU General Public License
14// as published by the Free Software Foundation, version 2.
15//
16// This program is distributed in the hope that it will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19// GNU General Public License for more details.
20//
21// You should have received a copy of the GNU General Public License
22// along with this program; if not, write to the Free Software
23// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24
25#ifndef RNXOBSFILE_H
26#define RNXOBSFILE_H
27
28#include <QtCore>
29
30#include <fstream>
31#include <vector>
32#include <map>
33
34#include "newmat.h"
35#include "bncconst.h"
36#include "bnctime.h"
37#include "t_prn.h"
38#include "satObs.h"
39
40class t_rnxObsHeader {
41
42 friend class t_rnxObsFile;
43
44 public:
45 static const double defaultRnxObsVersion2 = 2.11;
46 static const double defaultRnxObsVersion3 = 3.02;
47 static const QString defaultSystems;
48
49 t_rnxObsHeader();
50 ~t_rnxObsHeader();
51
52 double version() const {return _version;}
53 t_irc read(QTextStream* stream, int maxLines = 0);
54 void setDefault(const QString& markerName, int version);
55 void set(const t_rnxObsHeader& header, int version, const QStringList* useObsTypes = 0);
56 int numSys() const;
57 char system(int iSys) const;
58 int nTypes(char sys) const;
59 QString obsType(char sys, int index, double version = 0.0) const;
60 void write(QTextStream* stream, const QMap<QString, QString>* txtMap = 0) const;
61 bncTime startTime() const {return _startTime;}
62 void setStartTime(const bncTime& startTime) {_startTime = startTime;}
63
64 private:
65 QStringList obsTypesStrings() const;
66 QString _usedSystems;
67 double _version;
68 double _interval;
69 QString _antennaNumber;
70 QString _antennaName;
71 QString _markerName;
72 QString _markerNumber;
73 QString _observer;
74 QString _agency;
75 QString _receiverNumber;
76 QString _receiverType;
77 QString _receiverVersion;
78 QStringList _comments;
79 ColumnVector _antNEU;
80 ColumnVector _antXYZ;
81 ColumnVector _antBSG;
82 ColumnVector _xyz;
83 QMap<char, QStringList> _obsTypes;
84 QMap<t_prn, int> _gloSlots;
85 QMap<QString, double> _gloPhaseBiases;
86 int _wlFactorsL1[t_prn::MAXPRN_GPS+1];
87 int _wlFactorsL2[t_prn::MAXPRN_GPS+1];
88 bncTime _startTime;
89 QMultiHash<char, QPair<QString, double> > _phaseShifts;
90};
91
92class t_rnxObsFile {
93 public:
94
95 static bool earlierStartTime(const t_rnxObsFile* file1, const t_rnxObsFile* file2) {
96 return file1->startTime() < file2->startTime();
97 }
98
99 class t_rnxObs {
100 public:
101 t_rnxObs() {
102 value = 0.0; lli = 0; snr = 0;
103 }
104 double value;
105 int lli;
106 int snr;
107 };
108
109 class t_rnxSat {
110 public:
111 t_prn prn;
112 QMap<QString, t_rnxObs> obs;
113 };
114
115 class t_rnxEpo {
116 public:
117 t_rnxEpo() {clear();}
118 void clear() {
119 tt.reset();
120 rnxSat.clear();
121 }
122 bncTime tt;
123 std::vector<t_rnxSat> rnxSat;
124 };
125
126 enum e_inpOut {input, output};
127
128 t_rnxObsFile(const QString& fileName, e_inpOut inpOut);
129 ~t_rnxObsFile();
130
131 double version() const {return _header._version;}
132 double interval() const {return _header._interval;}
133 int numSys() const {return _header.numSys();}
134 char system(int iSys) const {return _header.system(iSys);}
135 int nTypes(char sys) const {return _header.nTypes(sys);}
136 const QString& fileName() const {return _fileName;}
137 QString obsType(char sys, int index, double version = 0.0) const {
138 return _header.obsType(sys, index, version);
139 }
140 const QString& antennaName() const {return _header._antennaName;}
141 const QString& markerName() const {return _header._markerName;}
142 const QString& markerNumber() const {return _header._markerNumber;}
143 const QString& receiverType() const {return _header._receiverType;}
144
145 void setInterval(double interval) {_header._interval = interval;}
146 void setAntennaName(const QString& antennaName) {_header._antennaName = antennaName;}
147 void setMarkerName(const QString& markerName) {_header._markerName = markerName;}
148 void setReceiverType(const QString& receiverType) {_header._receiverType = receiverType;}
149
150 const ColumnVector& xyz() const {return _header._xyz;}
151 const ColumnVector& antNEU() const {return _header._antNEU;}
152 const ColumnVector& antXYZ() const {return _header._antXYZ;}
153 const ColumnVector& antBSG() const {return _header._antBSG;}
154
155 const bncTime& startTime() const {return _header._startTime;}
156 void setStartTime(const bncTime& startTime) {_header._startTime = startTime;}
157
158 t_rnxEpo* nextEpoch();
159
160 int wlFactorL1(unsigned iPrn) {
161 return iPrn <= t_prn::MAXPRN_GPS ? _header._wlFactorsL1[iPrn] : 1;
162 }
163 int wlFactorL2(unsigned iPrn) {
164 return iPrn <= t_prn::MAXPRN_GPS ? _header._wlFactorsL2[iPrn] : 1;
165 }
166
167 const t_rnxObsHeader& header() const {return _header;}
168
169 void setHeader(const t_rnxObsHeader& header, int version, const QStringList* useObsTypes = 0) {
170 _header.set(header, version, useObsTypes);
171 }
172
173 void writeEpoch(const t_rnxEpo* epo);
174
175 QTextStream* stream() {return _stream;}
176
177 static void setObsFromRnx(const t_rnxObsFile* rnxObsFile, const t_rnxObsFile::t_rnxEpo* epo,
178 const t_rnxObsFile::t_rnxSat& rnxSat, t_satObs& obs);
179
180 static QString type2to3(char sys, const QString& typeV2);
181 static QString type3to2(char sys, const QString& typeV3);
182
183 static void writeEpoch(QTextStream* stream, const t_rnxObsHeader& header, const t_rnxEpo* epo) {
184 if (header.version() >= 3.0) {
185 writeEpochV3(stream, header, epo);
186 }
187 else {
188 writeEpochV2(stream, header, epo);
189 }
190 }
191
192 private:
193 static void writeEpochV2(QTextStream* stream, const t_rnxObsHeader& header, const t_rnxEpo* epo);
194 static void writeEpochV3(QTextStream* stream, const t_rnxObsHeader& header, const t_rnxEpo* epo);
195 static QString signalPriorities(char sys);
196 t_rnxObsFile() {};
197 void openRead(const QString& fileName);
198 void openWrite(const QString& fileName);
199 void close();
200 t_rnxEpo* nextEpochV2();
201 t_rnxEpo* nextEpochV3();
202 void handleEpochFlag(int flag, const QString& line, bool& headerReRead);
203
204 e_inpOut _inpOut;
205 QFile* _file;
206 QString _fileName;
207 QTextStream* _stream;
208 t_rnxObsHeader _header;
209 t_rnxEpo _currEpo;
210 bool _flgPowerFail;
211};
212
213#endif
Note: See TracBrowser for help on using the repository browser.