Example #1
0
        public bool Revise(ref EpochInformation info)
        {
            this.Correct(info);
            Dictionary <RinexSatFrequency, NEU> frequencyDicCorrection = this.Correction;

            foreach (var sat in info.EnabledSats)//分别对指定卫星指定频率进行改正
            {
                var satFreqs = sat.RinexSatFrequences;
                //分别执行改正
                foreach (var freqCorretion in frequencyDicCorrection)
                {
                    if (satFreqs.Contains(freqCorretion.Key))//指定类型的卫星,该卫星包含指定频率
                    {
                        //改正等效距离
                        //double rangeCorretion = CoordUtil.GetDirectionLength(freqCorretion.Value, info.ApproxXyz, sat.Ephemeris.XYZ);

                        double rangeCorretion = CoordUtil.GetDirectionLength(freqCorretion.Value, sat.Polar);

                        FrequenceType       freqType = ObsCodeConvert.GetFrequenceType(freqCorretion.Key);
                        FreqenceObservation freObs   = sat[freqType];

                        if (rangeCorretion == 0)
                        {
                            continue;
                        }
                        //  //    freObs.AddCommonCorrection(this.Name, -freqCorretion.Value.U);//若为正,其让站星观测值变小了,作为近似值改正数,应该减去

                        freObs.AddCommonCorrection(this.Name, -rangeCorretion);  //若为正,其让站星观测值变小了,作为近似值改正数,应该减去
                        //作为公共距离,还是只作为载波的改正?
                    }
                }
            }
            return(true);
        }
        /// <summary>
        /// 矫正
        /// </summary>
        /// <param name="info"></param>
        /// <returns></returns>
        public bool Revise(ref EpochInformation info)
        {
            foreach (var sat in info)
            {
                if (!sat.Enabled || !sat.HasEphemeris)
                {
                    continue;
                }

                this.Correct(sat);

                var satFreqs = sat.RinexSatFrequences;
                //分别执行改正
                foreach (var frequencyCorretor in this.Correction)
                {
                    if (satFreqs.Contains(frequencyCorretor.Key))//指定类型的卫星类型和频率 如 GPS L1, GPS L2
                    {
                        //只改正指定观测频率的等效距离
                        double rangeCorretion = frequencyCorretor.Value;
                        if (rangeCorretion == 0)
                        {
                            continue;
                        }

                        var freqType = ObsCodeConvert.GetFrequenceType(frequencyCorretor.Key);
                        FreqenceObservation freObs = sat[freqType];
                        if (freObs.CommonCorrection.ContainsCorrection(Name))
                        {
                            continue;
                        }
                        freObs.AddCommonCorrection(this.Name, rangeCorretion);
                    }
                }
            }
            return(true);
        }
Example #3
0
        /// <summary>
        /// 校正其中一个。
        /// </summary>
        /// <param name="sat"></param>
        /// <param name="freq"></param>
        /// <param name="obsFreq"></param>
        private void ReviseOneFreq(EpochSatellite sat, FrequenceType freq, FreqenceObservation obsFreq)
        {
            double       correction       = 0;
            RmsedNumeral corredRange      = RmsedNumeral.Zero;
            var          rangeObservation = obsFreq.PseudoRange;
            double       rawRange         = rangeObservation.Value;
            double       rawPhase         = obsFreq.PhaseRange.Value;

            var PS = PhaseSmoothedRangeBuilderManager.GetOrCreate(BuildSatFreqName(sat, freq));

            double ionoDiffer = 0;

            switch (this.PhaseSmoothedRangeBuilderManager.IonoDifferCorrectionType)
            {
            case IonoDifferCorrectionType.No:
                break;

            case IonoDifferCorrectionType.DualFreqCarrier:
                ionoDiffer = sat.GetIonoLenByDifferPhase(freq);
                break;

            case IonoDifferCorrectionType.WindowPolyfit:
                break;

            case IonoDifferCorrectionType.WindowWeightedAverage:
                break;

            case IonoDifferCorrectionType.IndicatedFile:
                if (IonoDeltaTable == null)
                {
                    log.Warn("电离层延迟变化表格为NULL!无法改正");
                }
                else
                {
                    var dat = InputedIonoDelta.Get(sat.Prn.ToString());
                    if (dat != null)
                    {
                        var win = dat.GetNumeralWindowData(sat.ReceiverTime);

                        if (win != null)
                        {
                            ionoDiffer = win.GetPolyFitValue(sat.ReceiverTime, 1, 2).Value;
                        }
                    }
                }
                break;

            default:
                break;
            }

            corredRange = PS.SetReset(sat.IsUnstable)
                          .SetRawValue(sat.ReceiverTime, rawRange, rawPhase, ionoDiffer)
                          .Build();
            correction = corredRange.Value - rawRange;

            //规定:原生观测量改正到观测值上【在观测方程的左边,因此符号不变】。 //2018.05.29, czs, int hmx
            CorrectionNames name = CorrectionNames.PhaseSmoothRange;

            switch (freq)
            {
            case FrequenceType.A:
                name = CorrectionNames.PhaseSmoothRangeA;
                break;

            case FrequenceType.B:
                name = CorrectionNames.PhaseSmoothRangeB;
                break;

            case FrequenceType.C:
                name = CorrectionNames.PhaseSmoothRangeC;
                break;

            default:
                name = CorrectionNames.PhaseSmoothRange;
                break;
            }

            rangeObservation.SetCorrection(name, correction);

            sat.StdDevOfRange = corredRange.StdDev;

            //检查更新电离层改正
            if (PS is GnsserWindowedPhaseSmoothedRangeBuilder)
            {
                obsFreq.TempAmbiguityAndIonoLength = ((GnsserWindowedPhaseSmoothedRangeBuilder)PS).SmoothRangeWindow.CurrentIonoAndHalfLambdaLen;
            }
        }