📄 rinex.cpp
字号:
return true; } else { antennaDeltaN = 0.0; return false; }}bool RinexObsFile::setDefWaveLenFactorL1(unsigned short input){ if( input < 3 ) { defWaveLenFactorL1 = input; return true; } else { defWaveLenFactorL1 = 9999; return false; }}bool RinexObsFile::setDefWaveLenFactorL2(unsigned short input){ if( input < 3 ) { defWaveLenFactorL2 = input; return true; } else { defWaveLenFactorL2 = 9999; return false; }}bool RinexObsFile::setNumWaveLenPRN(unsigned short input){ if( input < MAXPRNID ) { numWaveLenPRN = input; return true; } else { numWaveLenPRN = 0; return false; }}bool RinexObsFile::setNumWaveLenRecords(unsigned short input){ if( input < MAXPRNID ) { numWaveLenRecords = input; return true; } else { numWaveLenRecords = 0; return false; }}bool RinexObsFile::setAllWaveLenRecordsElement(OneWaveLenRec input, int i){ allWaveLenRecords[i] = input; return true;}bool RinexObsFile::setNumObsTypes(unsigned short input){ if( input <= MAXOBSTYPES ) { numObsTypes = input; return true; } else { numObsTypes = 9999; return false; }}bool RinexObsFile::setObsTypeListElement(enum OBSTYPE input, int i){ obsTypeList[i] = input; return true;}bool RinexObsFile::setObsInterval(float input){ if( input > 0.0 && input <= 86400.0 ) { obsInterval = input; return true; } else { obsInterval = -9999; return false; }}bool RinexObsFile::setFirstObs(YMDHMS input){ DateTime Jan1_1980, Dec31_2079, inputDate; inputDate.SetYMDHMS(input); Jan1_1980.SetYMDHMS(1980,1,1,0,0,0.00000001); Dec31_2079.SetYMDHMS(2079,12,31,23,59,59.99999999); if( inputDate >= Jan1_1980 && inputDate <= Dec31_2079 ) { firstObs = input; return true; } else { inputDate.SetYMDHMS( 9999, 1, 1, 0, 0, 0.0 ); firstObs = inputDate.GetYMDHMS(); return false; }}bool RinexObsFile::setFirstObsTimeSystem(string input){ firstObsTimeSystem = input.substr(0,3); return true;}bool RinexObsFile::setLastObs(YMDHMS input){ DateTime Jan1_1980, Dec31_2079, inputDate; inputDate.SetYMDHMS(input); Jan1_1980.SetYMDHMS(1980,1,1,0,0,0.00000001); Dec31_2079.SetYMDHMS(2079,12,31,23,59,59.99999999); if( inputDate >= Jan1_1980 && inputDate <= Dec31_2079 ) { lastObs = input; return true; } else { inputDate.SetYMDHMS( 9999, 1, 1, 0, 0, 0.0 ); lastObs = inputDate.GetYMDHMS(); return false; }}bool RinexObsFile::setLastObsTimeSystem(string input){ lastObsTimeSystem = input.substr(0,3); return true;}bool RinexObsFile::setNumberLeapSec(unsigned short input){ numberLeapSec = input; return true;}bool RinexObsFile::setRcvrClockApplied(unsigned short input){ if( input == 0 || input == 1 ) { rcvrClockApplied = input; return true; } else { rcvrClockApplied = 9999; return true; }}bool RinexObsFile::setNumberOfSat(unsigned short input){ if( input <= MAXPRNID ) { numberOfSat = input; return true; } else { numberOfSat = 9999; return true; }}bool RinexObsFile::setSatObsTypeListElement(ObsCountForPRN input, int i){ satObsTypeList[i] = input; return true;}bool RinexObsFile::setNextSat(unsigned short input){ nextSat = input; return true;}void RinexObsFile::incrementNumberObsEpochs( unsigned int n ){ numberObsEpochs = numberObsEpochs + n; // n is usually one}void RinexObsFile::initializeData(){// Initializes the OBS private data with NULL values. For strings NULL// is an empty string. For numeric values the NULL is chosen as a value// that can be stored in the data type (short) but which is outside of the// allowed range for the data element. NULLs are typically all 9999s unsigned int i; unsigned int j; formatVersion = 0.0; rinexFileType = ' '; satSystem = ' '; rinexProgram = ""; createdByAgency = ""; dateFileCreated = ""; markerName = ""; markerNumber = ""; observerName = ""; observerAgency = ""; receiverNumber = ""; receiverType = ""; receiverFirmwareVersion = ""; antennaNumber = ""; antennaType = ""; approxX = 0.0; approxY = 0.0; approxZ = 0.0; antennaDeltaH = 0.0; antennaDeltaE = 0.0; antennaDeltaN = 0.0; defWaveLenFactorL1 = 9999; defWaveLenFactorL2 = 9999; numWaveLenPRN = 0; numWaveLenRecords = 0; numberLeapSec = 9999; rcvrClockApplied = 9999; for ( i = 0; i < MAXPRNID; i++ ) { allWaveLenRecords[i].L1Factor = 9999; allWaveLenRecords[i].L2Factor = 9999; allWaveLenRecords[i].numSatInRecord = 0; for( j = 0; j < 7; j++ ) allWaveLenRecords[i].satsInRecord[j] = ""; } numObsTypes = 9999; for ( i = 0; i < MAXOBSTYPES; i++ ) { obsTypeList[ i ] = NOOBS; } obsInterval = -9999.0; firstObs.year = 9999; firstObs.month = 1; firstObs.day = 1; firstObs.hour = 0; firstObs.min = 0; firstObs.sec = 0.0; firstObsTimeSystem = ""; lastObs.year = 9999; lastObs.month = 1; lastObs.day = 1; lastObs.hour = 0; lastObs.min = 0; lastObs.sec = 0.0; lastObsTimeSystem = ""; numberOfSat = 9999; for ( i = 0; i < MAXPRNID; i++ ) { satObsTypeList[ i ].satCode = ' '; satObsTypeList[ i ].satNum = 9999; for ( j = 0; j < MAXOBSTYPES; j++ ) { satObsTypeList[ i ].PRNObsCount[ j ] = 9999; } } for( i = 0; i < MAXOBSHEADERRECTYPES; i++) { headerRecs[i].numberPresent = 0; } headerRecs[ 0].recID = "RINEX VERSION / TYPE"; headerRecs[ 0].required = true; headerRecs[ 1].recID = "PGM / RUN BY / DATE"; headerRecs[ 1].required = true; headerRecs[ 2].recID = "COMMENT"; headerRecs[ 2].required = false; headerRecs[ 3].recID = "MARKER NAME"; headerRecs[ 3].required = true; headerRecs[ 4].recID = "MARKER NUMBER"; headerRecs[ 4].required = false; headerRecs[ 5].recID = "OBSERVER / AGENCY"; headerRecs[ 5].required = true; headerRecs[ 6].recID = "REC # / TYPE / VERS"; headerRecs[ 6].required = true; headerRecs[ 7].recID = "ANT # / TYPE"; headerRecs[ 7].required = true; headerRecs[ 8].recID = "APPROX POSITION XYZ"; headerRecs[ 8].required = true; headerRecs[ 9].recID = "ANTENNA: DELTA H/E/N"; headerRecs[ 9].required = true; headerRecs[10].recID = "WAVELENGTH FACT L1/2"; headerRecs[10].required = true; headerRecs[11].recID = "# / TYPES OF OBSERV"; headerRecs[11].required = true; headerRecs[12].recID = "INTERVAL"; headerRecs[12].required = false; headerRecs[13].recID = "TIME OF FIRST OBS"; headerRecs[13].required = true; headerRecs[14].recID = "TIME OF LAST OBS"; headerRecs[14].required = false; headerRecs[15].recID = "RCV CLOCK OFFS APPL"; headerRecs[15].required = false; headerRecs[16].recID = "LEAP SECONDS"; headerRecs[16].required = false; headerRecs[17].recID = "# OF SATELLITES"; headerRecs[17].required = false; headerRecs[18].recID = "PRN / # OF OBS"; headerRecs[18].required = false; headerRecs[19].recID = "END OF HEADER"; headerRecs[19].required = true; nextSat = 0;}unsigned short RinexObsFile::readHeader(){ unsigned short i; unsigned short headerRecordFlag; string inputRec; string recordReadIn; HeaderRecord headerRec; ostringstream sstemp; bool endOfHeaderFound = false; unsigned long numberRequiredErrors = 0; enum { VersionRec }; if( validFirstLine(recordReadIn) ) { headerRecs[ VersionRec ].numberPresent++; headerRec.SetHeaderRecord( recordReadIn ); rinexHeaderImage.appendHeaderRecord( recordReadIn ); } else { tempStream << "Error: First Line is incorrect in File: " << getPathFilename() << endl << recordReadIn << endl; appendToErrorMessages( tempStream.str() ); RequiredRecordMissingException excep( tempStream.str() ); throw excep; } // read all Header lines from line 2 until the end of header while( !endOfHeaderFound ) { if( !getline( inputStream, inputRec, '\n') ) { // Error reading a header line of the OBS File tempStream << "Error reading a header line of file:" << endl << getPathFilename() << endl; appendToErrorMessages( tempStream.str() ); RinexReadingException excep( tempStream.str() ); throw excep; } incrementNumberLinesRead(1); if( blankString(inputRec) ) { if( formatVersion < 2.0 ) { endOfHeaderFound = true; headerRec.SetHeaderRecord( inputRec ); rinexHeaderImage.appendHeaderRecord( headerRec ); break; // end the while loop } else { tempStream << "Warning! On line #" << getNumberLinesRead() << ":" << endl << inputRec << endl << " Blank header record found, skipping to next line. " << endl; appendToWarningMessages( tempStream.str() ); continue; // go to read the next record } } if( validHeaderRecord(inputRec) ) { headerRec.SetHeaderRecord( inputRec ); rinexHeaderImage.appendHeaderRecord( headerRec ); if( inputRec.find( "END OF HEADER" ) == 60 ) { endOfHeaderFound = true; break; } continue; // go to read the next record } if( validEventFlagRecord(inputRec) ) { tempStream << "Warning! On line #" << getNumberLinesRead() << ":" << endl << inputRec << endl << "EPOCH/SAT Flag Record found in Header, skipping to next line." << endl << "Check file for location of END OF HEADER record." << endl; appendToWarningMessages( tempStream.str() ); continue; // go to read the next record } tempStream << "Warning! On line #" << getNumberLinesRead() << ":" << endl << inputRec << endl << "Unknown Record Type found in Header, skipping to next line." << endl; appendToWarningMessages( tempStream.str() ); } // end of while loop over all header records// Check for the presence of all manditory header records. for ( i = 0; i < MAXOBSHEADERRECTYPES; i++ ) { if ( headerRecs[ i ].numberPresent == 0 && headerRecs[ i ].required ) { sstemp << " missing Header record: " << headerRecs[ i ].recID << endl; numberRequiredErrors++; } } if( numberRequiredErrors > 0 ) { tempStream << getPathFilename() << " has the following missing Header " << "records." << endl << sstemp.str() << endl; appendToErrorMessages( tempStream.str() ); RequiredRecordMissingException excep( tempStream.str() ); throw excep; } return(0);}bool RinexObsFile::validHeaderRecord(string inputRec){ unsigned short i; long tempL; double tempD; double distance; string temp; string warningString; unsigned short L1_fac, L2_fac, num_sat; enum { VersionRec, PgmRunByRec, CommentRec, MarkerNameRec, MarkerNumRec, ObserverRec, ReceiverRec, AntennaRec, ApproxPosRec, AntennaDeltaRec, WavelengthRec, ObsNumTypesRec, IntervalRec, FirstObsTimeRec, LastObsTimeRec, RcvClkApplRec, LeapSecRec, NumOfSatRec, PRNRec, EndHeaderRec }; if ( inputRec.find( "COMMENT" ) == 60 ) { // all comment records are stored in the headerImage linked-list headerRecs[ CommentRec ].numberPresent++; return true; } else if ( inputRec.find( "PGM / RUN BY / DATE" ) == 60 ) { headerRecs[ PgmRunByRec ].numberPresent++; rinexProgram = inputRec.substr( 0, 20 ); createdByAgency = inputRec.substr( 20, 20 ); dateFileCreated = inputRec.substr( 40, 20 ); return true; } else if ( inputRec.find( "MARKER NAME" ) == 60 ) { headerRecs[ MarkerNameRec ].numberPresent++; markerName = inputRec.substr( 0, 60 ); return true; } else if ( inputRec.find( "MARKER NUMBER" ) == 60 ) { headerRecs[ MarkerNumRec ].numberPresent++; markerNumber = inputRec.substr( 0, 20 ); return true; } else if ( inputRec.find( "OBSERVER / AGENCY" ) == 60 ) { headerRecs[ ObserverRec ].numberPresent++; observerName = inputRec.substr( 0, 20 ); observerAgency = inputRec.substr( 20, 40 ); return true; } else if ( inputRec.find( "REC # / TYPE / VERS" ) == 60 ) { headerRecs[ ReceiverRec ].numberPresent++; receiverNumber = inputRec.substr( 0, 20 ); receiverType = inputRec.substr( 20, 20 ); rece
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -