Exemple #1
0
        private void button_smoothRange_Click(object sender, EventArgs e)
        {
            CheckAndReadObsFile();
            bool isDualFreIonFree = checkBox_ionoFree.Checked;

            int             smoothWindow            = this.namedIntControl_smoothWindow.GetValue();
            SatelliteNumber prn                     = (SatelliteNumber)this.bindingSource_sat.Current;
            var             PhaseSmoothRangeBulider = new NamedCarrierSmoothedRangeBuilderManager(checkBox_isApproved.Checked, smoothWindow, true, IonoDifferCorrectionType.DualFreqCarrier);

            List <TimedRinexSatObsData> records = ObsFile.GetEpochTimedObservations(prn);

            if (isDualFreIonFree)
            {
                if (ObsFile.Header.ObsInfo.GetFrequenceCount() <= 1)
                {
                    Geo.Utils.FormUtil.ShowWarningMessageBox("只有一个频率,无法实现无电离层组合!");
                    return;
                }

                DualFreqPhaseSmoothRange(prn, PhaseSmoothRangeBulider);
            }
            else
            {
                SingleFreqPhaseSmoothRange(prn, PhaseSmoothRangeBulider, records);
            }
        }
Exemple #2
0
        /// <summary>
        /// 针对某一个卫星绘制
        /// </summary>
        /// <param name="prn"></param>
        /// <returns></returns>
        private ObjectTableStorage BuildObjectTable(SatelliteNumber prn)
        {
            bool isCarrierInLen = checkBox_carrrierInLen.Checked;
            bool isShowL1Only   = checkBox_showL1Only.Checked;
            List <TimedRinexSatObsData> records = ObsFile.GetEpochTimedObservations(prn);
            ObjectTableStorage          table   = new ObjectTableStorage();

            foreach (var record in records)
            {
                table.NewRow();
                table.AddItem("Epoch", record.Time);
                foreach (var item in record.SatObsData)
                {
                    if (isShowL1Only && !item.Key.Contains("1"))
                    {
                        continue;
                    }
                    if (isCarrierInLen && item.Key.Contains("L1"))
                    {
                        var freq = Frequence.GetFrequence(prn, FrequenceType.A, record.Time);
                        table.AddItem(item.Key, item.Value.Value * freq.WaveLength);
                    }
                    else if (isCarrierInLen && item.Key.Contains("L2"))
                    {
                        var freq = Frequence.GetFrequence(prn, FrequenceType.B, record.Time);
                        table.AddItem(item.Key, item.Value.Value * freq.WaveLength);
                    }
                    else
                    {
                        table.AddItem(item.Key, item.Value.Value);
                    }
                }
            }
            return(table);
        }
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="table"></param>
        /// <param name="filePath"></param>
        /// <param name="isTempPath">是否是临时路径,如果是,则不进行提示</param>
        /// <param name="enableDelete"></param>
        public ObsFileChartEditForm(string filePath, bool isTempPath = false, bool isSort = false, bool isDrawAll = false, bool enableDelete = false)
        {
            InitializeComponent();
            this.isDrawAll = isDrawAll;
            this.ObsFile   = RinexObsFileReader.Read(filePath);

            this.Text  = ObsFile.Header.FileName;
            this.Table = ObsFile.BuildObjectTable(isDrawAll);
            if (isSort)
            {
                Table.ParamNames.Sort();
            }
            this.ObsFilePath = filePath;
            this.chartControl1.EnableDelete = enableDelete;
            this.ObsFile = ObsFile;
            if (enableDelete)
            {
                if (!isTempPath)
                {
                    Geo.Utils.FormUtil.ShowWarningMessageBox("请注意,所做修改将直接替换原文件!注意备份。\r\n" + filePath);
                }
                this.chartControl1.DataDeleting += ChartControl1_DataDeleting;
            }

            Draw(Table);
        }
Exemple #4
0
        /// <summary>
        /// 读取数据
        /// </summary>
        private void ReadFile()
        {
            string lastChar  = Geo.Utils.StringUtil.GetLastChar(ObsPath);
            string lastChar3 = Geo.Utils.StringUtil.GetLastChar(ObsPath, 3);
            string lastChar5 = Geo.Utils.StringUtil.GetLastChar(ObsPath, 5);

            if (String.Equals(lastChar, "o", StringComparison.CurrentCultureIgnoreCase) || String.Equals(lastChar3, "rnx", StringComparison.CurrentCultureIgnoreCase))
            {
                obsFileReader = new RinexObsFileReader(ObsPath);
                ObsFile       = obsFileReader.ReadObsFile();
            }

            if (String.Equals(lastChar, "z", StringComparison.CurrentCultureIgnoreCase) ||
                String.Equals(lastChar3, "crx", StringComparison.CurrentCultureIgnoreCase) ||
                String.Equals(lastChar5, "crx.gz", StringComparison.CurrentCultureIgnoreCase)
                )
            {
                Geo.IO.InputFileManager inputFileManager = new Geo.IO.InputFileManager(Setting.TempDirectory);
                this.ObsPath  = inputFileManager.GetLocalFilePath(ObsPath, "*.*o;*.rnx", "*.*");
                obsFileReader = new RinexObsFileReader(ObsPath);
                ObsFile       = obsFileReader.ReadObsFile();
            }

            if (String.Equals(lastChar, "s", StringComparison.CurrentCultureIgnoreCase))
            {
                ObsFile = new TableObsFileReader(ObsPath).Read();
            }
            if (ObsFile == null)
            {
                Geo.Utils.FormUtil.ShowWarningMessageBox("不支持输入文件格式!");
                return;
            }

            this.bindingSource_obsInfo.DataSource = ObsFile;
            var prns = ObsFile.GetPrns();

            prns.Sort();
            this.bindingSource_sat.DataSource = prns;

            this.attributeBox1.DataGridView.DataSource = Geo.Utils.ObjectUtil.GetAttributes(ObsFile.Header, false);

            string msg = "";

            msg += "首次观测时间:" + ObsFile.Header.StartTime + "\r\n";
            msg += "最后观测时间:" + ObsFile.Header.EndTime + "\r\n";
            msg += "采样间隔:" + ObsFile.Header.Interval + " 秒" + "\r\n";

            this.textBox_show.Text = msg;
        }
        /// <summary>
        /// 单系统的观测数据
        /// </summary>
        /// <param name="obj"></param>
        protected override void dataProvider_EpochObservationReceived(RinexEpochObservation obj)
        {
            if (obj == null || obj.Count == 0 || obj.Prns[0].SatelliteType != SatelliteType.G)
            {
                return;
            }
            ObsFile.Add(obj);
            currentTime = obj.ReceiverTime;
            RTSp3InfoCorrected(obj);

            if (NavFile.Count != 0)
            {
                CheckAndPosition(obj);
            }
        }
Exemple #6
0
        /// <summary>
        /// 针对某一个卫星绘制
        /// </summary>
        /// <param name="prn"></param>
        /// <returns></returns>
        private ObjectTableStorage BuildObjectTable(SatelliteNumber prn)
        {
            List <TimedRinexSatObsData> records = ObsFile.GetEpochTimedObservations(prn);
            ObjectTableStorage          table   = new ObjectTableStorage();

            foreach (var record in records)
            {
                table.NewRow();
                table.AddItem("Epoch", record.Time);
                foreach (var item in record.SatObsData)
                {
                    table.AddItem(item.Key, item.Value.Value);
                }
            }
            return(table);
        }
        private void ChartControl1_DataDeleting(Dictionary <string, IntSegment> obj)
        {
            var segment    = obj.First().Value;
            var indexes    = Table.GetIndexValues <Time>();
            var startEpoch = indexes[segment.Start];
            var endEpoch   = indexes[segment.End];
            var timeperiod = new TimePeriod(startEpoch, endEpoch);

            var prns = new List <SatelliteNumber>();

            foreach (var kv in obj)
            {
                prns.Add(SatelliteNumber.Parse(kv.Key));
            }

            ObsFile.Remove(prns, timeperiod);

            RinexObsFileWriter.Write(ObsFile, ObsFilePath);

            this.ObsFile = RinexObsFileReader.Read(ObsFilePath);
            this.Table   = ObsFile.BuildObjectTable(isDrawAll);

            Draw(Table);
        }
Exemple #8
0
        /// <summary>
        /// 读取数据
        /// </summary>
        private void ReadFile()
        {
            ObsFile = ObsFileUtil.ReadFile(ObsPath);

            if (ObsFile == null)
            {
                Geo.Utils.FormUtil.ShowWarningMessageBox("不支持输入文件格式!");
                return;
            }

            this.bindingSource_obsInfo.DataSource = ObsFile;
            var prns = ObsFile.GetPrns();

            prns.Sort();
            this.bindingSource_sat.DataSource = prns;

            this.attributeBox1.DataGridView.DataSource = Geo.Utils.ObjectUtil.GetAttributes(ObsFile.Header, false);

            string msg = "";

            msg += "首次观测时间:" + ObsFile.Header.StartTime + "\r\n";
            msg += "最后观测时间:" + ObsFile.Header.EndTime + "\r\n";
            msg += "采样间隔:" + ObsFile.Header.Interval + " 秒" + "\r\n";

            this.textBox_show.Text = msg;


            Data.Rinex.RinexObsFile ObsFile1 = ObsFileUtil.ReadFile(ObsPath);
            var observations = new MemoRinexFileObsDataSource(ObsFile1);

            foreach (var epochInfo in observations)
            {
                int a = 1;
                int b = 2;
            }
        }
Exemple #9
0
        private void button_smoothCurrent_Click(object sender, EventArgs e)
        {
            EnableRunButton(false);

            CheckAndReadObsFile();



            ObjectTableManager tableObjectStorages;
            ObjectTableStorage IonoFitTable;

            tableObjectStorages = new ObjectTableManager(Setting.TempDirectory);
            IonoFitTable        = tableObjectStorages.AddTable("IonoFit");



            DateTime start      = DateTime.Now;
            int      bufferSize = namedIntControl_bufferCount.GetValue();
            bool     isShowPoly = checkBox_showPoly.Checked;

            PhaseSmoothRangeBulider = BuildPhaseSmoothRangeBulider();
            int smoothWindow = this.namedIntControl_smoothWindow.GetValue();

            double          cutOff       = namedFloatControl_satCutoff.GetValue();
            bool            isShowL1Only = checkBox_isShowL1Only.Checked;
            SatelliteNumber prn          = (SatelliteNumber)this.bindingSource_sat.Current;

            GlobalIgsGridIonoService    ionoService      = GlobalIgsGridIonoService.Instance;
            GlobalIgsGridIonoDcbService ionoDcbService   = GlobalIgsGridIonoDcbService.Instance;
            GlobalIgsEphemerisService   ephemerisService = GlobalIgsEphemerisService.Instance;

            var TimedSmoothValueBuilderManager = new TimedSmoothValueBuilderManager(smoothWindow);

            List <TimedRinexSatObsData> records = ObsFile.GetEpochTimedObservations(prn);
            ObjectTableStorage          table   = new ObjectTableStorage(prn + "_平滑伪距");

            var firtTime = records[0].Time;

            double P1_P2sat = ionoDcbService.GetDcb(firtTime, prn).Value *GnssConst.MeterPerNano;

            double P1_P2recMeter = ionoDcbService.GetDcbMeterForP1(firtTime, Path.GetFileName(ObsPath).Substring(0, 4).ToLower());
            var    siteXyz       = ObsFile.Header.ApproxXyz;

            double prevIonoAmbiDcb             = 0;
            double prevIonoAmbiDcbL2           = 0;
            RinexFreqObsBuilder FreqObsBuilder = new RinexFreqObsBuilder();
            var epochSatBuilder = new RinexEpochSatBuilder(FreqObsBuilder);

            progressBarComponent1.InitProcess(records.Count);

            BufferedStreamService <TimedRinexSatObsData> bufferStream = new BufferedStreamService <TimedRinexSatObsData>(records, bufferSize);

            bufferStream.MaterialInputted += BufferStream_MaterialInputted;
            foreach (var record in bufferStream)
            {
                if (record == null)
                {
                    continue;
                }

                progressBarComponent1.PerformProcessStep();

                var time = record.Time;
                var data = record.SatObsData;


                var eph = ephemerisService.Get(prn, time);
                if (eph == null)
                {
                    continue;
                }

                var satXyz = eph.XYZ;

                var polar = Geo.Coordinates.CoordTransformer.XyzToGeoPolar(satXyz, siteXyz, AngleUnit.Degree);
                if (polar.Elevation < cutOff)
                {
                    continue;
                }



                var waveLenL1 = Frequence.GetFrequence(prn, FrequenceType.A, time).WaveLength;
                var waveLenL2 = Frequence.GetFrequence(prn, FrequenceType.B, time).WaveLength;

                double L1 = data.PhaseA.Value * waveLenL1;
                double P1 = data.RangeA.Value;
                double L2 = data.PhaseB != null ? record.SatObsData.PhaseB.Value * waveLenL2 : 0;
                double P2 = data.RangeB != null ? record.SatObsData.RangeB.Value : 0;

                //扩展
                var sat = epochSatBuilder.SetPrn(record.SatObsData.Prn).Build(record.SatObsData);

                //  get => (this.FrequenceA.PhaseRange.Value - this.FrequenceB.PhaseRange.Value) * Frequence.GetIonoAndDcbCoeffL1L2(this.Prn.SatelliteType);

                //double differIonoL1 = 0;
                //double differIonoL2 = 0;
                //if (prevIonoAmbiDcb == 0)
                //{
                //    prevIonoAmbiDcb = sat.IonoLenOfL1ByDifferL1L2;
                //    prevIonoAmbiDcbL2 = sat.IonoLenOfL2ByDifferL1L2;
                //}
                //differIonoL1 = sat.IonoLenOfL1ByDifferL1L2 - prevIonoAmbiDcb;
                //differIonoL1 = sat.IonoLenOfL1ByDifferL1L2 - prevIonoAmbiDcb;
                // L1 = L1 + 2 * differIono;

                #region  载波相位平滑伪距
                var smootherP1 = PhaseSmoothRangeBulider.GetOrCreate("P1");
                var smootherP2 = PhaseSmoothRangeBulider.GetOrCreate("P2");

                var P1s = smootherP1
                          .SetReset(data.PhaseA.IsLossLock)
                          .SetRawValue(record.Time, P1, L1, sat.IonoLenOfL1ByDifferL1L2)
                          .Build().Value;
                IonoFitTable.NewRow();
                IonoFitTable.AddItem("Epoch", time);
                IonoFitTable.AddItem("FittedIonoAndAmbiValue", smootherP1.CurrentRaw.FittedIonoAndAmbiValue);
                //var test = TestSmoothRangeBuilder.GetOrCreate("Test")
                //    .SetReset(data.PhaseA.IsLossLock)
                //    .SetRawValue(record.Time, P1, L1)
                //    .Build().Value;

                //var differ = test - P1s;
                //int iii = 0;

                var P2s = 0.0;
                if (!isShowL1Only)
                {
                    P2s = smootherP2
                          .SetReset(data.PhaseB.IsLossLock)
                          .SetRawValue(record.Time, P2, L2, sat.IonoLenOfL2ByDifferL1L2)
                          .Build().Value;
                }
                #endregion

                //二次多项式平滑比较
                var    lsSP1Smoother = TimedSmoothValueBuilderManager.GetOrCreate("P1");
                var    lsSP2Smoother = TimedSmoothValueBuilderManager.GetOrCreate("P2");
                double lsSP1 = 0, lsSP2 = 0;
                if (isShowPoly)
                {
                    foreach (var item in bufferStream.MaterialBuffers)
                    {
                        lsSP1Smoother.SetRawValue(item.Time, item.SatObsData.RangeA.Value);
                        lsSP2Smoother.SetRawValue(item.Time, item.SatObsData.RangeB.Value);
                    }

                    if (data.PhaseA.IsLossLock)
                    {
                        lsSP1 = P1;
                        lsSP1Smoother.SetReset(data.PhaseA.IsLossLock);
                    }
                    else
                    {
                        lsSP1 = lsSP1Smoother.SetReset(data.PhaseA.IsLossLock)
                                .SetRawValue(time, P1)
                                .SetSmoothTime(time)
                                .Build();
                    }
                    if (data.PhaseB.IsLossLock)
                    {
                        lsSP2 = P2;
                        lsSP2Smoother.SetReset(data.PhaseB.IsLossLock);
                    }
                    else
                    {
                        lsSP2 = lsSP2Smoother.SetReset(data.PhaseB.IsLossLock)
                                .SetRawValue(time, P2)
                                .SetSmoothTime(time)
                                .Build();
                    }
                }


                table.NewRow();
                table.AddItem("Epoch", record.Time);

                //table.AddItem("L1", L1);
                //table.AddItem("L2", L2);
                table.AddItem("P1", P1);
                if (!isShowL1Only)
                {
                    table.AddItem("P2", P2);
                }
                table.AddItem("P1S", P1s);
                if (!isShowL1Only && isShowPoly)
                {
                    table.AddItem("P2S", P2s);
                }

                if (isShowPoly)
                {
                    table.AddItem("LsP1S", lsSP1);
                }
                if (!isShowL1Only)
                {
                    table.AddItem("LsP2S", lsSP2);
                }
            }
            progressBarComponent1.Full();

            BindDataSource(table);

            EnableRunButton(true);

            Geo.Winform.TableObjectViewForm form = new Geo.Winform.TableObjectViewForm(IonoFitTable);
            form.Show();

            // tableObjectStorages.WriteAllToFileAndClearBuffer();

            var span = DateTime.Now - start;// = DateTime.Now;
            log.Info("计算完毕,耗时 : " + span);
        }
 /// <summary>
 /// 释放资源
 /// </summary>
 public override void Dispose()
 {
     ObsFile.Dispose();
 }
Exemple #11
0
        private void button_calculate_Click(object sender, EventArgs e)
        {
            CheckAndReadObsFile();
            double          cutOff = namedFloatControl_satCutoff.GetValue();
            SatelliteNumber prn    = (SatelliteNumber)this.bindingSource_sat.Current;

            var F1 = Frequence.GetFrequence(prn, 1);
            var F2 = Frequence.GetFrequence(prn, 2);

            var f1 = F1.Value * 1e6;//恢复单位
            var f2 = F2.Value * 1e6;

            double f1f1 = f1 * f1;
            double f2f2 = f2 * f2;

            double a = -40.28 * (f2f2 - f1f1) / (f1f1 * f2f2);

            int smoothWindow = this.namedIntControl_smoothWindow.GetValue();

            GlobalIgsGridIonoService    ionoService      = GlobalIgsGridIonoService.Instance;
            GlobalIgsGridIonoDcbService ionoDcbService   = GlobalIgsGridIonoDcbService.Instance;
            GlobalIgsEphemerisService   ephemerisService = GlobalIgsEphemerisService.Instance;


            var PhaseSmoothRangeBulider = new NamedCarrierSmoothedRangeBuilderManager(true, smoothWindow, true, IonoDifferCorrectionType.DualFreqCarrier);

            List <TimedRinexSatObsData> records = ObsFile.GetEpochTimedObservations(prn);
            ObjectTableStorage          table   = new ObjectTableStorage(prn + "_硬件延迟");

            var firtTime = records[0].Time;

            double P1_P2sat = ionoDcbService.GetDcb(firtTime, prn).Value *GnssConst.MeterPerNano;

            double P1_P2recMeter = ionoDcbService.GetDcbMeterForP1(firtTime, Path.GetFileName(ObsPath).Substring(0, 4).ToLower());
            var    siteXyz       = ObsFile.Header.ApproxXyz;

            progressBarComponent1.InitProcess(records.Count);
            foreach (var record in records)
            {
                progressBarComponent1.PerformProcessStep();

                var time = record.Time;
                var data = record.SatObsData;

                var waveLenL1 = Frequence.GetFrequenceA(prn, time).WaveLength;
                var waveLenL2 = Frequence.GetFrequenceB(prn, time).WaveLength;


                double L1 = data.PhaseA.Value * waveLenL1;
                double P1 = data.RangeA.Value;
                double L2 = data.PhaseB != null ? record.SatObsData.PhaseB.Value * waveLenL2 : 0;
                double P2 = data.RangeB != null ? record.SatObsData.RangeB.Value : 0;


                var smootherP1 = PhaseSmoothRangeBulider.GetOrCreate("P1");
                var smootherP2 = PhaseSmoothRangeBulider.GetOrCreate("P2");

                var P1s = smootherP1
                          .SetReset(data.PhaseA.IsLossLock)
                          .SetRawValue(record.Time, P1, L1, 0)
                          .Build();
                var P2s = smootherP2
                          .SetReset(data.PhaseB.IsLossLock)
                          .SetRawValue(record.Time, P2, L2, 0)
                          .Build();
                //var smNew = smoother.GetSmoothedRange();

                var eph = ephemerisService.Get(prn, time);
                if (eph == null)
                {
                    continue;
                }

                var satXyz = eph.XYZ;

                var polar = Geo.Coordinates.CoordTransformer.XyzToGeoPolar(satXyz, siteXyz, AngleUnit.Degree);
                if (polar.Elevation < cutOff)
                {
                    continue;
                }


                var    cTEC       = ionoService.GetSlope(time, siteXyz, satXyz);
                double ionoRange  = a * cTEC.Value * 1e16; // 单位是1e16
                double rawDifferP = P1 - P2;
                double smDifferP  = P1s.Value - P2s.Value;

                //电离层倾斜延迟
                double ionoP1         = ionoService.GetSlopeDelayRange(time, siteXyz, satXyz, F1.Value);
                double ionoP2         = ionoService.GetSlopeDelayRange(time, siteXyz, satXyz, F2.Value);
                double rawDifferIonoP = ionoP1 - ionoP2;

                var rawRecDcb = rawDifferP - P1_P2sat - rawDifferIonoP;
                var smRecDcb  = smDifferP - P1_P2sat - rawDifferIonoP;


                table.NewRow();
                table.AddItem("Epoch", record.Time);
                //table.AddItem("L1", L1);
                //table.AddItem("L2", L2);
                //table.AddItem("P1", P1);
                //table.AddItem("P2", P2);
                //table.AddItem("P1S", P1s);
                //table.AddItem("P2S", P2s);
                table.AddItem("P1-P2", rawDifferP);
                table.AddItem("SmP1-P2", smDifferP);
                table.AddItem("IonoDiffer", rawDifferIonoP);
                table.AddItem("SatDcb", P1_P2sat);
                //table.AddItem("P1-P2_rec", P1_P2recMeter);
                table.AddItem("RawRecDcb", rawRecDcb);
                table.AddItem("SmRecDcb", smRecDcb);
            }
            progressBarComponent1.Full();

            BindDataSource(table);
        }