using DevExpress.XtraMap; using ExtensionsDev; using System; using System.Data; using System.Linq; using System.Collections.Generic; using DxHelper; using DW5S.Repostory; using DW5S.Entity; using DW5S.KxcApi; using System.Drawing; using DevExpress.Utils.About; using DevExpress.XtraEditors.DXErrorProvider; using DW5S.DTO; using System.Configuration; using Serilog; using DW5S.Service; namespace DW5S.App.UserControl { public partial class X2D1GDOPParam : DevExpress.XtraEditors.XtraUserControl { public MapControl mapControl1; public GDOP星地两星一地接口 Model => new GDOP星地两星一地接口() { EphMain = ucEphXYZMain.EphParam(), EphAdja = ucEphXYZAdja.EphParam(), CapTime = txtCapTime.DateTime, CDBStation = txtStationLocation1.GetLonLat(), RefStation = PosResType == EnumPosResType.X2D1NoRef ? new double[3] { 0, 0, 0 } : txtRefLocation1.GetLonLat(), DtousErr = Convert.ToDouble(txtDtousErr1.Text), SatLocErr = Convert.ToDouble(txtSatLocErr1.Text), }; private EnumPosResType PosResType; public X2D1GDOPParam(PosRes item) { InitializeComponent(); this.layoutControl1.UseDefault(); txtCapTime.UseDefault(); txtStationLocation1.UseDoubleClickToSelectAll(); txtRefLocation1.UseDoubleClickToSelectAll(); this.txtCapTime.DateTime = item.SigTime; this.txtDtousErr1.EditValue = 1; this.txtSatLocErr1.EditValue = 10000; PosResType = item.PosResType; if (PosResType == EnumPosResType.X2D1NoRef) { layoutControlItem14.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never; } 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.txtStationLocation1.Text = $"{station.CdbTxLon},{station.CdbTxLat}"; this.txtRefLocation1.Text = $"{station.RefLon},{station.RefLat}"; } if (cg != null) { 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 (!txtStationLocation1.CheckLonLat(dxErrorProvider, "超短波")) { return false; } if (PosResType == EnumPosResType.X2D1 && !txtRefLocation1.CheckLonLat(dxErrorProvider, "参考站")) { return false; } if (!txtDtousErr1.CheckDouble(dxErrorProvider, "时差误差")) { return false; } if (!txtSatLocErr1.CheckDouble(dxErrorProvider, "星历位置误差")) { return false; } return true; } private void btnOK_Click(object sender, EventArgs e) { if (!ParamValidate()) { return; } try { mapControl1.ClearMap(); var data = GdopHelper.Gdop2Sat1DByXyzNew(Model.EphMain, Model.EphAdja, Model.CDBStation , Model.DtousErr, Model.SatLocErr, PosResType == EnumPosResType.X2D1NoRef ? null : 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) { DxHelper.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 GDOP星地两星一地接口 { /// /// 主星x y z vx vy vz /// public double[] EphMain { get; set; } /// /// 邻星x y z vx vy vz /// public double[] EphAdja { get; set; } /// /// 采集时刻 /// public DateTime CapTime { get; set; } /// /// 超短接收站-经度 纬度 高度 /// public double[] CDBStation { get; set; } /// /// 参考站位置-经度 纬度 高度 /// public double[] RefStation { get; set; } /// /// 时差误差(单位us) /// public double DtousErr { get; set; } = 1; /// /// 星历位置误差(单位米) /// public double SatLocErr { get; set; } = 10000; /// /// 定位类型 /// public EnumPosResType PosResType { get; set; } } }