/// <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); }
protected override void dataProvider_EphemerisInfoReceived(EphemerisParam obj) { if (obj == null) { return; } NavFile.Add(obj); }
/// <summary> /// GPS 实时星历信息转换。 /// </summary> /// <param name="msg"></param> /// <returns></returns> public EphemerisParam GetEphemerisParam(Message1019 msg) { EphemerisParam para = new EphemerisParam(); para.Prn = new SatelliteNumber((int)msg.SatelliteID, SatelliteType.G); #region 开普勒轨道根数 kepler elements para.Toc = msg.Toc * 16; para.Toe = msg.Toe * 16; para.SqrtA = msg.SqrtA * RtcmConst.P2_19; para.Eccentricity = msg.Eccentricity * RtcmConst.P2_33; para.Inclination = msg.I0 * RtcmConst.P2_31 * RtcmConst.SemiCircleToRad; para.LongOfAscension = msg.Omega0 * RtcmConst.P2_31 * RtcmConst.SemiCircleToRad; para.ArgumentOfPerigee = msg.ArgumentOfPerigee * RtcmConst.P2_31 * RtcmConst.SemiCircleToRad; para.MeanAnomaly = msg.M0 * RtcmConst.P2_31 * RtcmConst.SemiCircleToRad; #endregion #region 轨道摄动参数 perturbation parameters para.DeltaN = msg.DeltaN * RtcmConst.P2_43 * RtcmConst.SemiCircleToRad; para.EyeDot = msg.Idot * RtcmConst.P2_43 * RtcmConst.SemiCircleToRad; //?? para.OmegaDot = msg.OmegaDot * RtcmConst.SemiCircleToRad * RtcmConst.P2_43; para.Cuc = msg.Cuc * RtcmConst.P2_29; //?? para.Cus = msg.Cus * RtcmConst.P2_29; para.Crc = msg.Crc * RtcmConst.P2_5; //?? para.Crs = msg.Crs * RtcmConst.P2_5; //?? para.Cic = msg.Cic * RtcmConst.P2_29; //?? para.Cis = msg.Cis * RtcmConst.P2_29; #endregion #region other satData para.IODE = msg.Iode; para.CodesL2 = msg.CodeOnL2; para.GPSWeeks = GetAbsoluteWeekNumber((int)msg.WeekNumber); para.L2PDataFlag = msg.L2PDataFlag; para.SVAccuracy = msg.SvAccuracy; para.SVHealth = msg.SvHealth; para.TGD = msg.Tgd * RtcmConst.P2_31; para.IODC = msg.Iodc; //?? para.TTM = 0; //?? para.FitInterval = msg.FitInterval;/* 0:4hr,1:>4hr */ #endregion #region clock para.ClockBias = msg.Af0 * RtcmConst.P2_31; para.ClockDrift = msg.Af1 * RtcmConst.P2_43; para.DriftRate = msg.Af2 * RtcmConst.P2_55; para.Time = new Time(para.GPSWeeks, para.Toe); #endregion return(para); }
/// <summary> /// 构建历元数据 /// </summary> /// <param name="record"></param> /// <returns></returns> public static string BuildRinexRecordV3(EphemerisParam record) { StringBuilder sb = new StringBuilder(); sb.AppendLine(BuildFirstLineV3(record)); sb.Append(" "); sb.Append(DoubleUtil.ScientificFomate(record.IODE, "E19.12", false)); sb.Append(DoubleUtil.ScientificFomate(record.Crs, "E19.12", false)); sb.Append(DoubleUtil.ScientificFomate(record.DeltaN, "E19.12", false)); sb.Append(DoubleUtil.ScientificFomate(record.MeanAnomaly, "E19.12", false)); sb.AppendLine(); sb.Append(" "); sb.Append(DoubleUtil.ScientificFomate(record.Cuc, "E19.12", false)); sb.Append(DoubleUtil.ScientificFomate(record.Eccentricity, "E19.12", false)); sb.Append(DoubleUtil.ScientificFomate(record.Cus, "E19.12", false)); sb.Append(DoubleUtil.ScientificFomate(record.SqrtA, "E19.12", false)); sb.AppendLine(); sb.Append(" "); sb.Append(DoubleUtil.ScientificFomate(record.Toe, "E19.12", false)); sb.Append(DoubleUtil.ScientificFomate(record.Cic, "E19.12", false)); sb.Append(DoubleUtil.ScientificFomate(record.LongOfAscension, "E19.12", false)); sb.Append(DoubleUtil.ScientificFomate(record.Cis, "E19.12", false)); sb.AppendLine(); sb.Append(" "); sb.Append(DoubleUtil.ScientificFomate(record.Inclination, "E19.12", false)); sb.Append(DoubleUtil.ScientificFomate(record.Crc, "E19.12", false)); sb.Append(DoubleUtil.ScientificFomate(record.ArgumentOfPerigee, "E19.12", false)); sb.Append(DoubleUtil.ScientificFomate(record.OmegaDot, "E19.12", false)); sb.AppendLine(); sb.Append(" "); sb.Append(DoubleUtil.ScientificFomate(record.EyeDot, "E19.12", false)); sb.Append(DoubleUtil.ScientificFomate(record.CodesL2, "E19.12", false)); sb.Append(DoubleUtil.ScientificFomate(record.GPSWeeks, "E19.12", false)); sb.Append(DoubleUtil.ScientificFomate(record.L2PDataFlag?1:0, "E19.12", false)); sb.AppendLine(); sb.Append(" "); sb.Append(DoubleUtil.ScientificFomate(record.SVAccuracy, "E19.12", false)); sb.Append(DoubleUtil.ScientificFomate(record.SVHealth, "E19.12", false)); sb.Append(DoubleUtil.ScientificFomate(record.TGD, "E19.12", false)); sb.Append(DoubleUtil.ScientificFomate(record.IODC, "E19.12", false)); sb.AppendLine(); sb.Append(" "); sb.Append(DoubleUtil.ScientificFomate(record.TTM, "E19.12", false)); sb.Append(DoubleUtil.ScientificFomate(0, "E19.12", false)); sb.Append(DoubleUtil.ScientificFomate(0, "E19.12", false)); sb.Append(DoubleUtil.ScientificFomate(0, "E19.12", false)); sb.AppendLine(); return(sb.ToString()); }
/// <summary> /// 获取卫星位置 /// </summary> /// <param name="prn"></param> /// <param name="gpsTime"></param> /// <returns></returns> public override Ephemeris Get(SatelliteNumber prn, Time gpsTime) { if (!this.Prns.Contains(prn)) { return(null); // throw new Exception("星历数据源中没有包含指定的卫星:" + prn); } EphemerisParam nearstNavRecord = GetNearstNavRecord(NavFile.GetEphemerisParams(prn), gpsTime, TimeSpan.FromDays(200)); return(nearstNavRecord.GetEphemerisInfo(gpsTime)); }
/// <summary> /// 指定时刻卫星是否健康可用。 /// </summary> /// <param name="prn"></param> /// <param name="gpsTime"></param> /// <returns></returns> public override bool IsAvailable(SatelliteNumber prn, Time gpsTime) { if (!this.Prns.Contains(prn)) { throw new Exception("星历数据源中没有包含指定的卫星:" + prn); } EphemerisParam nearstNavRecords = GetNearstNavRecord(NavFile.GetEphemerisParams(prn), gpsTime, TimeSpan.FromDays(200)); return(nearstNavRecords.SVHealth == 0); }
/// <summary> /// 选择最接近的卫星星历。 /// </summary> /// <returns></returns> public static EphemerisParam GetNearstNavRecord(List <EphemerisParam> records, Time gpsTime, TimeSpan TimeLimen) { EphemerisParam first = records[0]; EphemerisParam last = records[records.Count - 1]; List <EphemerisParam> results = new List <EphemerisParam>(); //小于时段 if (gpsTime.SecondsOfWeek <= first.Time.SecondsOfWeek) { if (gpsTime.SecondsOfWeek < first.Time.SecondsOfWeek - TimeLimen.TotalSeconds) //过小 { throw new Exception("指定的时间已经超出星历时段允许的阈值!" + first.Time); } else { return(first); } } //大于时段。 if (gpsTime.SecondsOfWeek >= last.Time.SecondsOfWeek) { if (gpsTime.SecondsOfWeek > last.Time.SecondsOfWeek + TimeLimen.TotalSeconds) //过大 { throw new Exception("指定的时间已经超出星历时段允许的阈值!" + last.Time); } else { return(last); } } //介于时段 EphemerisParam prev = null; foreach (EphemerisParam current in records) { if (current.Time.SecondsOfWeek == gpsTime.SecondsOfWeek) { return(current); } if (prev != null && IsBetween(gpsTime.SecondsOfWeek, prev.Time.SecondsOfWeek, current.Time.SecondsOfWeek)) { double disA = Math.Abs(gpsTime.SecondsOfWeek - current.Time.SecondsOfWeek); double disB = Math.Abs(gpsTime.SecondsOfWeek - prev.Time.SecondsOfWeek); if (disA < disB) { return(current); } return(prev); } prev = current; } throw new Exception("你不可能看到我的!"); }
protected void OnEphemerisInfoReceived(EphemerisParam obj) { if (obj == null) { return; } if (EphemerisInfoReceived != null) { EphemerisInfoReceived(obj); } }
/// <summary> /// 检查,如果该星历步存在,则添加星历参数并返回true。 /// </summary> /// <param name="para"></param> public bool CheckAndAppendEphemerisParam(EphemerisParam para) { if (!LatestNavEphDic.ContainsKey(para.Prn) || !LatestNavEphDic[para.Prn].Equals(para.Time)) { LatestNavEphDic[para.Prn] = para.Time; AppendEphemerisParam(para); return(true); } log.Debug("缓存星历已存在,略过了 " + para.Prn + ", " + para.Time); return(false); }
/// <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> /// Galileo 实时星历信息转换。 /// </summary> /// <param name="msg"></param> /// <returns></returns> public EphemerisParam GetEphemerisParam(Message1045 msg) { EphemerisParam para = new EphemerisParam(); para.Prn = new SatelliteNumber((int)msg.SatelliteID, SatelliteType.E); #region 开普勒轨道根数 kepler elements para.Toc = msg.Toc * 60; para.Toe = msg.Toe * 60; para.SqrtA = msg.SqrtA * RtcmConst.P2_19; para.Eccentricity = msg.Eccentricity * RtcmConst.P2_33; para.Inclination = msg.I0 * RtcmConst.P2_31 * RtcmConst.SemiCircleToRad; para.LongOfAscension = msg.Omega0 * RtcmConst.P2_31 * RtcmConst.SemiCircleToRad; para.ArgumentOfPerigee = msg.ArgumentOfPerigee * RtcmConst.P2_31 * RtcmConst.SemiCircleToRad; para.MeanAnomaly = msg.M0 * RtcmConst.P2_31 * RtcmConst.SemiCircleToRad; #endregion #region 轨道摄动参数 perturbation parameters para.DeltaN = msg.DeltaN * RtcmConst.P2_43 * RtcmConst.SemiCircleToRad; para.EyeDot = msg.Idot * RtcmConst.P2_43 * RtcmConst.SemiCircleToRad; //?? para.OmegaDot = msg.OmegaDot * RtcmConst.SemiCircleToRad * RtcmConst.P2_43; para.Cuc = msg.Cuc * RtcmConst.P2_29; //?? para.Cus = msg.Cus * RtcmConst.P2_29; para.Crc = msg.Crc * RtcmConst.P2_5; //?? para.Crs = msg.Crs * RtcmConst.P2_5; //?? para.Cic = msg.Cic * RtcmConst.P2_29; //?? para.Cis = msg.Cis * RtcmConst.P2_29; #endregion #region other satData para.IODE = msg.Iodn; para.TTM = 0; para.GalileoWeeks = GetAbsoluteWeekNumber((int)msg.WeekNumber); para.SVAccuracy = msg.GalileoSVSISA; #endregion #region clock para.ClockBias = msg.af0 * RtcmConst.P2_34; para.ClockDrift = msg.af1 * RtcmConst.P2_46; para.DriftRate = msg.af2 * RtcmConst.P2_59; para.Time = new Time(para.GPSWeeks, para.Toe); #endregion return(para); }
/// <summary> /// 添加星历参数 /// </summary> /// <param name="para"></param> public void AppendEphemerisParam(EphemerisParam para) { StringBuilder.Append(BuildRinexRecordV3(para)); }
/// <summary> /// 读取 RINEX 2.0s GPS导航文件。 /// </summary> /// <param name="sr"></param> /// <param name="header"></param> /// <returns></returns> public static EphemerisParam ReadRecordV2(StreamReader sr, NavFileHeader header) { EphemerisParam record = new EphemerisParam(); string line = sr.ReadLine(); ParseFirstLineV2(line, header, record); line = sr.ReadLine(); line = line.Replace('D', 'E'); record.IODE = double.Parse(line.Substring(3, 19)); record.Crs = double.Parse(line.Substring(22, 19)); record.DeltaN = double.Parse(line.Substring(41, 19)); record.MeanAnomaly = double.Parse(line.Substring(60, 19)); line = sr.ReadLine(); line = line.Replace('D', 'E'); record.Cuc = double.Parse(line.Substring(3, 19)); record.Eccentricity = double.Parse(line.Substring(22, 19)); record.Cus = double.Parse(line.Substring(41, 19)); record.SqrtA = double.Parse(line.Substring(60, 19)); line = sr.ReadLine(); line = line.Replace('D', 'E'); record.Toe = double.Parse(line.Substring(3, 19)); record.Cic = double.Parse(line.Substring(22, 19)); record.LongOfAscension = double.Parse(line.Substring(41, 19)); record.Cis = double.Parse(line.Substring(60, 19)); line = sr.ReadLine(); line = line.Replace('D', 'E'); record.Inclination = double.Parse(line.Substring(3, 19)); record.Crc = double.Parse(line.Substring(22, 19)); record.ArgumentOfPerigee = double.Parse(line.Substring(41, 19)); record.OmegaDot = double.Parse(line.Substring(60, 19)); line = sr.ReadLine(); line = line.Replace('D', 'E'); record.EyeDot = double.Parse(line.Substring(3, 19)); record.CodesL2 = double.Parse(line.Substring(22, 19)); record.GPSWeeks = (int)double.Parse(line.Substring(41, 19)); record.L2PDataFlag = double.Parse(line.Substring(60, 19)) == 1; line = sr.ReadLine(); line = line.Replace('D', 'E'); record.SVAccuracy = double.Parse(line.Substring(3, 19)); record.SVHealth = double.Parse(line.Substring(22, 19)); record.TGD = double.Parse(line.Substring(41, 19)); record.IODC = double.Parse(line.Substring(60, 19)); if (header.Version == 1.0) { return(record); } line = sr.ReadLine(); line = line.Replace('D', 'E'); record.TTM = double.Parse(line.Substring(3, 19)); return(record); }
/// <summary> /// 依据卫星轨道参数获取卫星位置。 /// </summary> /// <param name="record"></param> /// <param name="gpstime"></param> /// <returns></returns> public static XYZ GetSatPos(EphemerisParam record, Time gpstime) { return(OrbitUtil.GetSatXyz(record, gpstime.SecondsOfWeek)); }
/// <summary> /// BeiDou 实时星历信息转换。 /// </summary> /// <param name="msg"></param> /// <returns></returns> public EphemerisParam GetEphemerisParam(Message63 msg) { EphemerisParam para = new EphemerisParam(); para.Prn = new SatelliteNumber((int)msg.SatelliteID, SatelliteType.C); #region 开普勒轨道根数 kepler elements para.Toc = msg.Toc * 8; para.Toe = msg.Toe * 8; para.SqrtA = msg.SqrtA * RtcmConst.P2_19; para.Eccentricity = msg.Eccentricity * RtcmConst.P2_33; para.Inclination = msg.I0 * RtcmConst.P2_31 * RtcmConst.SemiCircleToRad; para.LongOfAscension = msg.Omega0 * RtcmConst.P2_31 * RtcmConst.SemiCircleToRad; para.ArgumentOfPerigee = msg.ArgumentOfPerigee * RtcmConst.P2_31 * RtcmConst.SemiCircleToRad; para.MeanAnomaly = msg.M0 * RtcmConst.P2_31 * RtcmConst.SemiCircleToRad; #endregion #region 轨道摄动参数 perturbation parameters para.DeltaN = msg.DeltaN * RtcmConst.P2_43 * RtcmConst.SemiCircleToRad; para.EyeDot = msg.Idot * RtcmConst.P2_43 * RtcmConst.SemiCircleToRad; //?? para.OmegaDot = msg.OmegaDot * RtcmConst.SemiCircleToRad * RtcmConst.P2_43; para.Cuc = msg.Cuc * RtcmConst.P2_31; //?? para.Cus = msg.Cus * RtcmConst.P2_31; para.Crc = msg.Crc * RtcmConst.P2_6; //?? para.Crs = msg.Crs * RtcmConst.P2_6; //?? para.Cic = msg.Cic * RtcmConst.P2_31; //?? para.Cis = msg.Cis * RtcmConst.P2_31; #endregion #region other satData para.IODE = msg.Aode; //para.CodesL2 = msg.CodeOnL2; //para.BeiDouWeeks = GetAbsoluteBeiDouWeekNumber((int)msg.WeekNumber); para.GPSWeeks = Setting.ReceivingTimeOfNtripData.GpsWeek;//para.BeiDouWeeks + 1356; //para.L2PDataFlag = msg.L2PDataFlag; if (msg.BeiDOuURAI >= 0 && msg.BeiDOuURAI < 6) { para.SVAccuracy = Math.Pow(2, msg.BeiDOuURAI / 2 + 1); } else if (msg.BeiDOuURAI < 15) { para.SVAccuracy = Math.Pow(2, msg.BeiDOuURAI - 2); } else { para.SVAccuracy = 9999999.9999; } para.SVHealth = msg.SvHealth; para.Tgd1OfBeidDou = msg.Tgd1 * 0.1; para.Tgd2OfBeidDou = msg.Tgd2 * 0.1; para.IODC = msg.Aodc; para.SatH1 = msg.SatH1; #endregion #region clock para.ClockBias = msg.a0 * RtcmConst.P2_33; para.ClockDrift = msg.a1 * RtcmConst.P2_50; para.DriftRate = msg.a2 * RtcmConst.P2_66; para.Time = new Time(para.GPSWeeks, para.Toe); #endregion return(para); }
protected override void dataProvider_EphemerisInfoReceived(EphemerisParam obj) { this.WriteEphemerisParam(obj); }
public void WriteEphemerisParam(EphemerisParam obj) { //写入文件 GpsNavFileWriter.CheckAndAppendEphemerisParam(obj); GpsNavFileWriter.SaveToFile(); }
protected virtual void dataProvider_EphemerisInfoReceived(EphemerisParam obj) { }
void RtcmDataParser_EphemerisInfoReceived(EphemerisParam obj) { // RtGnssDataWriter.WriteEphemerisParam(obj); }
/// <summary> /// 添加星历参数,重复星历将失败。 /// </summary> /// <param name="EphemerisParam"></param> public void Add(EphemerisParam EphemerisParam) { this.ParamNavFile.Add(EphemerisParam); }
/// <summary> /// 读取 RINEX 3.0s GNSS 导航文件。 /// </summary> /// <param name="sr"></param> /// <param name="header"></param> /// <returns></returns> public static EphemerisParam ReadRecordBodyV3(StreamReader sr, EphemerisParam record) { string line = null; if (record.Prn.SatelliteType == SatelliteType.U) { return(record); } //采用坐标 while (record.Prn.SatelliteType == SatelliteType.S || record.Prn.SatelliteType == SatelliteType.R) { sr.ReadLine(); sr.ReadLine(); sr.ReadLine(); line = sr.ReadLine(); //ParseFirstLineV3(line, header, record); // GlonassNaviFileReader.ReadRecordBodyV3(record ) } //轨道参数 if (record.Prn.SatelliteType == SatelliteType.E || record.Prn.SatelliteType == SatelliteType.C || record.Prn.SatelliteType == SatelliteType.G || record.Prn.SatelliteType == SatelliteType.J || record.Prn.SatelliteType == SatelliteType.I) { line = sr.ReadLine(); line = line.Replace('D', 'E'); record.IODE = Geo.Utils.StringUtil.ParseDouble(line, 4, 19); record.Crs = Geo.Utils.StringUtil.ParseDouble(line, 23, 19); record.DeltaN = Geo.Utils.StringUtil.ParseDouble(line, 42, 19); record.MeanAnomaly = Geo.Utils.StringUtil.ParseDouble(line, 61, 19); line = sr.ReadLine(); line = line.Replace('D', 'E'); record.Cuc = Geo.Utils.StringUtil.ParseDouble(line, 4, 19); record.Eccentricity = Geo.Utils.StringUtil.ParseDouble(line, 23, 19); record.Cus = Geo.Utils.StringUtil.ParseDouble(line, 42, 19); record.SqrtA = Geo.Utils.StringUtil.ParseDouble(line, 61, 19); line = sr.ReadLine(); line = line.Replace('D', 'E'); record.Toe = Geo.Utils.StringUtil.ParseDouble(line, 4, 19); record.Cic = Geo.Utils.StringUtil.ParseDouble(line, 23, 19); record.LongOfAscension = Geo.Utils.StringUtil.ParseDouble(line, 42, 19); record.Cis = Geo.Utils.StringUtil.ParseDouble(line, 61, 19); line = sr.ReadLine(); line = line.Replace('D', 'E'); record.Inclination = Geo.Utils.StringUtil.ParseDouble(line, 4, 19); record.Crc = Geo.Utils.StringUtil.ParseDouble(line, 23, 19); record.ArgumentOfPerigee = Geo.Utils.StringUtil.ParseDouble(line, 42, 19); record.OmegaDot = Geo.Utils.StringUtil.ParseDouble(line, 61, 19); line = sr.ReadLine(); line = line.Replace('D', 'E'); record.EyeDot = Geo.Utils.StringUtil.ParseDouble(line, 4, 19); record.CodesL2 = Geo.Utils.StringUtil.ParseDouble(line, 23, 19); record.GPSWeeks = (int)Geo.Utils.StringUtil.ParseDouble(line, 42, 19); record.L2PDataFlag = Geo.Utils.StringUtil.ParseDouble(line, 61, 19) == 1; line = sr.ReadLine(); line = line.Replace('D', 'E'); record.SVAccuracy = Geo.Utils.StringUtil.ParseDouble(line, 4, 19); record.SVHealth = Geo.Utils.StringUtil.ParseDouble(line, 23, 19); record.TGD = Geo.Utils.StringUtil.ParseDouble(line, 42, 19); record.IODC = Geo.Utils.StringUtil.ParseDouble(line, 61, 19); //if (header.Version == 1.0) return record; line = sr.ReadLine(); line = line.Replace('D', 'E'); record.TTM = Geo.Utils.StringUtil.ParseDouble(line, 4, 19); } return(record); }