protected override void dataProvider_SSRSp3RecordReceived(Sp3Section obj) { if (obj == null) { return; } SSRSp3Section[obj.First.Prn.SatelliteType] = obj; }
protected void OnSSRSp3RecordReceived(Sp3Section obj) { if (obj == null) { return; } if (SSRSp3RecordReceived != null) { SSRSp3RecordReceived(obj); } }
/// <summary> /// 输出sp3文件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button_export_Click(object sender, EventArgs e) { bool fillWithZero = checkBox1.Checked; var directory = this.directorySelectionControl1.Path; Geo.Utils.FileUtil.CheckOrCreateDirectory(directory); string[] pathes = this.textBox_Pathes.Lines; foreach (var sp3item in pathes) { Sp3Reader r = new Sp3Reader(sp3item); sp3 = r.ReadAll(); string PredictedClockBiasPath = this.textBox_predictedresultPath.ToString(); ClockBias = new Dictionary <Time, Clockbias>(); GetPredictedClockBias(PredictedClockBiasPath); sp3ofPredicted = new Sp3File(); sp3ofPredicted.Header = sp3.Header; foreach (Sp3Section sec in sp3) { Sp3Section s = new Sp3Section(); Clockbias section = ClockBias[sec.Time]; foreach (Ephemeris rec in sec) { s.Time = rec.Time; if (section.sat.ContainsKey(rec.Prn) && section.sat[rec.Prn] != null) { rec.ClockBias = section.sat[rec.Prn]; } else { rec.ClockBias = 999999.999999; } s.Add(rec.Prn, rec); } sp3ofPredicted.Add(s); } sp3ofPredicted.Header.Comments.Add("Processd by Gnsser"); sp3ofPredicted.Header.Comments.Add("Predicted clock bias replace original precise data"); var path = Path.Combine(directory, "P" + r.Name + ".sp3"); Sp3Writer Sp3Writer = new Sp3Writer(path, sp3ofPredicted); sp3.Clear(); } Geo.Utils.FileUtil.OpenDirectory(directory); }
/// <summary> /// 输出结果 /// </summary> /// <param name="epoch"></param> /// <param name="result"></param> public void AddEpochResult(ISiteSatObsInfo epoch, SimpleGnssResult result) { //结果采样率过滤 var interval = Math.Abs(epoch.ReceiverTime - PrevEpoch); if (interval < this.OutputMinInterval) { return; } PrevEpoch = epoch.ReceiverTime; //总开关 if (!Option.IsOutputResult && !Option.IsOutputEpochResult) { return; } var Adjustment = result.ResultMatrix; var ParamNames = result.ParamNames; //各历元信息 #region 默认逐历元输出 //参数值 if (Option.IsOutputEpochParam) { AddEpochParam(epoch, result); } // RMS if (Option.IsOutputEpochParamRms) { AddParamRms(epoch, result); } //钟跳 if (Option.IsOutputJumpClockFile) { CheckOrAddClockJump(epoch, result); } //第二参数 if (result.ResultMatrix.SecondEstimated != null) { AddSecondParam(epoch, result); AddSecondParamRms(epoch, result); } //DOP if (this.Option.IsOutputEpochDop) { AddDop(epoch, result); } //两路滤波,模糊度固定解 AddAmbFixed(epoch, result); //动态定位,且坐标未固定,则添加 if (this.Option.IsOutputEpochCoord || (this.Option.PositionType == PositionType.动态定位 && !this.Option.IsFixingCoord)) { AddEpochCoord(epoch, result); } #endregion #region 择性历元输出 #region 平差文件 if (this.Option.IsOutputAdjust) { AioAdjustFileBuilder.AddAdjustment(Adjustment); } if (this.Option.IsOutputObsEquation) { AdjustEquationFileBuilder.AddAdjustment(Adjustment); } if (this.Option.IsOutputAdjustMatrix) { if (results == null) { results = new List <SimpleGnssResult>(); } results.Add(result); } #endregion #region 电离层产品 if (this.Option.IsOutputIono) { BuildIonoResult(epoch, Adjustment, ParamNames); } #endregion #region 对流层产品 if (this.Option.IsOutputWetTrop && Geo.Utils.StringUtil.Contanis(ParamNames, Gnsser.ParamNames.WetTropZpd, true) && epoch.ReceiverTime.SecondsOfDay % 300 == 0) { var table = TableTextManager.GetOrCreate(epoch.Name + "_" + Gnsser.ParamNames.WetTropZpd); table.NewRow(); table.AddItem("Epoch", epoch.ReceiverTime); EpochInformation epochInfo = epoch as EpochInformation; //var ionoResult = Adjustment.Estimated.GetAll(Gnsser.ParamNames.WetTrop); //天顶对流层总延迟,epochInfo[0].WetMap_ZTD=1 table.AddItem("Trop1", epochInfo[0].AppriorTropDelay + epochInfo[0].WetMap_ZTD * result.ResultMatrix.Estimated[4, 0]); table.AddItem("Trop2", epochInfo[1].WetMap_ZTD * result.ResultMatrix.Estimated[4, 0]); table.AddItem("Trop3", result.ResultMatrix.Estimated[4, 0]); //epoch[0].AppriorTropDelay + epoch[0].WetMap_ZTD * //foreach (var item in ionoResult) //{ // table.AddItem(item.Key, item.Value.Value); //} } #endregion #region 历元卫星观测信息 if (Option.IsOutputEpochSatInfo) { AddSiteEpochSatInfo(epoch); } #endregion #endregion if (Option.IsOutputObservation) { AddObservation(epoch, result); } if (Option.IsOutputResidual) { this.AddResidual(epoch, result); } //轨道产品输出 if (result is IOrbitResult) { var ephs = ((IOrbitResult)result).EphemerisResults; Sp3Section sp3Records = new Sp3Section(ephs.First.Original.Time); foreach (var eph in ephs) { sp3Records.Add(eph.Original.Prn, eph.Corrected); } Sp3Writer.Write(sp3Records); } this.PrevResult = result; }
/// <summary> /// 实时星历改正。 /// </summary> /// <param name="obs"></param> /// <param name="maxCorrectionSecond">允许的最大改正秒数,是否该每颗卫星单独考虑</param> protected void RTSp3InfoCorrected(RinexEpochObservation obs, double maxCorrectionSecond = 60)//Time time, SatelliteType satType) { Time time = obs.ReceiverTime; if (SSRSp3Section.Count == 0) { return; } if (time - SSRSp3Section.GetMaxTime() > maxCorrectionSecond) { return; } Sp3Section Sp3Section = new Sp3Section(); var keys = SSRSp3Section.Keys; foreach (var key in keys) { var obj = SSRSp3Section[key]; foreach (var item in obj) { if (!NavFile.Prns.Contains(item.Prn)) { continue; } var ss = new SingleParamNavFileEphService(NavFile); var unkown = NavFile.GetEphemerisParams(item.Prn).Find(b => Math.Abs(b.Time.TickTime.TotalSeconds - time.TickTime.TotalSeconds) < 3 * 3600); if (unkown == null) { continue; } if (ss == null) { continue; } Ephemeris ss1 = ss.Get(item.Prn, time); XYZ eA = ss1.XyzDot / ss1.XyzDot.Length; XYZ eC = ss1.XYZ.Cross(ss1.XyzDot) / (ss1.XYZ.Cross(ss1.XyzDot)).Length; XYZ eR = eA.Cross(eC) / (eA.Cross(eC)).Length; XYZ deltaO = item.XYZ + item.XyzDot * (time.TickTime.TotalSeconds - item.Time.TickTime.TotalSeconds); double x = eR.X * deltaO.X + eA.X * deltaO.Y + eC.X * deltaO.Z; double y = eR.Y * deltaO.X + eA.Y * deltaO.Y + eC.Y * deltaO.Z; double z = eR.Z * deltaO.X + eA.Z * deltaO.Y + eC.Z * deltaO.Z; if (x * x + y * y + z * z > 100) { } Ephemeris Sp3Record = new Ephemeris(); Sp3Record.Prn = item.Prn; Sp3Record.XYZ = ss1.XYZ - new XYZ(x, y, z); Sp3Record.Time = time; if (item.Prn.SatelliteType == SatelliteType.R) { Sp3Record.ClockBias = ss1.ClockBias + item.ClockBias; } else { double relativetime = 2 * ss1.XYZ.Dot(ss1.XyzDot) / (GnssConst.LIGHT_SPEED * GnssConst.LIGHT_SPEED); Sp3Record.ClockBias = ss1.ClockBias - ss1.RelativeCorrection - item.ClockBias; //relativetime + key.ClockBias; } Sp3Section.Add(Sp3Record.Prn, Sp3Record); } } if (Sp3Section.Count != 0) { Sp3Section.Time = time; Sp3File.Add(Sp3Section); } else { int a = 0; } if (Sp3File.Count > 11) { // Sp3File.Header = new Sp3Header(); Sp3File.Header.EpochInterval = 1; //Sp3File.TimePeriod = new BufferedTimePeriod(Sp3File.First.Time, Sp3File.Last.Time, 60); if (EphemerisService == null) { EphemerisService = new SingleSp3FileEphService(this.Sp3File.GetSatEphemerisCollection(), 10); } else { ((SingleSp3FileEphService)EphemerisService).SetSp3File(Sp3File.GetSatEphemerisCollection()); } } if (Sp3File.Count > 20) { Sp3File.RemoveFirst(); } }
private void button_read_Click(object sender, EventArgs e) { bool fillWithZero = checkBox1.Checked; var directory = this.directorySelectionControl1.Path; Geo.Utils.FileUtil.CheckOrCreateDirectory(directory); string[] pathes = this.textBox_Pathes.Lines; int dayOfweekO = 0; //sp3Observation = new Sp3File(); TableTextManager = new ObjectTableManager(); TableTextManager.OutputDirectory = directory; var SatEpochCountTable = TableTextManager.GetOrCreate("GNSSerSatEpochCount" + Path.GetFileNameWithoutExtension(pathes[0]).Substring(0, 12)); #region 照时间顺序合并 Time start = Time.MinValue; foreach (var pathItem in pathes) { Sp3Reader r = new Sp3Reader(pathItem); sp3 = r.ReadAll(); var intervalSec = sp3.Header.EpochInterval; foreach (Sp3Section sec in sp3) { Sp3Section s = new Sp3Section(); foreach (var rec in sec) { if (rec.Prn.SatelliteType == SatelliteType.R) { rec.Time = rec.Time + 1; } s.Time = rec.Time; s.Add(rec.Prn, rec); } if (sp3Observation == null || sp3Observation.Count == 0) { sp3Observation = new Sp3File(); sp3Observation.Header = sp3.Header; sp3Observation.Header.StartTime = s.Time; sp3Observation.Header.Comments.Add("Processd by Gnsser"); sp3Observation.Header.Comments.Add("Collected from real time SSR clock correction"); dayOfweekO = sp3Observation.Header.StartTime.GetGpsWeekAndDay(); } if (((s.Time.Hour == 0 && s.Time.Minute == 0 && s.Time.Second == 0) || start.GetGpsWeekAndDay() != s.Time.GetGpsWeekAndDay()) && sp3Observation.Count != 0) { var pathObservation = Path.Combine(directory, "Gnsser" + sp3.Name.Substring(0, 12) + dayOfweekO.ToString() + ".sp3"); sp3Observation.Header.NumberOfEpochs = sp3Observation.Count; Sp3Writer Sp3WriterObservation = new Sp3Writer(pathObservation, sp3Observation); Sp3WriterObservation.SaveToFile(); SatEpochCountTable.NewRow(); SatEpochCountTable.AddItem("Day", dayOfweekO); sp3Observation.CheckOrBuildIndexCollection(); foreach (var item in sp3Observation.SatEphemerisCollection.Keys) { int a = sp3Observation.SatEphemerisCollection[item].Count; SatEpochCountTable.AddItem(item, a); } SatEpochCountTable.EndRow(); sp3Observation.Clear(); sp3Observation.SatEphemerisCollection.Clear(); sp3Observation.Header.StartTime = s.Time; //sp3Observation.Header.Comments.Add("Processd by Gnsser"); //sp3Observation.Header.Comments.Add("Collected from real time SSR clock correction"); dayOfweekO = sp3Observation.Header.StartTime.GetGpsWeekAndDay(); start = s.Time; } if (!sp3Observation.Contains(s.Time)) { sp3Observation.Add(s); } } } TableTextManager.WriteAllToFileAndCloseStream(); if (sp3Observation.Count != 0) { var pathObservation = Path.Combine(directory, "Gnsser" + sp3.Name.Substring(0, 12) + dayOfweekO.ToString() + ".sp3"); sp3Observation.Header.NumberOfEpochs = sp3Observation.Count; Sp3Writer Sp3WriterObservation = new Sp3Writer(pathObservation, sp3Observation); Sp3WriterObservation.SaveToFile(); sp3Observation.Clear(); } #endregion Geo.Utils.FileUtil.OpenDirectory(directory); }
protected virtual void dataProvider_SSRSp3RecordReceived(Sp3Section obj) { }
public void WriteSp3Record(Sp3Section obj) { Sp3Writer.Write(obj); Sp3Writer.Flush(); }
protected override void dataProvider_SSRSp3RecordReceived(Sp3Section obj) { this.WriteSp3Record(obj); }
private void calculate_Click(object sender, EventArgs e) { bool fillWithZero = checkBox1.Checked; var intervalSec = double.Parse(textBox_interval.Text) * 60; var directory = this.directorySelectionControl1.Path; Geo.Utils.FileUtil.CheckOrCreateDirectory(directory); string[] SSRsp3Pathes = this.textBox_SSRsp3Pathes.Lines; string[] NavPathes = this.textBox_NavPathes.Lines; string[] ClockPathes = this.textBox1.Lines; if (SSRsp3Pathes.Length != NavPathes.Length) { return; } int fileCount = SSRsp3Pathes.Length; if (!System.IO.Directory.Exists(@"D:\Temp\SSR1\")) { System.IO.Directory.CreateDirectory(@"D:\Temp\SSR1\"); } EpochCountTableTextManager = new ObjectTableManager(); EpochCountTableTextManager.OutputDirectory = "D:\\Temp\\SSR1\\"; var SatEpochCountTable = EpochCountTableTextManager.GetOrCreate("BNCSatEpochCount");// + OriginalSSR.Header.Name); SatEpochCountTable.NewRow(); for (int i = 0; i < fileCount; i++) { #region 读取SSR产品 Time start0 = Time.MaxValue; Time end0 = Time.MinValue; OriginalSSRSp3 = new Sp3File(); OriginalSSRSp3MinusPreciseClockOutput = new Sp3File(); OriginalSSRSp3PlusNavOutput = new Sp3File(); Sp3Reader r = new Sp3Reader(SSRsp3Pathes[i]); OriginalSSRSp3 = r.ReadAll(); OriginalSSRSp3.CheckOrBuildIndexCollection(); Dictionary <string, int> SatEpochCount = new Dictionary <string, int>(); foreach (var item in OriginalSSRSp3.Prns) { SatEpochCount.Add(item.ToString(), OriginalSSRSp3.SatEphemerisCollection[item].Count); } SatEpochCountTable.AddItem("Day", start0.GetGpsWeekAndDay()); foreach (var item in SatEpochCount) { SatEpochCountTable.AddItem(item.Key, item.Value); } SatEpochCountTable.EndRow(); #endregion #region 读取广播星历 ParamNavFileReader NavReader = new ParamNavFileReader(NavPathes[i]); ephemeris = new SingleParamNavFileEphService(NavReader.ReadGnssNavFlie()); #endregion #region 读取钟差文件 //ClockFileReader reader = new ClockFileReader(ClockPathes[i]); //ClockFile = reader.ReadAll(); //if (ClockFile.ClockCount == 0) return; #endregion OriginalSSRSp3.CheckOrBuildIndexCollection(); for (Time time = OriginalSSRSp3.TimePeriod.Start; time <= OriginalSSRSp3.TimePeriod.End; time += 1) { Sp3Section Sp3Section = new Sp3Section(); Sp3Section.Time = time; foreach (var prn in OriginalSSRSp3.Prns) { var ss1 = OriginalSSRSp3.SatEphemerisCollection[prn].Values.FindLast(b => b.Time <= time); if (!ephemeris.Prns.Contains(prn)) { continue; } var ss = ephemeris.Get(prn, time); XYZ eA = ss.XyzDot / ss.XyzDot.Length; XYZ eC = ss.XYZ.Cross(ss.XyzDot) / (ss.XYZ.Cross(ss.XyzDot)).Length; XYZ eR = eA.Cross(eC) / (eA.Cross(eC)).Length; XYZ deltaO = ss1.XYZ + ss1.XyzDot * (time.Seconds - ss1.Time.Seconds); double x = eA.X * deltaO.X + eA.X * deltaO.Y + eC.X * deltaO.Z; double y = eA.Y * deltaO.X + eA.Y * deltaO.Y + eC.Y * deltaO.Z; double z = eA.Z * deltaO.X + eA.Z * deltaO.Y + eC.Z * deltaO.Z; Ephemeris Sp3Record = new Ephemeris(); Sp3Record.Prn = prn; Sp3Record.XYZ = ss.XYZ - new XYZ(x, y, z); if (prn.SatelliteType == SatelliteType.R) { Sp3Record.ClockBias = ss.ClockBias + ss1.ClockBias; } else { Sp3Record.ClockBias = ss.ClockBias - ss.RelativeCorrection + ss1.ClockBias; } Sp3Section.Add(prn, Sp3Record); } OriginalSSRSp3PlusNavOutput.Add(Sp3Section); } var resultPath = Path.Combine("D:\\Temp\\SSR1\\", OriginalSSRSp3.Name); Sp3Writer ClockFileWriter = new Sp3Writer(resultPath, OriginalSSRSp3PlusNavOutput); ClockFileWriter.SaveToFile(); } // List<AtomicClock> OriginalSSRDataSource = new List<AtomicClock>(); // List<AtomicClock> ClockFileDataSource = new List<AtomicClock>(); // foreach (var key in OriginalSSRSp3.Prns) // { // //OriginalSSRDataSource = OriginalSSR.GetClockItems(key); // ClockFileDataSource = ClockFile.GetClockItems(key); // if (ClockFileDataSource == null) continue; // List<AtomicClock> ErrorResult = new List<AtomicClock>(); // List<AtomicClock> SSRPlusNavResult = new List<AtomicClock>(); // foreach (var item1 in ClockFileDataSource) // { // AtomicClock item2 = new AtomicClock(); // var clk = OriginalSSRSp3.GetClockItem(item1.Prn.ToString(),item1.Time); // if (item1.ClockBias == 9999999999.0 || clk == null) // { // item1.ClockBias = 9999999999.0; // item2.Time = item1.Time; // item2.Prn = item1.Prn; // item2.Name = item1.Name; // item2.ClockType = item1.ClockType; // item2.ClockBias = 9999999999.0; // } // else // { // var NavItem = ephemeris.Get(item1.Prn, item1.Time); // item2.Time = item1.Time; // item2.Prn = item1.Prn; // item2.Name = item1.Name; // item2.ClockType = item1.ClockType; // item2.ClockBias = NavItem.ClockBias - NavItem.RelativeTime + clk.ClockBias; // item1.ClockBias = item2.ClockBias - item1.ClockBias; // } // SSRPlusNavResult.Add(item2); // ErrorResult.Add(item1); // } // OriginalSSRSp3MinusPreciseClockOutput.Add(key, ErrorResult); // OriginalSSRSp3PlusNavOutput.Add(key, SSRPlusNavResult); // } // double interval = double.Parse(this.textBox_interval.Text); // ClockEstimationFrom = this.dateTimePicker_from.Value; // ClockEstimationTo = this.dateTimePicker_to.Value; // OriginalSSRSp3.Header = new Sp3Header (); // OriginalSSRSp3.Header.AgencyName="Gnsser"; // OriginalSSRSp3.Header.EndTime= // .Name = "SSR" + OriginalSSRSp3.Header.Name; // OriginalSSRSp3.Header.CreationDate = DateTime.Now.ToString(); // OriginalSSRSp3.Header.CreationAgence = "Gnsser"; // OriginalSSRSp3.Header.ANALYSIS_CENTER = "Gnsser"; // OriginalSSRSp3.Header.CreationProgram = "Gnsser"; // OriginalSSRSp3MinusPreciseClockOutput.Header = OriginalSSRSp3.Header; // OriginalSSRSp3PlusNavOutput.Header = OriginalSSRSp3.Header; // var resutlPath = Path.Combine("D:\\Temp\\SSR1\\", OriginalSSRSp3.Header.Name); // var errorResutlPath = Path.Combine("D:\\Temp\\SSR1\\", "error" + OriginalSSRSp3.Header.Name); // ClockFileWriter ClockFileWriter = new ClockFileWriter(resutlPath, OriginalSSRSp3PlusNavOutput); // ClockFileWriter.SaveToFile(); // ClockFileWriter errorClockFileWriter = new ClockFileWriter(errorResutlPath, OriginalSSRSp3MinusPreciseClockOutput); // errorClockFileWriter.SaveToFile(); // TableTextManager = new TableObjectManager(); // TableTextManager.OutputDirectory = "D:\\Temp\\SSR1\\"; // var paramTable = TableTextManager.GetOrCreate(OriginalSSRSp3MinusPreciseClockOutput.Name + "errorSSRSat"); // int count = 0; // SatelliteNumber prnIndex = new SatelliteNumber(); // foreach (var key in OriginalSSRSp3MinusPreciseClockOutput) // { // if (key.Count > count) { count = key.Count; prnIndex = key[0].Prn; } // } // var standard = OriginalSSRSp3MinusPreciseClockOutput.GetClockItems(prnIndex); // double DoubleDiffer = 0; // foreach (var key in standard) // { // paramTable.NewRow(); // paramTable.AddItem("Epoch", key.Time); // foreach (var item1 in OriginalSSRSp3MinusPreciseClockOutput.Names) // { // if (item1 == key.Name.ToString()) continue; // var ss = OriginalSSRSp3MinusPreciseClockOutput.GetClockItem(item1, key.Time); // if (ss == null) // continue; // if (key.ClockBias == 9999999999.0 || ss.ClockBias == 9999999999.0) // DoubleDiffer = 0; // else DoubleDiffer = key.ClockBias - ss.ClockBias; // paramTable.AddItem(ss.Prn + "-" + key.Prn, DoubleDiffer * 1E9); // } // paramTable.EndRow(); // } // TableTextManager.WriteAllToFileAndCloseStream(); //} //EpochCountTableTextManager.WriteAllToFileAndCloseStream(); Geo.Utils.FileUtil.OpenDirectory("D:\\Temp\\SSR1\\"); }
private void button_read_Click(object sender, EventArgs e) { bool fillWithZero = checkBox1.Checked; var directory = this.directorySelectionControl1.Path; string resultDirectory = Path.Combine(directory, "replace clock result"); Geo.Utils.FileUtil.CheckOrCreateDirectory(resultDirectory); string[] pathes = this.textBox_Pathes.Lines; string igsSp3Path = this.textBox_IgsSp3Path.Text; var st1 = int.Parse(pathes[0].Substring(pathes[0].Length - 6, 2)); var st2 = int.Parse(pathes[1].Substring(pathes[0].Length - 6, 2)); #region 照单个文件进行输出,不合并 foreach (var pathItem in pathes) { string dayOfWeek = Path.GetFileNameWithoutExtension(pathItem).Substring(5, 5); string dayOfWeekfileName = Path.GetFileNameWithoutExtension(igsSp3Path).Substring(3, 5); string path = igsSp3Path.Replace(dayOfWeekfileName, dayOfWeek); if (!File.Exists(path)) { //FormUtil.ShowFileNotExistBox(path); continue; } Sp3AllReader iguRead = new Sp3AllReader(pathItem); iguSp3 = iguRead.ReadAll(); Sp3AllReader igsRead = new Sp3AllReader(path); igsSp3 = igsRead.ReadAll(); var intervalSec = iguSp3.Header.EpochInterval; sp3Observation = new Sp3File(); sp3Observation.Header = igsSp3.Header; foreach (Sp3Section sec in igsSp3) { var item = iguSp3.Get(sec.Time); Sp3Section s = new Sp3Section(); foreach (var rec in sec) { s.Time = rec.Time; if (item != null && item.Contains(rec.Prn)) { rec.ClockBias = item[rec.Prn].ClockBias; } else { rec.ClockBias = 0.999999999999; } s.Add(rec.Prn, rec); } sp3Observation.Add(s); } sp3Observation.Header.Comments.Add("Processd by Gnsser"); sp3Observation.Header.Comments.Add("Choose clock of IGU-P for igs"); var pathObservation = Path.Combine(resultDirectory, iguSp3.Name); if (File.Exists(pathObservation)) { File.Delete(pathObservation); } Sp3Writer Sp3WriterObservation = new Sp3Writer(pathObservation, sp3Observation); Sp3WriterObservation.SaveToFile(); iguSp3.Clear(); } #endregion Geo.Utils.FileUtil.OpenDirectory(resultDirectory); }
/// <summary> /// 解析一个信息。 /// </summary> /// <param name="satData">传入的数据,包含一条完整帧的数据。</param> /// <param name="msgNumber">信息编号</param> private void ParseOneMessage(int msgNumber, List <byte> data) { #region 1001 - 1004 GPS 观测量相关 if (msgNumber >= 1001 && msgNumber <= 1004) { var gpsHeaderData = BinStringSequence.DeQueue(64); GpsMessageHeader RtcmHeader = GpsMessageHeader.Parse(gpsHeaderData); EpochMessage EpochMessage = new EpochMessage { Header = new NormalHeader(RtcmHeader) }; //本地时间同步 Setting.ReceivingTimeOfNtripData = EpochMessage.Header.Time; for (int i = 0; i < RtcmHeader.MessageCount; i++) { switch (msgNumber) { case 1001: Message1001 Message1001 = Message1001.Parse(BinStringSequence.DeQueue(58)); break; case 1002: Message1002 Message1002 = Message1002.Parse(BinStringSequence.DeQueue(74)); break; case 1003: Message1003 Message1003 = Message1003.Parse(BinStringSequence.DeQueue(101)); break; case 1004: Message1004 Message1004 = Message1004.Parse(BinStringSequence.DeQueue(125)); NormalMessage1004 msg = new NormalMessage1004(RtcmHeader, Message1004); #region 测试用,可删除 //name = Path.Combine(LocalDirectory, @"Rtcm3\Raw\Mormal_1004_" + msg.Prn + ".xls"); //Geo.Utils.FileUtil.CheckOrCreateDirectory(System.IO.Path.GetDirectoryName(name)); //if (!System.IO.File.Exists(name)) //{ // System.IO.File.AppendAllText(name, msg.GetTabTitles() + "\r\n"); //} //System.IO.File.AppendAllText(name, msg.GetTabValues() + "\r\n"); #endregion EpochMessage.Add(msg.Prn, msg); break; } } var EpochObservation = Rtcm3Converter.GetEpochObservation(EpochMessage); EpochObservation.Header = ObsHeader; EpochObservation.Name = SiteName; OnEpochObservationReceived(EpochObservation); } #endregion #region 1005-1013,1033,天线相关 int parsedLen = 0; //Antenna Description Messages switch (msgNumber) { case 1005: Message1005 Message1005 = Message1005.Parse(BinStringSequence.DeQueue(152)); break; case 1006: //测站参考点信息 Message1006 Message1006 = Message1006.Parse(BinStringSequence.DeQueue(168)); UpdateOFileHeader(Message1006); break; case 1007: Message1007 Message1007 = Message1007.Parse(data); parsedLen = 40 + (int)Message1007.DescriptorCounterN * 8; BinStringSequence.DeQueue(parsedLen); break; case 1008: Message1008 Message1008 = Message1008.Parse(data); parsedLen = 48 + (int)Message1008.DescriptorCounterN * 8 + (int)Message1008.SerialNumberCounterM * 8; BinStringSequence.DeQueue(parsedLen); break; case 1013: Message1013 Message1013 = Message1013.Parse(data); parsedLen = 70 + (int)Message1013.NoofMessageIDAnnouncementstoFollow_Nm * 29; BinStringSequence.DeQueue(parsedLen); break; case 1033: //天线信息 Message1033 Message1033 = Message1033.Parse(data); UpdateOFileHeader(Message1033); parsedLen = Message1033.Length; //parsedLen = 72 + // (Message1033.AntennaDescriptorCounterN // + Message1033.AntennaSerialNumberCounterM // + Message1033.ReceiverTypeDescriptorCounterI // + Message1033.ReceiverFirmwareVersionCounterJ // + Message1033.ReceiverSerialNumberCounterK // ) // * 8; BinStringSequence.DeQueue(parsedLen); break; } #endregion #region 1009 - 1012 Glonass 观测量相关 //Glonass if (msgNumber >= 1009 && msgNumber <= 1012) { var gpsHeaderData = BinStringSequence.DeQueue(61); GlonassMessageHeader RtcmHeader = GlonassMessageHeader.Parse(gpsHeaderData); GlonassEpochMessage EpochMessage = new GlonassEpochMessage { Header = new GlonassNormalHeader(RtcmHeader) }; //本地时间同步 Setting.ReceivingTimeOfNtripData = EpochMessage.Header.Time; for (int i = 0; i < RtcmHeader.MessageCount; i++) { switch (msgNumber) { case 1009: Message1009 Message1009 = Message1009.Parse(BinStringSequence.DeQueue(64)); break; case 1010: Message1010 Message1010 = Message1010.Parse(BinStringSequence.DeQueue(79)); break; case 1011: Message1011 Message1011 = Message1011.Parse(BinStringSequence.DeQueue(107)); break; case 1012: Message1012 Message1012 = Message1012.Parse(BinStringSequence.DeQueue(130)); GlonassNormalMessage1012 msg = new GlonassNormalMessage1012(RtcmHeader, Message1012); EpochMessage.Add(msg.Prn, msg); break; default: break; } } var EpochObservation = Rtcm3Converter.GetEpochObservation(EpochMessage); EpochObservation.Header = ObsHeader; EpochObservation.Name = SiteName; OnEpochObservationReceived(EpochObservation); } #endregion #region 1019、1020、1044-1046 各系统星历数据 #region message1019 GPS 星历数据 if (msgNumber == 1019) { Message1019 msg = Message1019.Parse(BinStringSequence.DeQueue(488)); var EphemerisObs = EphMessageConverter.GetEphemerisParam(msg); OnEphemerisInfoReceived(EphemerisObs); } #endregion #region message1020 GLONASS 星历数据 if (msgNumber == 1020) { Message1020 msg = Message1020.Parse(BinStringSequence.DeQueue(360)); RtcmEphMessageConverter EphMessageConverter = new RtcmEphMessageConverter(); var EphemerisObs = EphMessageConverter.GlonassNavRecord(msg); OnGlonassNavRecordReceived(EphemerisObs); } #endregion #region message63 BDS 星历数据 if (msgNumber == 63) { Message63 msg = Message63.Parse(BinStringSequence.DeQueue(511)); var EphemerisObs = EphMessageConverter.GetEphemerisParam(msg); OnEphemerisInfoReceived(EphemerisObs); } #endregion #region message1044 QZSS 星历数据 if (msgNumber == 1044) { Message1044 msg = Message1044.Parse(BinStringSequence.DeQueue(485)); var EphemerisObs = EphMessageConverter.GetEphemerisParam(msg); OnEphemerisInfoReceived(EphemerisObs); } #endregion #region message1045 Galileo 星历数据 if (msgNumber == 1045) { Message1045 msg = Message1045.Parse(BinStringSequence.DeQueue(496)); var EphemerisObs = EphMessageConverter.GetEphemerisParam(msg); OnEphemerisInfoReceived(EphemerisObs); } #endregion #endregion #region message1057 - 1062 GPS SSR SSRMessageConverter = new RtcmSSRMessageConverter(); if (msgNumber == 1057)//SSR GPS Orbit Correction { var SSRGpsOrbitHeaderData = BinStringSequence.DeQueue(68); SSRGpsHeader68 SSRGpsOrbitHeader = SSRGpsHeader68.Parse(SSRGpsOrbitHeaderData); Sp3Section Sp3Section = new Sp3Section(); for (int i = 0; i < SSRGpsOrbitHeader.NoofSatellite; i++) { var Sp3Record = new Ephemeris(); Message1057 Message1057 = Message1057.Parse(BinStringSequence.DeQueue(135)); Sp3Record = SSRMessageConverter.GetSp3Param(Message1057, SSRGpsOrbitHeader); Sp3Section.Add(Sp3Record.Prn, Sp3Record); Sp3Section.Time = Sp3Record.Time; } OnSSRSp3RecordReceived(Sp3Section); } if (msgNumber == 1058) { var SSRGpsClockCorrectionHeaderData = BinStringSequence.DeQueue(67); SSRGpsHeader67 SSRGpsClockCorrectionHeader = SSRGpsHeader67.Parse(SSRGpsClockCorrectionHeaderData); Sp3Section Sp3Section = new Sp3Section(); for (int i = 0; i < SSRGpsClockCorrectionHeader.NoofSatellite; i++) { Message1058 Message1058 = Message1058.Parse(BinStringSequence.DeQueue(76)); var Sp3Record = SSRMessageConverter.GetSp3Param(Message1058, SSRGpsClockCorrectionHeader); Sp3Section.Add(Sp3Record.Prn, (Ephemeris)Sp3Record); Sp3Section.Time = Sp3Record.Time; } OnSSRSp3RecordReceived(Sp3Section); } //if (Sp3Section.Count != 0 && msgNumber == 1058) if (msgNumber == 1059) { var SSRGpsSatelliteCodeBiasHeaderData = BinStringSequence.DeQueue(67); SSRGpsHeader67 SSRGpsSatelliteCodeBiasHeader = SSRGpsHeader67.Parse(SSRGpsSatelliteCodeBiasHeaderData); Message1059 Message1059 = Message1059.Parse(BinStringSequence.DeQueue(30)); } if (msgNumber == 1060) { var SSRGpsCombinedHeaderData = BinStringSequence.DeQueue(68); SSRGpsHeader68 SSRGpsCombinedHeader = SSRGpsHeader68.Parse(SSRGpsCombinedHeaderData); Sp3Section Sp3Section = new Sp3Section(); for (int i = 0; i < SSRGpsCombinedHeader.NoofSatellite; i++) { Message1060 Message1060 = Message1060.Parse(BinStringSequence.DeQueue(205)); NormalMessage1060 msg = new NormalMessage1060(Message1060); var Sp3Record = SSRMessageConverter.GetSp3Param(Message1060, SSRGpsCombinedHeader); Sp3Section.Add(Sp3Record.Prn, (Ephemeris)Sp3Record); Sp3Section.Time = Sp3Record.Time; } OnSSRSp3RecordReceived(Sp3Section); } if (msgNumber == 1061) { var SSRGpsURAHeaderData = BinStringSequence.DeQueue(67); SSRGpsHeader67 SSRGpsURAHeader = SSRGpsHeader67.Parse(SSRGpsURAHeaderData); Message1061 Message1061 = Message1061.Parse(BinStringSequence.DeQueue(12)); } if (msgNumber == 1062) { var SSRGpsHighRateClockHeaderData = BinStringSequence.DeQueue(67); SSRGpsHeader67 SSRGpsHighRateClockHeader = SSRGpsHeader67.Parse(SSRGpsHighRateClockHeaderData); Message1062 Message1062 = Message1062.Parse(BinStringSequence.DeQueue(28)); } #endregion #region message1063 - 1068 GLONASS SSR if (msgNumber == 1063)//SSR GLONASS Orbit Correction { var SSRGlonassOrbitHeaderData = BinStringSequence.DeQueue(65); SSRGlonassHeader65 SSRGlonassOrbitHeader = SSRGlonassHeader65.Parse(SSRGlonassOrbitHeaderData); Sp3Section Sp3Section = new Sp3Section(); for (int i = 0; i < SSRGlonassOrbitHeader.NoofSatellite; i++) { Message1063 Message1063 = Message1063.Parse(BinStringSequence.DeQueue(134)); var Sp3Record = SSRMessageConverter.GetSp3Param(Message1063, SSRGlonassOrbitHeader); Sp3Section.Add(Sp3Record.Prn, (Ephemeris)Sp3Record); Sp3Section.Time = Sp3Record.Time; } //OnSSRSp3RecordReceived(Sp3Section); } if (msgNumber == 1064) { var SSRGlonassClockCorrectionHeaderData = BinStringSequence.DeQueue(64); SSRGlonassHeader64 SSRGlonassClockCorrectionHeader = SSRGlonassHeader64.Parse(SSRGlonassClockCorrectionHeaderData); Sp3Section Sp3Section = new Sp3Section(); for (int i = 0; i < SSRGlonassClockCorrectionHeader.NoofSatellite; i++) { Message1064 Message1064 = Message1064.Parse(BinStringSequence.DeQueue(75)); var Sp3Record = SSRMessageConverter.GetSp3Param(Message1064, SSRGlonassClockCorrectionHeader); Sp3Section.Add(Sp3Record.Prn, (Ephemeris)Sp3Record); Sp3Section.Time = Sp3Record.Time; } //OnSSRSp3RecordReceived(Sp3Section); } if (msgNumber == 1065) { var SSRGlonassSatelliteCodeBiasHeaderData = BinStringSequence.DeQueue(64); SSRGlonassHeader64 SSRGlonassSatelliteCodeBiasHeader = SSRGlonassHeader64.Parse(SSRGlonassSatelliteCodeBiasHeaderData); for (int i = 0; i < SSRGlonassSatelliteCodeBiasHeader.NoofSatellite; i++) { Message1065 Message1065 = Message1065.Parse(BinStringSequence.DeQueue(30)); } } if (msgNumber == 1066) { var SSRGlonassCombinedHeaderData = BinStringSequence.DeQueue(65); SSRGlonassHeader65 SSRGlonassCombinedHeader = SSRGlonassHeader65.Parse(SSRGlonassCombinedHeaderData); Sp3Section Sp3Section = new Sp3Section(); for (int i = 0; i < SSRGlonassCombinedHeader.NoofSatellite; i++) { Message1066 Message1066 = Message1066.Parse(BinStringSequence.DeQueue(204)); var Sp3Record = SSRMessageConverter.GetSp3Param(Message1066, SSRGlonassCombinedHeader); Sp3Section.Add(Sp3Record.Prn, (Ephemeris)Sp3Record); Sp3Section.Time = Sp3Record.Time; } //OnSSRSp3RecordReceived(Sp3Section); } if (msgNumber == 1067) { var SSRGlonassURAHeaderData = BinStringSequence.DeQueue(64); SSRGlonassHeader64 SSRGlonassURAHeader = SSRGlonassHeader64.Parse(SSRGlonassURAHeaderData); for (int i = 0; i < SSRGlonassURAHeader.NoofSatellite; i++) { Message1067 Message1067 = Message1067.Parse(BinStringSequence.DeQueue(11)); } } if (msgNumber == 1068) { var SSRGlonassHighRateClockHeaderData = BinStringSequence.DeQueue(64); SSRGlonassHeader64 SSRGlonassHighRateClockHeader = SSRGlonassHeader64.Parse(SSRGlonassHighRateClockHeaderData); for (int i = 0; i < SSRGlonassHighRateClockHeader.NoofSatellite; i++) { Message1068 Message1068 = Message1068.Parse(BinStringSequence.DeQueue(27)); } } #endregion #region message1258 - 1263 BeiDou SSR //var Sp3Record = new Sp3Record(); SSRMessageConverter = new RtcmSSRMessageConverter(); if (msgNumber == 1258)//SSR BeiDou Orbit Correction { var SSRBeiDouOrbitHeaderData = BinStringSequence.DeQueue(68); SSRBeiDouHeader68 SSRBeiDouOrbitHeader = SSRBeiDouHeader68.Parse(SSRBeiDouOrbitHeaderData); Sp3Section Sp3Section = new Sp3Section(); for (int i = 0; i < SSRBeiDouOrbitHeader.NoofSatellite; i++) { Message1258 Message1258 = Message1258.Parse(BinStringSequence.DeQueue(161)); var Sp3Record = SSRMessageConverter.GetSp3Param(Message1258, SSRBeiDouOrbitHeader); Sp3Section.Add(Sp3Record.Prn, (Ephemeris)Sp3Record); Sp3Section.Time = Sp3Record.Time; } OnSSRSp3RecordReceived(Sp3Section); } if (msgNumber == 1259) { var SSRBeiDouClockCorrectionHeaderData = BinStringSequence.DeQueue(67); SSRBeiDouHeader67 SSRBeiDouClockCorrectionHeader = SSRBeiDouHeader67.Parse(SSRBeiDouClockCorrectionHeaderData); Sp3Section Sp3Section = new Sp3Section(); for (int i = 0; i < SSRBeiDouClockCorrectionHeader.NoofSatellite; i++) { Message1259 Message1259 = Message1259.Parse(BinStringSequence.DeQueue(76)); var Sp3Record = SSRMessageConverter.GetSp3Param(Message1259, SSRBeiDouClockCorrectionHeader); Sp3Section.Add(Sp3Record.Prn, (Ephemeris)Sp3Record); Sp3Section.Time = Sp3Record.Time; } OnSSRSp3RecordReceived(Sp3Section); } //if (Sp3Section.Count != 0 && msgNumber == 1058) if (msgNumber == 1260) { var SSRBeiDouSatelliteCodeBiasHeaderData = BinStringSequence.DeQueue(67); SSRBeiDouHeader67 SSRBeiDouSatelliteCodeBiasHeader = SSRBeiDouHeader67.Parse(SSRBeiDouSatelliteCodeBiasHeaderData); Message1260 Message1260 = Message1260.Parse(BinStringSequence.DeQueue(30)); } if (msgNumber == 1261) { var SSRBeiDouCombinedHeaderData = BinStringSequence.DeQueue(68); SSRBeiDouHeader68 SSRBeiDouCombinedHeader = SSRBeiDouHeader68.Parse(SSRBeiDouCombinedHeaderData); Sp3Section Sp3Section = new Sp3Section(); SSRMessage SSRMessage = new SSRMessage { }; for (int i = 0; i < SSRBeiDouCombinedHeader.NoofSatellite; i++) { Message1261 Message1261 = Message1261.Parse(BinStringSequence.DeQueue(231)); NormalMessage1261 msg = new NormalMessage1261(Message1261); var Sp3Record = SSRMessageConverter.GetSp3Param(Message1261, SSRBeiDouCombinedHeader); Sp3Section.Add(Sp3Record.Prn, (Ephemeris)Sp3Record); Sp3Section.Time = Sp3Record.Time; } OnSSRSp3RecordReceived(Sp3Section); } if (msgNumber == 1262) { var SSRBeiDouURAHeaderData = BinStringSequence.DeQueue(67); SSRBeiDouHeader67 SSRBeiDouURAHeader = SSRBeiDouHeader67.Parse(SSRBeiDouURAHeaderData); Message1262 Message1262 = Message1262.Parse(BinStringSequence.DeQueue(12)); } if (msgNumber == 1263) { var SSRBeiDouHighRateClockHeaderData = BinStringSequence.DeQueue(67); SSRBeiDouHeader67 SSRBeiDouHighRateClockHeader = SSRBeiDouHeader67.Parse(SSRBeiDouHighRateClockHeaderData); Message1263 Message1263 = Message1263.Parse(BinStringSequence.DeQueue(28)); } #endregion #region message1240 - 1245 Galileo SSR //var Sp3Record = new Sp3Record(); SSRMessageConverter = new RtcmSSRMessageConverter(); if (msgNumber == 1240)//SSR Galileo Orbit Correction { var SSRGalileoOrbitHeaderData = BinStringSequence.DeQueue(68); SSRGalileoHeader68 SSRGalileoOrbitHeader = SSRGalileoHeader68.Parse(SSRGalileoOrbitHeaderData); Sp3Section Sp3Section = new Sp3Section(); for (int i = 0; i < SSRGalileoOrbitHeader.NoofSatellite; i++) { Message1240 Message1240 = Message1240.Parse(BinStringSequence.DeQueue(137)); var Sp3Record = SSRMessageConverter.GetSp3Param(Message1240, SSRGalileoOrbitHeader); Sp3Section.Add(Sp3Record.Prn, (Ephemeris)Sp3Record); Sp3Section.Time = Sp3Record.Time; } OnSSRSp3RecordReceived(Sp3Section); } if (msgNumber == 1241) { var SSRGalileoClockCorrectionHeaderData = BinStringSequence.DeQueue(67); SSRGalileoHeader67 SSRGalileoClockCorrectionHeader = SSRGalileoHeader67.Parse(SSRGalileoClockCorrectionHeaderData); Sp3Section Sp3Section = new Sp3Section(); for (int i = 0; i < SSRGalileoClockCorrectionHeader.NoofSatellite; i++) { Message1241 Message1241 = Message1241.Parse(BinStringSequence.DeQueue(76)); var Sp3Record = SSRMessageConverter.GetSp3Param(Message1241, SSRGalileoClockCorrectionHeader); Sp3Section.Add(Sp3Record.Prn, (Ephemeris)Sp3Record); Sp3Section.Time = Sp3Record.Time; } OnSSRSp3RecordReceived(Sp3Section); } if (msgNumber == 1242) { var SSRGalileoSatelliteCodeBiasHeaderData = BinStringSequence.DeQueue(67); SSRGalileoHeader67 SSRGalileoSatelliteCodeBiasHeader = SSRGalileoHeader67.Parse(SSRGalileoSatelliteCodeBiasHeaderData); for (int i = 0; i < SSRGalileoSatelliteCodeBiasHeader.NoofSatellite; i++) { } Message1242 Message1242 = Message1242.Parse(BinStringSequence.DeQueue(30)); } if (msgNumber == 1243) { var SSRGalileoCombinedHeaderData = BinStringSequence.DeQueue(68); SSRGalileoHeader68 SSRGalileoCombinedHeader = SSRGalileoHeader68.Parse(SSRGalileoCombinedHeaderData); Sp3Section Sp3Section = new Sp3Section(); SSRMessage SSRMessage = new SSRMessage { }; for (int i = 0; i < SSRGalileoCombinedHeader.NoofSatellite; i++) { Message1243 Message1243 = Message1243.Parse(BinStringSequence.DeQueue(207)); NormalMessage1243 msg = new NormalMessage1243(Message1243); var Sp3Record = SSRMessageConverter.GetSp3Param(Message1243, SSRGalileoCombinedHeader); Sp3Section.Add(Sp3Record.Prn, (Ephemeris)Sp3Record); Sp3Section.Time = Sp3Record.Time; } OnSSRSp3RecordReceived(Sp3Section); } if (msgNumber == 1244) { var SSRGalileoURAHeaderData = BinStringSequence.DeQueue(67); SSRGalileoHeader67 SSRGalileoURAHeader = SSRGalileoHeader67.Parse(SSRGalileoURAHeaderData); Message1244 Message1244 = Message1244.Parse(BinStringSequence.DeQueue(12)); } if (msgNumber == 1245) { var SSRGalileoHighRateClockHeaderData = BinStringSequence.DeQueue(67); SSRGalileoHeader67 SSRGalileoHighRateClockHeader = SSRGalileoHeader67.Parse(SSRGalileoHighRateClockHeaderData); Message1245 Message1245 = Message1245.Parse(BinStringSequence.DeQueue(28)); } #endregion #region message1246 - 1251 QZSS SSR SSRMessageConverter = new RtcmSSRMessageConverter(); if (msgNumber == 1246)//SSR QZSS Orbit Correction { var SSRQZSSOrbitHeaderData = BinStringSequence.DeQueue(68); SSRQZSSHeader68 SSRQZSSOrbitHeader = SSRQZSSHeader68.Parse(SSRQZSSOrbitHeaderData); Sp3Section Sp3Section = new Sp3Section(); for (int i = 0; i < SSRQZSSOrbitHeader.NoofSatellite; i++) { Message1246 Message1246 = Message1246.Parse(BinStringSequence.DeQueue(133)); var Sp3Record = SSRMessageConverter.GetSp3Param(Message1246, SSRQZSSOrbitHeader); Sp3Section.Add(Sp3Record.Prn, (Ephemeris)Sp3Record); Sp3Section.Time = Sp3Record.Time; } OnSSRSp3RecordReceived(Sp3Section); } if (msgNumber == 1247) { var SSRQZSSClockCorrectionHeaderData = BinStringSequence.DeQueue(67); SSRQZSSHeader67 SSRQZSSClockCorrectionHeader = SSRQZSSHeader67.Parse(SSRQZSSClockCorrectionHeaderData); Sp3Section Sp3Section = new Sp3Section(); for (int i = 0; i < SSRQZSSClockCorrectionHeader.NoofSatellite; i++) { Message1247 Message1247 = Message1247.Parse(BinStringSequence.DeQueue(74)); var Sp3Record = SSRMessageConverter.GetSp3Param(Message1247, SSRQZSSClockCorrectionHeader); Sp3Section.Add(Sp3Record.Prn, (Ephemeris)Sp3Record); Sp3Section.Time = Sp3Record.Time; } OnSSRSp3RecordReceived(Sp3Section); } if (msgNumber == 1248) { var SSRQZSSSatelliteCodeBiasHeaderData = BinStringSequence.DeQueue(67); SSRQZSSHeader67 SSRQZSSSatelliteCodeBiasHeader = SSRQZSSHeader67.Parse(SSRQZSSSatelliteCodeBiasHeaderData); Message1248 Message1248 = Message1248.Parse(BinStringSequence.DeQueue(30)); } if (msgNumber == 1249) { var SSRQZSSCombinedHeaderData = BinStringSequence.DeQueue(68); SSRQZSSHeader68 SSRQZSSCombinedHeader = SSRQZSSHeader68.Parse(SSRQZSSCombinedHeaderData); SSRMessage SSRMessage = new SSRMessage { }; for (int i = 0; i < SSRQZSSCombinedHeader.NoofSatellite; i++) { Message1249 Message1249 = Message1249.Parse(BinStringSequence.DeQueue(203)); NormalMessage1249 msg = new NormalMessage1249(Message1249); } } if (msgNumber == 1250) { var SSRQZSSURAHeaderData = BinStringSequence.DeQueue(67); SSRQZSSHeader67 SSRQZSSURAHeader = SSRQZSSHeader67.Parse(SSRQZSSURAHeaderData); Message1250 Message1250 = Message1250.Parse(BinStringSequence.DeQueue(10)); } if (msgNumber == 1251) { var SSRQZSSHighRateClockHeaderData = BinStringSequence.DeQueue(67); SSRQZSSHeader67 SSRQZSSHighRateClockHeader = SSRQZSSHeader67.Parse(SSRQZSSHighRateClockHeaderData); Message1251 Message1251 = Message1251.Parse(BinStringSequence.DeQueue(26)); } #endregion #region message1252 - 1257 SBS SSR SSRMessageConverter = new RtcmSSRMessageConverter(); if (msgNumber == 1252)//SSR SBS Orbit Correction { var SSRSBSOrbitHeaderData = BinStringSequence.DeQueue(68); SSRSBSHeader68 SSRSBSOrbitHeader = SSRSBSHeader68.Parse(SSRSBSOrbitHeaderData); Sp3Section Sp3Section = new Sp3Section(); for (int i = 0; i < SSRSBSOrbitHeader.NoofSatellite; i++) { Message1252 Message1252 = Message1252.Parse(BinStringSequence.DeQueue(160)); var Sp3Record = SSRMessageConverter.GetSp3Param(Message1252, SSRSBSOrbitHeader); Sp3Section.Add(Sp3Record.Prn, (Ephemeris)Sp3Record); Sp3Section.Time = Sp3Record.Time; } OnSSRSp3RecordReceived(Sp3Section); } if (msgNumber == 1253) { var SSRSBSClockCorrectionHeaderData = BinStringSequence.DeQueue(67); SSRSBSHeader67 SSRSBSClockCorrectionHeader = SSRSBSHeader67.Parse(SSRSBSClockCorrectionHeaderData); Sp3Section Sp3Section = new Sp3Section(); for (int i = 0; i < SSRSBSClockCorrectionHeader.NoofSatellite; i++) { Message1253 Message1253 = Message1253.Parse(BinStringSequence.DeQueue(76)); var Sp3Record = SSRMessageConverter.GetSp3Param(Message1253, SSRSBSClockCorrectionHeader); Sp3Section.Add(Sp3Record.Prn, (Ephemeris)Sp3Record); Sp3Section.Time = Sp3Record.Time; } OnSSRSp3RecordReceived(Sp3Section); } //if (Sp3Section.Count != 0 && msgNumber == 1058) if (msgNumber == 1254) { var SSRSBSSatelliteCodeBiasHeaderData = BinStringSequence.DeQueue(67); SSRSBSHeader67 SSRSBSSatelliteCodeBiasHeader = SSRSBSHeader67.Parse(SSRSBSSatelliteCodeBiasHeaderData); Message1254 Message1254 = Message1254.Parse(BinStringSequence.DeQueue(30)); } if (msgNumber == 1255) { var SSRSBSCombinedHeaderData = BinStringSequence.DeQueue(68); SSRSBSHeader68 SSRSBSCombinedHeader = SSRSBSHeader68.Parse(SSRSBSCombinedHeaderData); Sp3Section Sp3Section = new Sp3Section(); SSRMessage SSRMessage = new SSRMessage() { }; for (int i = 0; i < SSRSBSCombinedHeader.NoofSatellite; i++) { Message1255 Message1255 = Message1255.Parse(BinStringSequence.DeQueue(230)); NormalMessage1255 msg = new NormalMessage1255(Message1255); var Sp3Record = SSRMessageConverter.GetSp3Param(Message1255, SSRSBSCombinedHeader); Sp3Section.Add(Sp3Record.Prn, (Ephemeris)Sp3Record); Sp3Section.Time = Sp3Record.Time; } OnSSRSp3RecordReceived(Sp3Section); } if (msgNumber == 1256) { var SSRSBSURAHeaderData = BinStringSequence.DeQueue(67); SSRSBSHeader67 SSRSBSURAHeader = SSRSBSHeader67.Parse(SSRSBSURAHeaderData); Message1256 Message1256 = Message1256.Parse(BinStringSequence.DeQueue(12)); } if (msgNumber == 1257) { var SSRSBSHighRateClockHeaderData = BinStringSequence.DeQueue(67); SSRSBSHeader67 SSRSBSHighRateClockHeader = SSRSBSHeader67.Parse(SSRSBSHighRateClockHeaderData); Message1257 Message1257 = Message1257.Parse(BinStringSequence.DeQueue(28)); } #endregion #region MSM if (msgNumber >= 1071 && msgNumber <= 1077)//(msgNumber >= 1071 && msgNumber <= 1127) { RinexEpochObservation RinexEpochObservation = null; RtcmMsmMessageConverter RtcmMsmMessageConverter = new Ntrip.RtcmMsmMessageConverter(ObsHeader); HeaderOfMSM headerOfMsm = HeaderOfMSM.Parse(data); HeaderOfMSM = headerOfMsm; BinStringSequence.DeQueue(headerOfMsm.Length); int msmtype = msgNumber % 10; int Nsat = headerOfMsm.SatCount; int Ncell = headerOfMsm.Ncell; switch (msmtype) { case 1: MSM1 MSM1 = MSM1.Parse(BinStringSequence.DeQueue(Nsat * 10 + Ncell * 15), Nsat, Ncell); RinexEpochObservation = RtcmMsmMessageConverter.GetRinexEpochObservation(MSM1, headerOfMsm); break; case 2: MSM2 MSM2 = MSM2.Parse(BinStringSequence.DeQueue(Nsat * 10 + Ncell * 27), Nsat, Ncell); RinexEpochObservation = RtcmMsmMessageConverter.GetRinexEpochObservation(MSM2, headerOfMsm); break; case 3: MSM3 MSM3 = MSM3.Parse(BinStringSequence.DeQueue(Nsat * 10 + Ncell * 42), Nsat, Ncell); RinexEpochObservation = RtcmMsmMessageConverter.GetRinexEpochObservation(MSM3, headerOfMsm); break; case 4: MSM4 MSM4 = MSM4.Parse(BinStringSequence.DeQueue(Nsat * 18 + Ncell * 48), Nsat, Ncell); RinexEpochObservation = RtcmMsmMessageConverter.GetRinexEpochObservation(MSM4, headerOfMsm); break; case 5: MSM5 MSM5 = MSM5.Parse(BinStringSequence.DeQueue(Nsat * 36 + Ncell * 63), Nsat, Ncell); RinexEpochObservation = RtcmMsmMessageConverter.GetRinexEpochObservation(MSM5, headerOfMsm); break; case 6: MSM6 MSM6 = MSM6.Parse(BinStringSequence.DeQueue(Nsat * 18 + Ncell * 65), Nsat, Ncell); RinexEpochObservation = RtcmMsmMessageConverter.GetRinexEpochObservation(MSM6, headerOfMsm); break; case 7: MSM7 MSM7 = MSM7.Parse(BinStringSequence.DeQueue(Nsat * 36 + Ncell * 80), Nsat, Ncell); RinexEpochObservation = RtcmMsmMessageConverter.GetRinexEpochObservation(MSM7, headerOfMsm); break; default: break; } RinexEpochObservation.Name = this.SiteName; RinexEpochObservation.Header = ObsHeader; OnEpochObservationReceived(RinexEpochObservation); } #endregion }
private void button_read_Click(object sender, EventArgs e) { bool fillWithZero = checkBox1.Checked; var directory = this.directorySelectionControl1.Path; Geo.Utils.FileUtil.CheckOrCreateDirectory(directory); string[] pathes = this.textBox_Pathes.Lines; var st1 = int.Parse(pathes[0].Substring(pathes[0].Length - 6, 2)); var st2 = int.Parse(pathes[1].Substring(pathes[0].Length - 6, 2)); #region 照多个文件进行合并输出 if (st2 - st1 != 0) { sp3ofPredicted = new Sp3File(); sp3Observation = new Sp3File(); int indexOfFile = 1; int dayOfweekO = 0; int dayOfweekP = 0; foreach (var pathItem in pathes) { Sp3AllReader r = new Sp3AllReader(pathItem); Sp3AllReader rP = new Sp3AllReader(pathItem); sp3 = r.ReadAll(); sp3P = rP.ReadAll(); var intervalSec = sp3.Header.EpochInterval; Time end1 = sp3.TimePeriod.Start + (st2 - st1) * 3600 - intervalSec; Time end = sp3.TimePeriod.Start + (st2 - st1 + 24) * 3600 - intervalSec; Time startOfPredicted = sp3.TimePeriod.Start + 24 * 3600 - intervalSec; foreach (Sp3Section sec in sp3) { Sp3Section s = new Sp3Section(); foreach (var rec in sec) { s.Time = rec.Time; s.Add(rec.Prn, rec); } if (sec.Time <= end1) { sp3Observation.Add(s); } else if (sec.Time <= end && sec.Time > startOfPredicted) { sp3ofPredicted.Add(s); } } if (indexOfFile % (24 / (st2 - st1)) == 1) { sp3Observation.Header = sp3.Header; sp3ofPredicted.Header = sp3P.Header; sp3ofPredicted.Header.StartTime = sp3P.Header.StartTime + 24 * 3600; dayOfweekO = sp3Observation.Header.StartTime.GetGpsWeekAndDay(); if (dayOfweekO % 10 == 6) { dayOfweekP = dayOfweekO + 4; sp3ofPredicted.Header.GPSWeek += 1; } else { dayOfweekP = dayOfweekO + 1; } } if (indexOfFile % (24 / (st2 - st1)) == 0) { sp3Observation.Header.Comments.Add("Processd by Gnsser"); sp3Observation.Header.Comments.Add("Choose IGU-O from igu"); sp3ofPredicted.Header.Comments.Add("Processd by Gnsser"); sp3ofPredicted.Header.Comments.Add("Choose IGU-P from igu"); var pathObservation = Path.Combine(directory, "IGU-O" + dayOfweekO.ToString() + ".sp3"); var pathPredicted = Path.Combine(directory, "IGU-P" + dayOfweekP.ToString() + ".sp3"); sp3Observation.Header.NumberOfEpochs = sp3Observation.Count; sp3ofPredicted.Header.NumberOfEpochs = sp3ofPredicted.Count; Sp3Writer Sp3WriterObservation = new Sp3Writer(pathObservation, sp3Observation); Sp3Writer Sp3WriterPredicted = new Sp3Writer(pathPredicted, sp3ofPredicted); Sp3WriterObservation.SaveToFile(); Sp3WriterPredicted.SaveToFile(); sp3Observation.Clear(); sp3ofPredicted.Clear(); } sp3.Clear(); indexOfFile++; } } #endregion #region 照单个文件进行输出,不合并 else { foreach (var pathItem in pathes) { Sp3Reader r = new Sp3Reader(pathItem); sp3 = r.ReadAll(); var intervalSec = sp3.Header.EpochInterval; sp3Observation = new Sp3File(); sp3Observation.Header = sp3.Header; sp3ofPredicted = new Sp3File(); sp3ofPredicted.Header = sp3.Header; Time end1 = sp3.TimePeriod.Start + 24 * 3600 - intervalSec; Time end = sp3.TimePeriod.End; foreach (Sp3Section sec in sp3) { Sp3Section s = new Sp3Section(); foreach (var rec in sec) { s.Time = rec.Time; s.Add(rec.Prn, rec); } if (sec.Time < end1) { sp3Observation.Add(s); } else { sp3ofPredicted.Add(s); } } sp3Observation.Header.Comments.Add("Processd by Gnsser"); sp3Observation.Header.Comments.Add("Choose IGU-O from igu"); sp3ofPredicted.Header.Comments.Add("Processd by Gnsser"); sp3ofPredicted.Header.Comments.Add("Choose IGU-P from igu"); var pathObservation = Path.Combine(directory, "IGU-O-Basedon" + r.Name); var pathPredicted = Path.Combine(directory, "IGU-P-Basedon" + r.Name); Sp3Writer Sp3WriterObservation = new Sp3Writer(pathObservation, sp3Observation); Sp3Writer Sp3WriterPredicted = new Sp3Writer(pathPredicted, sp3ofPredicted); Sp3WriterObservation.SaveToFile(); Sp3WriterPredicted.SaveToFile(); sp3.Clear(); } } #endregion Geo.Utils.FileUtil.OpenDirectory(directory); }