57 const string IonexHeader::versionString =
"IONEX VERSION / TYPE";
58 const string IonexHeader::runByString =
"PGM / RUN BY / DATE";
59 const string IonexHeader::descriptionString =
"DESCRIPTION";
60 const string IonexHeader::commentString =
"COMMENT";
61 const string IonexHeader::firstTimeString =
"EPOCH OF FIRST MAP";
62 const string IonexHeader::lastTimeString =
"EPOCH OF LAST MAP";
63 const string IonexHeader::intervalString =
"INTERVAL";
64 const string IonexHeader::numMapsString =
"# OF MAPS IN FILE";
65 const string IonexHeader::mappingFunctionString =
"MAPPING FUNCTION";
66 const string IonexHeader::elevationString =
"ELEVATION CUTOFF";
67 const string IonexHeader::observablesUsedString =
"OBSERVABLES USED";
68 const string IonexHeader::numStationsString =
"# OF STATIONS";
69 const string IonexHeader::numSatsString =
"# OF SATELLITES";
70 const string IonexHeader::baseRadiusString =
"BASE RADIUS";
71 const string IonexHeader::mapDimensionString =
"MAP DIMENSION";
72 const string IonexHeader::hgtGridString =
"HGT1 / HGT2 / DHGT";
73 const string IonexHeader::latGridString =
"LAT1 / LAT2 / DLAT";
74 const string IonexHeader::lonGridString =
"LON1 / LON2 / DLON";
75 const string IonexHeader::exponentString =
"EXPONENT";
76 const string IonexHeader::startAuxDataString =
"START OF AUX DATA";
77 const string IonexHeader::endAuxDataString =
"END OF AUX DATA";
78 const string IonexHeader::endOfHeader =
"END OF HEADER";
80 const string IonexHeader::DCB::svsAuxDataString =
"PRN / BIAS / RMS";
81 const string IonexHeader::DCB::stationsAuxDataString =
82 "STATION / BIAS / RMS";
129 os <<
"-------------------------------- IONEX HEADER"
130 <<
"--------------------------------" << endl;
133 os <<
"Last epoch : " <<
lastEpoch << endl;
134 os <<
"Interval : " <<
interval << endl;
135 os <<
"Number of ionex maps : " <<
numMaps << endl;
137 os <<
"Elevation cut off : " <<
elevation << endl;
138 os <<
"Number of stations : " <<
numStations << endl;
139 os <<
"Number of satellites : " <<
numSVs << endl;
140 os <<
"Map dimensions : " <<
mapDims << endl;
142 os <<
"HGT1 / HGT2 / DHGT : " <<
hgt[0] <<
" / "
145 os <<
"LAT1 / LAT2 / DLAT : " <<
lat[0] <<
" / "
148 os <<
"LON1 / LON2 / DLON : " <<
lon[0] <<
" / "
151 os <<
"Valid object? : " <<
valid << endl;
153 os <<
"-------------------------------- END OF HEADER"
154 <<
"-------------------------------" << endl;
168 string label(line, 60, 20);
176 int prn =
asInt(line.substr(4,2));
177 double bias =
asDouble(line.substr(6,16));
178 double rms =
asDouble(line.substr(16,26));
196 FFStreamError e(std::string(
"Invalid system character \"")
197 + c + std::string(
"\""));
208 string name = line.substr(6,4);
213 string num = line.substr(11,15);
214 double bias =
asDouble(line.substr(26,10));
215 double rms =
asDouble(line.substr(36,10));
216 stamap[name] =
DCB(name, num, bias, rms);
221 string s =
strip(line.substr(0,60));
230 FFStreamError e(std::string(
"Unidentified IONEX::DCB label: "
245 string label(line, 60, 20);
261 string s = line.substr(0,60);
266 string s = line.substr(0,60);
347 FFStreamError e(
"Unidentified IONEX header record: " + label);
381 if (line.length() == 0)
387 if (line.length() < 60 || line.length() > 80)
389 FFStreamError e(
"Invalid line length");
400 catch (FFStreamError& e)
411 catch (FFStreamError& e)
422 FFStreamError e(
"Invalid IONEX version number " +
429 if (
interval !=
static_cast<int>(interval0))
431 FFStreamError e(
"Inconsistent time arguments.");
438 if ( (
hgt[0] !=
hgt[1]) || (
hgt[2] != 0.0) )
440 FFStreamError e(
"Error concerning map dimension.");
446 if ( (
hgt[0] ==
hgt[1]) || (
hgt[2] == 0.0) )
448 FFStreamError e(
"Error concerning map dimension.");
457 grdfac[0] =
lat[0]/
lat[2];
458 grdfac[1] =
lat[1]/
lat[2];
459 grdfac[2] =
lon[0]/
lon[2];
460 grdfac[3] =
lon[1]/
lon[2];
462 catch(std::exception& e)
467 for (
int i = 0; i < 4; i++)
470 const double xdif(
ABS(grdfac[i] -
static_cast<int>(grdfac[i])) );
474 FFStreamError e(
"Irregular Ionex data grid.");
494 err.addText(
"Make sure to set the version correctly.");
502 catch(FFStreamError& e)
506 catch(StringException& e)
525 line += string(12,
' ');
528 FFStreamError
err(
"This isn't a Ionex file: " +
536 strm << line << endl;
545 strm << line << endl;
551 vector<std::string>::size_type i = 0;
558 strm << line << endl;
566 line += string(24,
' ');
568 strm << line << endl;
574 line += string(24,
' ');
576 strm << line << endl;
582 line += string(54,
' ');
584 strm << line << endl;
590 line += string(54,
' ');
592 strm << line << endl;
597 line += string(2,
' ');
599 line += string(54,
' ');
601 strm << line << endl;
607 line += string(52,
' ');
609 strm << line << endl;
616 strm << line << endl;
624 line += string(54,
' ');
626 strm << line << endl;
635 line += string(54,
' ');
637 strm << line << endl;
644 line += string(52,
' ');
646 strm << line << endl;
652 line += string(54,
' ');
654 strm << line << endl;
659 line += string(2,
' ');
663 line += string(40,
' ');
665 strm << line << endl;
669 line += string(2,
' ');
673 line += string(40,
' ');
675 strm << line << endl;
679 line += string(2,
' ');
683 line += string(40,
' ');
685 strm << line << endl;
691 line += string(54,
' ');
693 strm << line << endl;
697 for( vector<std::string>::size_type i = 0;
703 strm << line << endl;
714 strm << line << endl;
717 for(
const auto& isv :
svsmap)
720 line += isv.second.toString();
721 line += string(34,
' ');
723 strm << line << endl;
727 for (
const auto& ista :
stamap)
732 strm << line << endl;
740 strm << line << endl;
747 line += string(60,
' ');
749 strm << line << endl;
769 sec =
asInt(line.substr(30,6));
799 : system(
'U'), prn(-1), bias(0), rms(0.0), isPRN(true)
805 DCB(
char s,
int p,
double b,
double r)
806 :
system(s), prn(p), bias(b), rms(r), isPRN(true)
812 DCB(
const std::string& s,
const std::string& n,
double b,
double r)
813 :
system(
'U'), prn(-1), bias(b), rms(r), isPRN(false), name(s),
825 line = string(3,
' ');
826 line += std::string(3,
'0');
845 line = string(6,
' ');