Beispiel #1
0
        /// <summary>
        /// 获取模糊度参数估计结果。单位为周,权逆阵单位依然为米。
        /// </summary>
        /// <returns></returns>
        public WeightedVector GetFixableVectorInUnit00()
        {
            this.ResultMatrix.Estimated.ParamNames = this.ResultMatrix.ParamNames;
            //更新模糊度。
            Frequence Frequence = Frequence.GetFrequence(this.BasePrn, Option.ObsDataType, this.Material.ReceiverTime);
            //Lamdba方法计算模糊度
            var ambiParamNames = new List <string>();

            foreach (var name in ResultMatrix.ParamNames)
            {
                if (HasUnstablePrn(name))
                {
                    continue;
                }

                if (name.Contains(Gnsser.ParamNames.DoubleDifferAmbiguity))
                {
                    ambiParamNames.Add(name);
                }
            }
            var estVector     = this.ResultMatrix.Estimated.GetWeightedVector(ambiParamNames);
            var vectorInCycle = estVector * (1.0 / Frequence.WaveLength);

            return(vectorInCycle);
        }
Beispiel #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);
        }
        public void Init()
        {
            /// 第一频率
            Frequence f1 = Frequence.GetFrequence(BasePrn.SatelliteType, 1);
            /// 第二频率
            Frequence f2 = Frequence.GetFrequence(BasePrn.SatelliteType, 2);

            this.FloatAmbiguityL1CycleMultiFactor = (f1.Value + f2.Value) / f1.Value;
            this.FloatAmbiguityLenMultiFactor     = (f1.Value + f2.Value) * 1e6 / GnssConst.LIGHT_SPEED;
            this.WideLaneMultiFactor = f2.Value / (f1.Value - f2.Value);
        }
Beispiel #4
0
        private void BufferStream_MaterialInputted(TimedRinexSatObsData record)
        {
            SatelliteNumber prn        = (SatelliteNumber)this.bindingSource_sat.Current;
            var             smootherP1 = PhaseSmoothRangeBulider.GetOrCreate("P1");

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

            var waveLenL1 = Frequence.GetFrequence(prn.SatelliteType, 1).WaveLength;
            var waveLenL2 = Frequence.GetFrequence(prn.SatelliteType, 2).WaveLength;

            double L1 = data.PhaseA.Value * waveLenL1;
            double P1 = data.RangeA.Value;

            smootherP1.SetBufferValue(record.Time, P1, L1);
        }
        /// <summary>
        /// 双差差分定位结果。具有模糊度。
        /// </summary>
        /// <param name="epochInfo">历元观测信息</param>
        /// <param name="PointPositionType">单点定位类型</param>
        public EpochDouFreDoubleDifferPositionResult(
            MultiSiteEpochInfo receiverInfo,
            AdjustResultMatrix Adjustment,
            GnssParamNameBuilder positioner,
            SatelliteNumber baseSatPrn,
            int baseParamCount = 5
            )
            : base(receiverInfo, Adjustment, positioner)
        {
            this.BasePrn = baseSatPrn;
            int index = Adjustment.GetIndexOf(Gnsser.ParamNames.WetTropZpd);

            if (index != -1)
            {
                this.WetTropoFactor = this.ResultMatrix.Corrected.CorrectedValue[Adjustment.GetIndexOf(Gnsser.ParamNames.WetTropZpd)];
            }
            else
            {
                this.WetTropoFactor = 0.0;
            }
            //处理模糊度
            this.AmbiguityDic = new Dictionary <SatNumberAndFrequence, double>();

            Vector vector = Adjustment.Corrected.CorrectedValue;

            int satIndex = 0;

            foreach (var item in receiverInfo.EnabledPrns)
            {
                if (item != BasePrn)
                {
                    Frequence             FrequenceA = Frequence.GetFrequence(this.BasePrn, SatObsDataType.PhaseRangeA, receiverInfo.ReceiverTime);
                    Frequence             FrequenceB = Frequence.GetFrequence(this.BasePrn, SatObsDataType.PhaseRangeB, receiverInfo.ReceiverTime);
                    SatNumberAndFrequence satA       = new SatNumberAndFrequence();
                    satA.SatNumber = item; satA.Frequence = FrequenceA;
                    SatNumberAndFrequence satB = new SatNumberAndFrequence();
                    satB.SatNumber = item; satB.Frequence = FrequenceB;
                    double val = vector[satIndex];
                    AmbiguityDic.Add(satA, val);
                    AmbiguityDic.Add(satB, val);
                    satIndex++;
                }
            }
        }
Beispiel #6
0
        /// <summary>
        /// 单频平滑伪距
        /// </summary>
        /// <param name="prn"></param>
        /// <param name="PhaseSmoothRangeBulider"></param>
        /// <param name="records"></param>
        private void SingleFreqPhaseSmoothRange(SatelliteNumber prn, NamedCarrierSmoothedRangeBuilderManager PhaseSmoothRangeBulider, List <TimedRinexSatObsData> records)
        {
            ObjectTableStorage table = new ObjectTableStorage();

            foreach (var record in records)
            {
                table.NewRow();
                table.AddItem("Epoch", record.Time);
                var data = record.SatObsData;

                var waveLenL1 = Frequence.GetFrequence(prn.SatelliteType, 1).WaveLength;
                var waveLenL2 = Frequence.GetFrequence(prn.SatelliteType, 2).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().Value;
                table.AddItem("P1", P1);
                table.AddItem("P1S", P1s);

                if (data.PhaseB != null)
                {
                    var P2s = smootherP2
                              .SetReset(data.PhaseB.IsLossLock)
                              .SetRawValue(record.Time, P2, L2, 0)
                              .Build().Value;
                    table.AddItem("P2", P2);
                    //table.AddItem("P1S_old", P1s);
                    table.AddItem("P2S", P2s);
                }
            }

            BindDataSource(table);
        }
Beispiel #7
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);
        }
Beispiel #8
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);
        }
Beispiel #9
0
        /// <summary>
        /// 构建,如果可以,默认支持3个频率
        /// </summary>
        /// <returns></returns>
        public override EpochSatellite Build(RinexSatObsData observtion)
        {
            EpochSatellite epochSat = new EpochSatellite(this.EpochInfo, prn);
            //需要重新修改,RINEX 3.0 有的对 BDS 是 C1,C7, C6,3.02 明确规定是 C2, C7, C6
            Dictionary <FrequenceType, List <int> > freqDic = ObsCodeConvert.GetRinexFreqIndexDic(observtion.Prn.SatelliteType);
            //新算法,2018.09.24,hmx
            var freqNums = observtion.GetFrequenceNums();

            foreach (var num in freqNums)
            {
                var           prn      = observtion.Prn;
                FrequenceType freqType = ObsCodeConvert.GetFrequenceType(freqDic, num);
                Frequence     band     = Frequence.GetFrequence(prn, freqType, Time);
                if (band == null)
                {
                    band = Frequence.Default;
                    log.Warn("系统并未设置 " + prn.SatelliteType + " 的第 " + freqType + " 频率, 以 " + band + " 代替 !");
                }

                FreqenceObservation freqObs1 = FreqObsBuilder
                                               .SetFrequenceType(freqType)
                                               .SetFrequence(band)
                                               .SetRinexFrequenceNumber(num)
                                               .Build(observtion);
                epochSat.Set(freqObs1.FrequenceType, freqObs1);
            }

            //次新算法,比较繁琐,2018
            //List<FrequenceType> builded = new List<FrequenceType>();
            //foreach (var item in observtion)
            //{
            //    var num = Geo.Utils.StringUtil.GetNumber(item.Key);
            //    FrequenceType freqType = ObsCodeConvert.GetFrequenceType(freqDic, num);//   (FrequenceType)(builedFreq.IndexOf(num) + 1);

            //    if (!builded.Contains(freqType)) { builded.Add(freqType); }
            //    else { continue; }

            //    FreqenceObservation freqObs1 = FreqObsBuilder
            //                        .SetFrequenceType(freqType)
            //                        .SetRinexFrequenceNumber(num)
            //                        .Build(observtion);
            //    epochSat.Set(freqObs1.FrequenceType, freqObs1);
            //}

            /** //老算法,只支持3个频率
             #region 转换观测值到频率A、频率B、频率C的基本观测值
             * //第一频率
             * FreqenceObservation freqObs = FreqObsBuilder
             *  .SetFrequenceType(FrequenceType.A).Build(observtion);
             * epochSat.Set(freqObs.FrequenceType, freqObs);
             *
             * //第二频率
             * freqObs = FreqObsBuilder
             *  .SetFrequenceType(FrequenceType.B).Build(observtion);
             * if (freqObs != null) epochSat.Set(freqObs.FrequenceType, freqObs);
             *
             * //第三频率
             * freqObs = FreqObsBuilder
             *  .SetFrequenceType(FrequenceType.C).Build(observtion);
             * if (freqObs != null) epochSat.Set(freqObs.FrequenceType, freqObs);
             #endregion
             */

            return(epochSat);
        }