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); }
/// <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; } }