/// <summary> /// GNSS导航文件的读取 /// </summary> /// <param name="navFilePath"></param> /// <returns></returns> public MixedNavFile ReadGnssNavFlie() { MixedNavFile f = new MixedNavFile(); f.SetHeader(ParamNavFileReader.ReadHeader(RinexFileName)); //测试版本 if (f.Header.Version == 0) { using (StreamReader sr = new StreamReader(RinexFileName, UnicodeEncoding.UTF8)) { RinexUtil.SkipHeader(sr); } } using (StreamReader sr = new StreamReader(RinexFileName, UnicodeEncoding.UTF8)) { RinexUtil.SkipHeader(sr); if (f.Header.Version < 3.0) { while (sr.Peek() != -1) { EphemerisParam record = ParamNavFileReader.ReadRecordV2(sr, f.Header); f.Add(record); } } else if (f.Header.Version >= 3.0 && f.Header.Version < 4.0) { while (sr.Peek() != -1) { string line = sr.ReadLine(); if (string.IsNullOrWhiteSpace(line)) { continue; } SatClockBias recordHeader = ParamNavFileReader.ParseFirstLineV3(line, f.Header); //轨道参数 var satType = recordHeader.Prn.SatelliteType; if (EphemerisUtil.IsEphemerisParam(satType)) { var record = new EphemerisParam(recordHeader); ParamNavFileReader.ReadRecordBodyV3(sr, record); f.Add(record); } else { var record2 = new GlonassNavRecord(recordHeader); GlonassNaviFileReader.ParseFirstLineV3(line, record2); GlonassNaviFileReader.ReadRecordBodyV3(sr, record2); f.Add(record2); } } } } return(f); }
/// <summary> /// 读取GLONASS导航文件 /// </summary> /// <param name="navFilePath">路径</param> /// <returns></returns> public static GlonassNavFile ReadFileV2V3(string navFilePath) { GlonassNavFile f = new GlonassNavFile(); f.Header = ParamNavFileReader.ReadHeader(navFilePath); //测试版本 if (f.Header.Version == 0) { using (StreamReader sr = new StreamReader(navFilePath, UnicodeEncoding.UTF8)) { RinexUtil.SkipHeader(sr); try { GlonassNaviFileReader.ReadRecordV2(sr, f.Header); GlonassNaviFileReader.ReadRecordV2(sr, f.Header); // f.Header.Version = 2.0; } catch { f.Header.Version = 1.0; } } } using (StreamReader sr = new StreamReader(navFilePath, UnicodeEncoding.UTF8)) { RinexUtil.SkipHeader(sr); while (sr.Peek() != -1) { GlonassNavRecord record = null; if (f.Header.Version < 3) { record = GlonassNaviFileReader.ReadRecordV2(sr, f.Header); } else if (f.Header.Version >= 3) { record = GlonassNaviFileReader.ReadRecordV3(sr, f.Header); } else { throw new ArgumentException(" 导航文件版本 " + f.Header.Version); } f.Add(record); } } return(f); }
/// <summary> /// GNSS导航文件的读取 /// </summary> /// <returns></returns> public ParamNavFile ReadGnssNavFlie() { ParamNavFile f = new ParamNavFile(); f.Header = ReadHeader(RinexFileName); //测试版本 if (f.Header.Version == 0) { using (StreamReader sr = new StreamReader(RinexFileName, UnicodeEncoding.UTF8)) { RinexUtil.SkipHeader(sr); } } using (StreamReader sr = new StreamReader(RinexFileName, UnicodeEncoding.UTF8)) { RinexUtil.SkipHeader(sr); if (f.Header.Version < 3.0) { while (sr.Peek() != -1) { EphemerisParam record = ReadRecordV2(sr, f.Header); f.Add(record); } } else if (f.Header.Version >= 3.0 && f.Header.Version < 4.0) { while (sr.Peek() != -1) { SatClockBias recordHeader = null; string line = null; try { line = sr.ReadLine(); recordHeader = ParseFirstLineV3(line, f.Header); var record = new EphemerisParam(recordHeader); ReadRecordBodyV3(sr, record); f.Add(record); } catch (Exception ex) { log.Error("导航星历解析错误!将继续尝试 " + ex.Message + line + ", Path:" + RinexFileName); } } } } return(f); }
/// <summary> /// 重置 /// </summary> public override void Reset() { StreamReader.BaseStream.Position = 0; StreamReader.BaseStream.Seek(0, SeekOrigin.Begin); RinexUtil.SkipLines(StreamReader, Header.LineNumber); }
/// <summary> /// 读取RINEX文件的头文件。 /// </summary> /// <param name="rinexFileName">文件路径</param> /// <returns></returns> public static NavFileHeader ReadHeader(string RinexFileName) { NavFileHeader header = new NavFileHeader(); header.Name = Path.GetFileName(RinexFileName); using (StreamReader r = new StreamReader(RinexFileName, Encoding.UTF8)) { string line = null; string headerLabel = null; while ((line = r.ReadLine()) != null && headerLabel != RinexHeaderLabel.END_OF_HEADER) { //中文字符支持 int nonAscCount = StringUtil.GetNonAscCount(line.Substring(0, 60 > line.Length ? line.Length : 60)); headerLabel = line.Substring(60 - nonAscCount).TrimEnd();//header label 61-80 if (headerLabel.Contains(RinexHeaderLabel.END_OF_HEADER)) { break; } switch (headerLabel) { /** * +--------------------+------------------------------------------+------------+ | HEADER LABEL | DESCRIPTION | FORMAT | | (Columns 61-80) | | | +--------------------+------------------------------------------+------------+ |RINEX VERSION / TYPE| - Format version : 3.00 | F9.2,11X, | | | - File type: O for Observation Data | A1,19X, | | | - Satellite System: G: GPS | A1,19X | | | R: GLONASS | | | | E: Galileo | | | | S: SBAS payload | | | | M: Mixed | | +--------------------+------------------------------------------+------------+ * */ case RinexHeaderLabel.RINEX_VERSION_TYPE: header.Version = double.Parse(line.Substring(0, 9)); header.FileType = (RinexFileType)Enum.Parse(typeof(RinexFileType), line.Substring(20, 1)); if (line.Substring(40, 1) == " ") { header.SatelliteType = RinexUtil.GetSatelliteType(header.FileType); } else { header.SatelliteType = (SatelliteType)Enum.Parse(typeof(SatelliteType), line.Substring(40, 1)); } break; case RinexHeaderLabel.PGM_RUN_BY_DATE: header.CreationProgram = line.Substring(0, 20).TrimEnd(); header.CreationAgence = line.Substring(20, 20).Trim(); header.CreationDate = line.Substring(40, 20).TrimEnd(); break; case RinexHeaderLabel.COMMENT: if (header.Comments == null) { header.Comments = new List <string>(); } header.Comments.Add(line.Substring(0, 60 - nonAscCount).Trim()); break; case RinexHeaderLabel.RCV_CLOCK_OFFS_APPL: break; case RinexHeaderLabel.LEAP_SECONDS: header.LeapSeconds = int.Parse(line.Substring(0, 6)); break; case RinexHeaderLabel.NUM_OF_SATELLITES: break; case RinexHeaderLabel.PRN_NUM_OF_OBS: break; //2X,4D12.4 case RinexHeaderLabel.ION_ALPHA: line = line.Replace('D', 'E'); header.IonParam.AlfaA0 = double.Parse(line.Substring(2, 12)); header.IonParam.AlfaA1 = double.Parse(line.Substring(14, 12)); header.IonParam.AlfaA2 = double.Parse(line.Substring(26, 12)); header.IonParam.AlfaA3 = double.Parse(line.Substring(38, 12)); break; case RinexHeaderLabel.ION_BETA: line = line.Replace('D', 'E'); header.IonParam.BetaB0 = double.Parse(line.Substring(2, 12)); header.IonParam.BetaB1 = double.Parse(line.Substring(14, 12)); header.IonParam.BetaB2 = double.Parse(line.Substring(26, 12)); header.IonParam.BetaB3 = double.Parse(line.Substring(38, 12)); break; //3X,2D19.12,2I9 case RinexHeaderLabel.DELTA_UTC_A0_A1_T_W: line = line.Replace('D', 'E'); header.UtcDeltaA0 = double.Parse(line.Substring(3, 19)); header.UtcDeltaA1 = double.Parse(line.Substring(22, 19)); header.UtcDeltaT = double.Parse(line.Substring(41, 9)); header.UtcDeltaW = double.Parse(line.Substring(50, 9)); break; case RinexHeaderLabel.PRN_LIST: if (header.PrnList == null) { header.PrnList = new List <SatelliteNumber>(); } string[] prnStrs = line.Substring(0, 60).Trim().Split(new String[] { " " }, StringSplitOptions.RemoveEmptyEntries); foreach (string prn in prnStrs) { header.PrnList.Add(SatelliteNumber.Parse(prn)); } break; //rinex 3.0 nav case RinexHeaderLabel.TIME_SYSTEM_CORR: break; //rinex 3.0 nav case RinexHeaderLabel.IONOSPHERIC_CORR: break; case RinexHeaderLabel.END_OF_HEADER: default: break; } } } return(header); }