using DevExpress.Mvvm.ModuleInjection.Native; 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 XzXdDw.App; using XzXdDw.App.Api.星地GDOP误差椭圆; using XzXdDw.App.Model; namespace XdCxRhDW.App.UserControl { public partial class XZGDOPParam : DevExpress.XtraEditors.XtraUserControl { public MapControl mapControl1; public GDOP星座协同接口 Model => new GDOP星座协同接口() { TleLeo1 = txtTleLeo1.Text.Trim(), TleLeo2 = txtTleLeo2.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 XZGDOPParam(TxInfo refTx, DateTime sigTime, double upfreqHz1, double upfreqHz2) { InitializeComponent(); txtCapTime.UseDefault(); txtTleLeo1.UseDoubleClickToSelectAll(); txtTleLeo2.UseDoubleClickToSelectAll(); txtRefLocation1.UseDoubleClickToSelectAll(); this.txtCapTime.DateTime = sigTime; this.txtRefLocation1.Text = $"{refTx.Lon},{refTx.Lat}"; txtTleLeo1.UseDefault().SetStringData(TestData.AllTle).Text = TestData.tleleo1; txtTleLeo2.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(); var (listSat, data) = GdopHelper.GdopLeoTowSatDRef( new double[] { Model.RefLon, Model.RefLat }, Model.TleLeo1, Model.TleLeo2, Model.CapTime, Model.DtousErr, Model.DfoErr, Model.SatLocErr, Model.EphVelErr, Model.fu1, Model.fu2); if (data == null) { return; } if (listSat != null)//画卫星 { foreach (var sat in listSat) { mapControl1.Invoke(new Action(() => { string satCode = sat.SatCode == null ? "未知" : sat.SatCode.ToString(); mapControl1.DrawFixedImg("sat", sat.SatLat, sat.SatLon, DxHelper.SvgHelper.CreateSat(), new Size(32, 32), $"卫星编号:{satCode}\r\n轨道经度:{sat.SatLon}°\r\n轨道纬度:{sat.SatLat}°"); })); } } foreach (var errLins in data)//画GDOP { foreach (var line in errLins.MapLines) { var newLine = SampleDots(line); mapControl1.Invoke(new Action(() => { var mapLines = newLine.Line.Select(p => (errLins.ErrDistanceKm, p.Lon, p.Lat)); mapControl1.DrawGdopLine(mapLines); })); } } } public XdCxRhDW.App.DTO.MapLine SampleDots(XdCxRhDW.App.DTO.MapLine line) { var dots = line.Line; if (dots.Count < 30) return line; var tmp = dots.Count / 30; var newLine = new XdCxRhDW.App.DTO.MapLine(); for (int i = 0; i < dots.Count; i += tmp) { newLine.Line.Add(dots[i]); } if (!newLine.Line.Contains(dots.Last())) newLine.Line.Add(dots.Last()); return newLine; } private void btnClose_Click(object sender, EventArgs e) { PopupHelper.HidePopup(this); } } public class GDOP星座协同接口 { /// /// 主星星历(Tle) /// public string TleLeo1 { get; set; } /// /// 邻星星历(Tle) /// public string TleLeo2 { 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; } } }