using DevExpress.XtraMap; using ExtensionsDev; using System; using System.Data; using System.Linq; using System.Collections.Generic; using DW5S.Repostory; using DW5S.Entity; using DW5S.KxcApi; using System.Drawing; using DevExpress.XtraCharts.Design; using System.Runtime.ConstrainedExecution; using DW5S.DTO; using System.Configuration; using Serilog; using DevExpress.Utils.About; using DW5S.Service; using DW5S.ViewModel; namespace DW5S.App.UserControl { public partial class X1D1GDOPParam : DevExpress.XtraEditors.XtraUserControl { public MapControl mapControl1; PosResViewModel info; public GDOP星地一星一地接口 Model => new GDOP星地一星一地接口() { EphMain = ucEphXYZMain.EphParam(), CapTime = txtCapTime.DateTime, CDBStation = txtStationLocation1.GetLonLat(), CXStation = txtCXStation.GetLonLat(), RefStation = txtRefLocation1.GetLonLat(), DtousErr = Convert.ToDouble(txtDtousErr1.Text), SatLocErr = Convert.ToDouble(txtSatLocErr1.Text), CXErr = Convert.ToDouble(txtCxErr.Text), }; private EnumPosResType PosResType; public X1D1GDOPParam(PosResViewModel item) { InitializeComponent(); this.layoutControl1.UseDefault(); txtCapTime.UseDefault(); txtStationLocation1.UseDoubleClickToSelectAll(); txtRefLocation1.UseDoubleClickToSelectAll(); txtCXStation.UseDoubleClickToSelectAll(); this.txtCapTime.DateTime = item.SigTime; this.txtDtousErr1.EditValue = 1; this.txtSatLocErr1.EditValue = 10000; this.txtCxErr.EditValue = 0.001; PosResType = item.PosResType; this.info = item; } private async void X1D1GDOPParam_Load(object sender, EventArgs e) { var unitOfWork = IocContainer.UnitOfWork; var repsPos = unitOfWork.OfLong(); var pos = await repsPos.GetByIdAsync(info.Id); var repsCg = unitOfWork.OfLong(); var repsStation = unitOfWork.OfLong(); var cg = repsCg.FirstOrDefaultAsync(m => m.Id == pos.Id).Result; var station = repsStation.FirstOrDefaultAsync(m => m.Id == pos.StationResID).Result; if (station != null) { this.txtStationLocation1.Text = $"{station.CdbTxLon},{station.CdbTxLat}"; this.txtRefLocation1.Text = $"{station.RefLon},{station.RefLat}"; this.txtCXStation.Text = $"{station.CxLon},{station.CxLat}"; } if (cg != null) { var mainEph = (cg.MainX, cg.MainY, cg.MainZ); ucEphXYZMain.SetParam($"主星", cg.MainCode, mainEph, Color.Black); } } private bool ParamValidate() { dxErrorProvider.ClearErrors(); if (!ucEphXYZMain.CheckEph(dxErrorProvider)) { return false; } if (!txtStationLocation1.CheckLonLat(dxErrorProvider, "超短波")) { return false; } if (!txtCXStation.CheckLonLat(dxErrorProvider, "测向站")) { return false; } if (!txtRefLocation1.CheckLonLat(dxErrorProvider, "参考站")) { return false; } if (!txtDtousErr1.CheckDouble(dxErrorProvider, "时差误差")) { return false; } if (!txtSatLocErr1.CheckDouble(dxErrorProvider, "星历位置误差")) { return false; } if (!txtCxErr.CheckDouble(dxErrorProvider, "测向误差")) { return false; } return true; } private void btnOK_Click(object sender, EventArgs e) { if (!ParamValidate()) { return; } try { mapControl1.ClearMap(); var data = GdopHelper.Gdop1Sat1DByXyzNew(Model.EphMain, Model.CDBStation, Model.CXStation, Model.DtousErr, Model.CXErr, Model.SatLocErr, 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 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), 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; } /// /// 采集时刻 /// public DateTime CapTime { get; set; } /// /// 超短接收站-经度 纬度 高度 /// public double[] CDBStation { get; set; } /// /// 参考站位置-经度 纬度 高度 /// public double[] RefStation { get; set; } /// /// 测向站位置-经度 纬度 高度 /// public double[] CXStation { get; set; } /// /// 时差误差(单位us) /// public double DtousErr { get; set; } = 1; /// /// 星历位置误差(单位米) /// public double SatLocErr { get; set; } = 10000; /// /// 测向误差(单位°) /// public double CXErr { get; set; } = 0.01; } }