using DevExpress.XtraEditors; using DevExpress.XtraMap; using DxHelper; using ExtensionsDev; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using XdCxRhDW.App.Api.星历推算; using XzXdDw.App; using XzXdDw.App.Api.低轨GDOP误差椭圆; using XzXdDw.App.EFContext; using XzXdDw.App.Model; namespace XdCxRhDW.App.UserControl { public partial class XZErrEllipseParam : DevExpress.XtraEditors.XtraUserControl { public MapControl mapControl1; public double lon; public double lat; public ErrEllipse星座协同接口 Model => new ErrEllipse星座协同接口() { TleMain = txtTleMain.Text.Trim(), TleAdja = txtTleAdja.Text.Trim(), CapTime = txtCapTime.DateTime, RefLon = Convert.ToDouble(txtRefLocation1.Text.Replace(",", ",").Split(',')[0].Trim()), RefLat = Convert.ToDouble(txtRefLocation1.Text.Replace(",", ",").Split(',')[1].Trim()), DtousErr = Convert.ToDouble(txtDtousErr1.Text), DfoErr= Convert.ToDouble(txtDfoErr1.Text), SatLocErr = Convert.ToDouble(txtSatLocErr1.Text), EphVelErr = Convert.ToDouble(txtEphVelErr1.Text), fu1 = Convert.ToDouble(txtFu1.Text) * 1e6, fu2 = Convert.ToDouble(txtFu2.Text) * 1e6, }; public XZErrEllipseParam(TxInfo refTx, DateTime sigTime, double upfreqHz1, double upfreqHz2) { InitializeComponent(); txtCapTime.UseDefault(); txtTleMain.UseDoubleClickToSelectAll(); txtTleAdja.UseDoubleClickToSelectAll(); txtRefLocation1.UseDoubleClickToSelectAll(); this.txtCapTime.DateTime = sigTime; this.txtRefLocation1.Text = $"{refTx.Lon},{refTx.Lat}"; txtTleMain.UseDefault().SetStringData(TestData.AllTle).Text = TestData.tleleo1; txtTleAdja.UseDefault().SetStringData(TestData.AllTle).Text = TestData.tleleo2; this.txtDtousErr1.EditValue = TestData.DtousErr; this.txtDfoErr1.EditValue = TestData.DfoHzErr; this.txtSatLocErr1.EditValue = TestData.SatLocErr; this.txtEphVelErr1.EditValue = TestData.EphVelErr; this.txtFu1.EditValue = upfreqHz1 * 1e-6; this.txtFu2.EditValue = upfreqHz2 * 1e-6; } private void btnOK_Click(object sender, EventArgs e) { mapControl1.ClearMap(); double[] main_sat = Tle2XYZ.GetXyz(Model.TleMain, Model.CapTime); double[] adja_sat = Tle2XYZ.GetXyz(Model.TleAdja, Model.CapTime); DrawErrorEllipseDTFO(lon, lat, main_sat, adja_sat, new double[] { Model.RefLon, Model.RefLat, 0 }, Model.DtousErr, Model.DfoErr, Model.SatLocErr, Model.EphVelErr, Model.fu1, Model.fu2); } private void DrawErrorEllipseDTFO(double posLon, double posLat, double[] main_sat, double[] neigh_sat, double[] Ref_Station_LLH, double DtoErr, double DfoErr, double EphPosErr, double EphVelErr, double fu1, double fu2) { try { ErrorEllipseDTFOTSOption twoStartOption = new ErrorEllipseDTFOTSOption(); twoStartOption.MsEph = main_sat; twoStartOption.NsEph = neigh_sat; twoStartOption.RefGeod = Ref_Station_LLH; twoStartOption.SelectPoint = new double[3] { posLon, posLat, 0 }; twoStartOption.DtoErr = DtoErr * 1e-6; twoStartOption.DfoErr = DfoErr; twoStartOption.EphPosErr = EphPosErr; twoStartOption.EphVelErr = EphVelErr; twoStartOption.fu1 = fu1; twoStartOption.fu2 = fu2; var points = ErrEllipseHelper.ErrorEllipseDTFOTwoStart(twoStartOption); mapControl1.DrawDtoPonit($"双星误差椭圆线", points); } catch (Exception ex) { Serilog.Log.Error("绘制误差椭圆线失败", ex); XtraMessageBox.Show($"绘制误差椭圆线失败,失败信息:{ex.Message}"); } } private void btnClose_Click(object sender, EventArgs e) { PopupHelper.HidePopup(this); } } public class ErrEllipse星座协同接口 { /// /// 主星星历(Tle) /// public string TleMain { get; set; } /// /// 邻星星历(Tle) /// public string TleAdja { get; set; } /// /// 采集时刻 /// public DateTime CapTime { get; set; } /// /// 参考站位置经度 /// public double RefLon { get; set; } /// /// 参考站位置纬度 /// public double RefLat { 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; } } }