using DevExpress.XtraEditors.DXErrorProvider; using DevExpress.XtraMap; using DxHelper; using ExtensionsDev; using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Drawing; using System.Linq; using DW5S.KxcApi; using DW5S.DTO; using DW5S.Entity; using DW5S.Repostory; using Serilog; using DW5S.Service; namespace DW5S.App.UserControl { public partial class X2DFGDOPParam : DevExpress.XtraEditors.XtraUserControl { public MapControl mapControl1; public X2DFGDOP接口 Model => new X2DFGDOP接口() { EphMain = ucEphXYZMain.EphParam(), EphAdja = ucEphXYZAdja.EphParam(), CapTime = txtCapTime.DateTime, RefStation = txtRefLocation1.GetLonLat(), DfoErr = Convert.ToDouble(txtDfoErr1.Text), DtousErr = Convert.ToDouble(txtDtousErr1.Text), SatLocErr = Convert.ToDouble(txtSatLocErr1.Text), EphVelErr = Convert.ToDouble(txtEphVelErr1.Text), fu1 = Convert.ToDouble(txtFu1.Text) * 1e6, fu2 = Convert.ToDouble(txtFu2.Text) * 1e6, }; private EnumPosResType PosResType; public X2DFGDOPParam(PosRes item) { InitializeComponent(); this.layoutControl1.UseDefault(); txtCapTime.UseDefault(); txtRefLocation1.UseDoubleClickToSelectAll(); this.txtCapTime.DateTime = item.SigTime; this.txtSatLocErr1.EditValue = 10000; this.txtEphVelErr1.EditValue = 0.1; this.txtDfoErr1.EditValue = 0.01; this.txtDtousErr1.EditValue = 1; PosResType = item.PosResType; var unitOfWork = IocContainer.UnitOfWork; var repsCg = unitOfWork.Of(); var repsStation = unitOfWork.Of(); var cg = repsCg.FirstOrDefaultAsync(m => m.Id == item.CgResID).Result; var station = repsStation.FirstOrDefaultAsync(m => m.Id == item.StationResID).Result; if (station != null) { this.txtRefLocation1.Text = $"{station.RefLon},{station.RefLat}"; } if (cg != null) { this.txtFu1.EditValue = cg.TarFreqUp.HasValue ? cg.TarFreqUp.Value * 1e-6 : 0; this.txtFu2.EditValue = cg.RefFreqUp.HasValue ? cg.RefFreqUp.Value * 1e-6 : 0; var mainEph = (cg.MainX, cg.MainY, cg.MainZ, cg.MainVx, cg.MainVy, cg.MainVz); ucEphXYZMain.SetParam($"主星", cg.MainCode, mainEph, Color.Black); var adjaEph = (cg.Adja1X, cg.Adja1Y, cg.Adja1Z, cg.Adja1Vx, cg.Adja1Vy, cg.Adja1Vz); ucEphXYZAdja.SetParam($"邻星", cg.Adja1Code, adjaEph, Color.Black); } } private bool ParamValidate() { dxErrorProvider.ClearErrors(); if (!ucEphXYZMain.CheckEph(dxErrorProvider)) { return false; } if (!ucEphXYZAdja.CheckEph(dxErrorProvider)) { return false; } if (!txtRefLocation1.CheckLonLat(dxErrorProvider, "参考站")) { return false; } if (!txtDtousErr1.CheckDouble(dxErrorProvider, "时差误差")) { return false; } if (!txtDfoErr1.CheckDouble(dxErrorProvider, "频差误差")) { return false; } if (!txtSatLocErr1.CheckDouble(dxErrorProvider, "星历位置误差")) { return false; } if (!txtEphVelErr1.CheckDouble(dxErrorProvider, "星历速度误差")) { return false; } if (!txtFu1.CheckDouble(dxErrorProvider, "目标上行频点")) { return false; } if (!txtFu2.CheckDouble(dxErrorProvider, "参考上行频点")) { return false; } return true; } private void btnOK_Click(object sender, EventArgs e) { if (!ParamValidate()) { return; } try { mapControl1.ClearMap(); var data = GdopHelper.Gdop2SatDRefByXyzNew(Model.EphMain, Model.EphAdja, Model.fu1, Model.fu2, Model.DtousErr, Model.DfoErr, Model.SatLocErr, Model.EphVelErr, Model.RefStation); if (data.Count == 0) { DxHelper.MsgBoxHelper.ShowInfo($"绘制{PosResType.GetEnumDisplayName()}GDOP没有{GdopParam.误差配置.误差距离km.Max()}公里以内的误差!"); return; } List polylines = new List(); for (int i = 0; i < data.Count; i++) { var errLins = data[i]; var mapline = mapControl1.GetLine(errLins.ErrDistanceKm, errLins.MapDots); if (mapline == null) { continue; } polylines.Add(mapline); } mapControl1.DrawDtoLine(polylines); } catch (Exception ex) { string msg = $"绘制{PosResType.GetEnumDisplayName()}GDOP失败"; IocContainer.Logger.Error(ex, msg); DxHelper.MsgBoxHelper.ShowError(msg); } } private void btnClose_Click(object sender, EventArgs e) { PopupHelper.HidePopup(this); } private async void btnEphCalc_Click(object sender, EventArgs e) { dxErrorProvider.ClearErrors(); if (txtCapTime.DateTime == DateTime.MinValue) { dxErrorProvider.SetError(txtCapTime, "信号时间不能为空!"); return; } var sigTime = txtCapTime.DateTime; try { var mainCode = ucEphXYZMain.GetSatCode(); var adjaCode = ucEphXYZAdja.GetSatCode(); var unitOfWork = IocContainer.UnitOfWork; var repsXl = unitOfWork.Of() as XlRepository; var mainxlInfo = await repsXl.GetLatestAsync(mainCode, sigTime); if (mainxlInfo == null) { DxHelper.MsgBoxHelper.ShowWarning($"卫星:{mainCode}未找到对应的星历信息,请导入星历"); return; } var XlCalcDto = new XlCalcDto() { tleStr = mainxlInfo.TwoLine, SigTime = sigTime }; var maineph = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), XlCalcDto); ucEphXYZMain.SetParam("主星", mainCode, (maineph.data.X, maineph.data.Y, maineph.data.Z, maineph.data.VX, maineph.data.VY, maineph.data.VZ), Color.Red); var adjaxlInfo = await repsXl.GetLatestAsync(adjaCode, sigTime); if (adjaxlInfo == null) { DxHelper.MsgBoxHelper.ShowWarning($"卫星:{adjaCode}未找到对应的星历信息,请导入星历"); return; } XlCalcDto = new XlCalcDto() { tleStr = adjaxlInfo.TwoLine, SigTime = sigTime }; var adjaeph = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), XlCalcDto); ucEphXYZAdja.SetParam("邻星", adjaCode, (adjaeph.data.X, adjaeph.data.Y, adjaeph.data.Z, adjaeph.data.VX, adjaeph.data.VY, adjaeph.data.VZ), Color.Red); } catch (Exception ex) { string msg = $"手动推算{PosResType.GetEnumDisplayName()}星历失败,SigTime={sigTime}"; IocContainer.Logger.Error(ex, msg); DxHelper.MsgBoxHelper.ShowError(msg); } } } public class X2DFGDOP接口 { /// /// 主星星历x y z vx vy vz /// public double[] EphMain { get; set; } /// /// 邻星1星历x y z vx vy vz /// public double[] EphAdja { get; set; } /// /// 采集时刻 /// public DateTime CapTime { get; set; } /// /// 参考站位置-经度 纬度 高度 /// public double[] RefStation { get; set; } /// /// 时差误差(单位us) /// public double DtousErr { get; set; } = 1; /// /// 频差误差(Hz) /// public double DfoErr { get; set; } /// /// 星历位置误差(单位米) /// public double SatLocErr { get; set; } = 10000; /// ///星历速度误差 /// public double EphVelErr { get; set; } /// /// 上行频点1(Hz) /// public double fu1 { get; set; } /// /// 上行频点2(Hz) /// public double fu2 { get; set; } } }