Example #1
0
        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);
        }
Example #4
0
        /// <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;
        }
Example #5
0
        /// <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);
        }
Example #7
0
 protected virtual void dataProvider_SSRSp3RecordReceived(Sp3Section obj)
 {
 }
Example #8
0
 public void WriteSp3Record(Sp3Section obj)
 {
     Sp3Writer.Write(obj);
     Sp3Writer.Flush();
 }
Example #9
0
 protected override void dataProvider_SSRSp3RecordReceived(Sp3Section obj)
 {
     this.WriteSp3Record(obj);
 }
Example #10
0
        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\\");
        }
Example #11
0
        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);
        }
Example #12
0
        /// <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);
        }