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