/// <summary> /// 构造函数 格网电离层模型改正 /// </summary> public IonoGridModelCorrector(IIonoService IonoService, bool isPhase = false) { this.Name = "格网或球谐函数电离层模型距离改正"; this.IsCorrectionOnPhase = isPhase; this.CorrectionType = CorrectionType.IonoGridModel; this.IonoService = IonoService; if (IonoService == null) { log.Error(this.Name + "服务源为空"); } }
/// <summary> /// 获取电离层格网模型延迟 /// </summary> /// <param name="sat"></param> /// <param name="frequenceType"></param> /// <param name="IonoService"></param> /// <returns></returns> public static double GetGridModelCorrection(EpochSatellite sat, FrequenceType frequenceType, IIonoService IonoService) { //计算穿刺点获取电离层浓度 var punctPoint = sat.GetIntersectionXyz(IonoService.HeightOfModel); var geocentricLonLat = Geo.Coordinates.CoordTransformer.XyzToSphere(punctPoint); var tec = IonoService.GetSlope(sat.ReceiverTime, geocentricLonLat, sat.SphereElevation); if (tec == null || tec.Value == 0) { return(0); } Frequence freq = sat[frequenceType].Frequence; double slopeDelayFreqA = 1.0 * GetIonoDelayRange(tec.Value, freq.Value);//斜方向延迟 return(slopeDelayFreqA); }
private void button_view_Click(object sender, EventArgs e) { double cutOff = namedFloatControl_satCutOff.GetValue(); bool isRangeOrTec = checkBox_isRangeOrTec.Checked; var prnsString = namedStringControl_prn.GetValue(); var step = timeLoopControl1.TimeStepControl.GetValue(); var timePeriod = timeLoopControl1.TimePeriodControl.TimePeriod; var prns = SatelliteNumber.ParsePRNsBySplliter(prnsString, new char[] { ',', ',', ';' }); IIonoService ionoService = null; IonoSerivceType type = enumRadioControl_IonoSerivceType.GetCurrent <Gnsser.IonoSerivceType>(); switch (type) { case IonoSerivceType.IgsGrid: ionoService = GlobalIgsGridIonoService.Instance; break; case IonoSerivceType.SphericalHarmonics: ionoService = GlobalCodeHarmoIonoService.Instance; break; case IonoSerivceType.GpsKlobuchar: ionoService = GlobalKlobucharIonoService.Instance; break; default: break; } var ephService = GlobalIgsEphemerisService.Instance; var siteXyz = XYZ.Parse(namedStringControl_coord.GetValue()); double freqValue = Frequence.GpsL1.Value; if (!checkBox_freq.Checked) { freqValue = Frequence.GpsL2.Value; } ObjectTableStorage table = new ObjectTableStorage(); for (var time = timePeriod.Start; time < timePeriod.End; time += TimeSpan.FromMinutes(step)) { table.NewRow(); table.AddItem("Epoch", time); foreach (var prn in prns) { var eph = ephService.Get(prn, time); if (eph == null) { continue; } var satXyz = eph.XYZ; var polar = CoordTransformer.XyzToGeoPolar(satXyz, siteXyz, AngleUnit.Degree); if (cutOff > polar.Elevation) { continue; } if (isRangeOrTec) { var range = ionoService.GetSlopeDelayRange(time, siteXyz, satXyz, freqValue); table.AddItem(prn, range); } else { var tec = ionoService.GetSlope(time, siteXyz, satXyz); table.AddItem(prn, tec.Value); } } } objectTableControl1.DataBind(table); }