Procházet zdrojové kódy

添加双星仿真数据文件

wyq před 1 rokem
rodič
revize
5181d58076
2 změnil soubory, kde provedl 152 přidání a 116 odebrání
  1. 13 0
      XzXdDw.App/Api/PosApi.cs
  2. 139 116
      XzXdDw.App/UserControl/CtrlPosXz.cs

+ 13 - 0
XzXdDw.App/Api/PosApi.cs

@@ -7,6 +7,7 @@ using System.Threading.Tasks;
 using DevExpress.XtraBars.Docking2010.Views.Widget;
 using XzXdDw.App.Model;
 using static System.Windows.Forms.VisualStyles.VisualStyleElement.TextBox;
+using static DevExpress.XtraPrinting.Native.ExportOptionsPropertiesNames;
 
 namespace XzXdDw.App.Api
 {
@@ -167,6 +168,18 @@ namespace XzXdDw.App.Api
             SingleStar_DFO_DW(mainSat, adjaSat1, adjaSat2,  zone, cg.DfoSx,cg1.DfoSx, upfreqHz, res);
             return res;
         }
+
+        public static double[] X2_POS(CgRes cg, TxInfo refTx, double upfreqHz1,double upfreqHz2)
+        {
+            double[] refStation = new double[3] { refTx.Lon, refTx.Lat, 0 };
+
+            double[] mainSat = new double[6] { cg.MainX, cg.MainY, cg.MainZ, cg.MainVX, cg.MainVY, cg.MainVZ };
+            double[] adjaSat1 = new double[6] { cg.AdjaX, cg.AdjaY, cg.AdjaZ, cg.AdjaVX, cg.AdjaVY, cg.AdjaVZ };
+            double[] zone = new double[] { -85, 85, -180, 180 }; //定位区域
+            double[] res = new double[6];
+            TwoStar_DTFO_DW(mainSat, adjaSat1,refStation, zone,cg.DtoSx, cg.DfoSx, cg.DtoCdb, cg.DfoCdb, upfreqHz1, upfreqHz2, res);
+            return res;
+        }
         public static bool IsGeoPoint(double[] res)
         {
             return res[0] >= -180 && res[0] <= 180 && res[1] >= -90 && res[1] <= 90;

+ 139 - 116
XzXdDw.App/UserControl/CtrlPosXz.cs

@@ -28,6 +28,7 @@ using XdCxRhDW.App.UserControl;
 using XzXdDw.App.Api;
 using XzXdDw.App.Api.低轨GDOP误差椭圆;
 using XzXdDw.App.Api.星地GDOP误差椭圆;
+using XzXdDw.App.EditForms;
 using XzXdDw.App.EFContext;
 using XzXdDw.App.Model;
 
@@ -42,7 +43,8 @@ namespace XzXdDw.App.UserControl
         /// 时差初值 范围计算
         /// </summary>
         DtSXLParam dtsxlctrl = null;
-
+        double fu1 = 3.1085e8;
+        double fu2 = 2.95e8;
         public CtrlPosXz()
         {
             InitializeComponent();
@@ -84,10 +86,11 @@ namespace XzXdDw.App.UserControl
                             XtraMessageBox.Show("删除结果失败");
                         }
                     })
-                    .AddMenu("加载仿真数据", SvgHelper.LoadFromFile("Image\\LoadData.svg"), LoadTestData)
+                    .AddMenu("加载仿真数据", SvgHelper.LoadFromFile("Image\\LoadData.svg"), LoadSimulationData)
                      .AddMenu("绘制时差线", SvgHelper.LoadFromFile("Image\\DrawLine.svg"), DrawDtoLine)
                      .AddMenu("绘制频差线", SvgHelper.LoadFromFile("Image\\DfoLine.svg"), DrawDfoLine)
-                     .AddMenu("绘制误差椭圆", SvgHelper.LoadFromFile("Image\\误差椭圆.svg"), ()=> {
+                     .AddMenu("绘制误差椭圆", SvgHelper.LoadFromFile("Image\\误差椭圆.svg"), () =>
+                     {
                          var ctrl = new XZErrEllipseParam();
                          PopupHelper.ShowPopup(ctrl, mapControl1, mapControl1.Width / 4, onHide: hideReason =>
                          {
@@ -122,7 +125,7 @@ namespace XzXdDw.App.UserControl
                 //MapMenu为地图瓦片上右键菜单
                 //AddPosMenu为定位点上右键菜单
                 //RectMenu为框选的区域上右键菜单
-                mapControl1.AddMapMenu("加载仿真数据", SvgHelper.LoadFromFile("Image\\LoadData.svg"), (lon, lat) => LoadTestData())
+                mapControl1.AddMapMenu("加载仿真数据", SvgHelper.LoadFromFile("Image\\LoadData.svg"), (lon, lat) => LoadSimulationData())
                     .AddMapMenu("停止加载", SvgHelper.LoadFromFile("Image\\Stop.svg"), (lon, lat) => stoped = true)
                     .AddMapMenu("GDOP分析", SvgHelper.LoadFromFile("Image\\GDOP.svg"), (lon, lat) =>
                     {
@@ -132,7 +135,7 @@ namespace XzXdDw.App.UserControl
                             if (hideReason == HideReason.Defalut) return;
                             var model = ctrl.Model;
                             var (listSat, data) = GdopHelper.GdopLeoTowSatDRef(
-                              new double[] { model.RefLon, model.RefLat }, model.TleMain, model.TleAdja, model.CapTime, model.DtousErr,model.DfoErr, model.SatLocErr,model.EphVelErr,model.fu1,model.fu2);
+                              new double[] { model.RefLon, model.RefLat }, model.TleMain, model.TleAdja, model.CapTime, model.DtousErr, model.DfoErr, model.SatLocErr, model.EphVelErr, model.fu1, model.fu2);
                             if (data == null)
                             {
                                 return;
@@ -171,7 +174,7 @@ namespace XzXdDw.App.UserControl
                             var model = ctrl.Model;
                             double[] main_sat = Tle2XYZ.GetXyz(model.TleMain, model.CapTime);
                             double[] adja_sat = Tle2XYZ.GetXyz(model.TleAdja, model.CapTime);
-                            DrawErrorEllipseDTFO(main_sat, adja_sat, new double[] { model.RefLon,model.RefLat,0},model.DtousErr,model.DfoErr,model.SatLocErr, model.EphVelErr, model.fu1,model.fu2);
+                            DrawErrorEllipseDTFO(main_sat, adja_sat, new double[] { model.RefLon, model.RefLat, 0 }, model.DtousErr, model.DfoErr, model.SatLocErr, model.EphVelErr, model.fu1, model.fu2);
                         });
                     })
                     .AddRectMenu<XZPosRes>("时差初值预估", SvgHelper.LoadFromFile("Image\\初值预估.svg"), items =>
@@ -201,67 +204,78 @@ namespace XzXdDw.App.UserControl
             }
         }
         bool stoped = false;
-        private async void LoadTestData()
+        private async void LoadSimulationData()
         {
-            stoped = false;
-
 
+            SimulationEditor editor = new SimulationEditor("Simulation_Data_SX20240115.dat");
+            if (editor.ShowDialog() != DialogResult.OK)
+            {
+                return;
+            }
+            string simulationFile = editor.SimulationFile;
+            stoped = false;
 
             //在列表控件中全选+右键可以删除所有测试结果
             using (RHDWContext db = new RHDWContext())
             {
                 var listTx = db.TxInfos.ToList();
-                var lines = File.ReadAllLines("Simulation_Data2023.dat");
+                var lines = File.ReadAllLines(simulationFile);
                 Random r = new Random();
                 foreach (var item in lines)
                 {
                     if (stoped) break;
-                    //var items = item.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
-                    //var sxDto = Convert.ToDouble(items[0]);
-                    //var xdDto = Convert.ToDouble(items[1]);
-                    //var mainYbDto = Convert.ToDouble(items[2]);
-                    //var adjaYbDto = Convert.ToDouble(items[3]);
-                    //var mainX = Convert.ToDouble(items[7]);
-                    //var mainY = Convert.ToDouble(items[8]);
-                    //var mainZ = Convert.ToDouble(items[9]);
-                    //var adjaX = Convert.ToDouble(items[10]);
-                    //var adjaY = Convert.ToDouble(items[11]);
-                    //var adjaZ = Convert.ToDouble(items[12]);
-                    //var cgRes = new CgRes()
-                    //{
-                    //    SigTime = DateTime.Now,
-                    //    DtoSx = sxDto * 1e6,
-                    //    DfoSx = 200 + r.Next(1, 5) + Math.Round(r.NextDouble(), 3),
-                    //    SnrSx = r.Next(18, 24) + Math.Round(r.NextDouble(), 1),
-                    //    DtoCdb = xdDto * 1e6,
-                    //    DfoCdb = 600 + r.Next(1, 5) + Math.Round(r.NextDouble(), 3),
-                    //    SnrCdb = r.Next(22, 32) + Math.Round(r.NextDouble(), 1),
-                    //    YbMain = mainYbDto * 1e6,
-                    //    YbAdja = adjaYbDto * 1e6,
-                    //    MainX = mainX,
-                    //    MainY = mainY,
-                    //    MainZ = mainZ,
-                    //    AdjaX = adjaX,
-                    //    AdjaY = adjaY,
-                    //    AdjaZ = adjaZ,
-                    //};
-                    //db.CgRes.Add(cgRes);//参估结果入库
-
-                    //var res = PosApi.X2D1_POS(cgRes, listTx);
-                    //PosRes posRes = new PosRes()
-                    //{
-                    //    SigTime = cgRes.SigTime,
-                    //    CgResID = cgRes.ID,
-                    //    TarName = "未知目标",
-                    //    TsName = "tar2",
-                    //    PosLon = res[0],
-                    //    PosLat = res[1],
-                    //    MirrLon = res[3],
-                    //    MirrLat = res[4],
-                    //};
-                    //db.PosRes.Add(posRes);//定位结果入库
-
-                    double[] main_sat = { -1608409.905, 5994264.071, 3139843.443, -6633.016931, -374.023436, -2678.158046 };
+                    var items = item.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
+                    if (items.Length != 16) continue;
+                    int index = 0;
+                    var target_dto = Convert.ToDouble(items[index++]);
+                    var target_dfo = Convert.ToDouble(items[index++]);
+
+
+                    var ref_dto = Convert.ToDouble(items[index++]);
+                    var ref_dfo = Convert.ToDouble(items[index++]);
+
+                    var mainX = Convert.ToDouble(items[index++]);
+                    var mainY = Convert.ToDouble(items[index++]);
+                    var mainZ = Convert.ToDouble(items[index++]);
+                    var mainVX = Convert.ToDouble(items[index++]);
+                    var mainVY = Convert.ToDouble(items[index++]);
+                    var mainVZ = Convert.ToDouble(items[index++]);
+
+                    var adjaX = Convert.ToDouble(items[index++]);
+                    var adjaY = Convert.ToDouble(items[index++]);
+                    var adjaZ = Convert.ToDouble(items[index++]);
+                    var adjaVX = Convert.ToDouble(items[index++]);
+                    var adjaVY = Convert.ToDouble(items[index++]);
+                    var adjaVZ = Convert.ToDouble(items[index++]);
+
+                    DateTime SigTime = DateTime.Now;
+
+                    var cgRes = new CgRes()
+                    {
+                        SigTime = SigTime,
+                        DtoSx = target_dto,
+                        DfoSx = target_dfo,
+                        SnrSx = r.Next(18, 24) + Math.Round(r.NextDouble(), 1),
+                        DtoCdb = ref_dto,
+                        DfoCdb = ref_dfo,
+                        SnrCdb = r.Next(22, 32) + Math.Round(r.NextDouble(), 1),
+                        MainX = mainX,
+                        MainY = mainY,
+                        MainZ = mainZ,
+                        MainVX = mainVX,
+                        MainVY = mainVY,
+                        MainVZ = mainVZ,
+                        AdjaX = adjaX,
+                        AdjaY = adjaY,
+                        AdjaZ = adjaZ,
+                        AdjaVX = adjaVX,
+                        AdjaVY = adjaVY,
+                        AdjaVZ = adjaVZ,
+                    };
+
+                    var cg = db.CgRes.Add(cgRes);//参估结果入库
+                    await db.SaveChangesAsync();
+                    /*double[] main_sat = { -1608409.905, 5994264.071, 3139843.443, -6633.016931, -374.023436, -2678.158046 };
                     double[] neigh_sat = { -4629566.829, 4978943.601, 1487242.596, -4890.245126, -3337.702797, -4031.339975 };
                     double[] Ref_Station_LLH = { 112.33, 16.3, 0 };
                     double[] Zone = { -80, 80, -150, 150 };
@@ -274,22 +288,23 @@ namespace XzXdDw.App.UserControl
 
                     double fu1 = 3.1085e8;
                     double fu2 = 2.95e8;
+                    */
 
-
-                    double[] target_llh = new double[6];
-
-                    PosApi.TwoStar_DTFO_DW(main_sat, neigh_sat, Ref_Station_LLH, Zone, target_dto, target_dfo, ref_dto, ref_dfo, fu1, fu2, target_llh);
+                    var refTx = listTx.Find(p => p.TxType == EnumTxType.Ref);
+                   // refTx.Lon = 112.33;
+                    //refTx.Lat = 16.3;
+                    var res = PosApi.X2_POS(cg, refTx, fu1, fu2);
 
                     XZPosRes posRes = new XZPosRes()
                     {
                         SigTime = DateTime.Now,
-                        CgResID = 1,
+                        CgResID = cg.ID,
                         TarName = "未知目标",
                         TsName = "tar2",
-                        PosLon = target_llh[0],
-                        PosLat = target_llh[1],
-                        MirrLon = target_llh[3],
-                        MirrLat = target_llh[4],
+                        PosLon = res[0],
+                        PosLat = res[1],
+                        MirrLon = res[3],
+                        MirrLat = res[4],
                     };
                     db.XZPosRes.Add(posRes);//定位结果入库
 
@@ -307,7 +322,7 @@ namespace XzXdDw.App.UserControl
             }
         }
 
-        private  void DrawDtoLine()
+        private async void DrawDtoLine()
         {
             try
             {
@@ -318,47 +333,35 @@ namespace XzXdDw.App.UserControl
                     return;
                 }
                 var item = gridView1.GetRow(ids[0]) as XZPosRes;
-                //List<TxInfo> listTx = new List<TxInfo>();
-                //List<Model.SatInfo> listSat = new List<Model.SatInfo>();
-                //CgRes cg;
-                //using (RHDWContext db = new RHDWContext())
-                //{
-                //    listTx = db.TxInfos.ToList();
-                //    listSat = db.SatInfos.ToList();
-                //    cg = await db.CgRes.Where(m => m.ID == item.CgResID).FirstOrDefaultAsync();
-
-                //}
-                //if (cg == null)
-                //{
-                //    XtraMessageBox.Show($"未找到定位相关的计算[{item.CgResID}]信息");
-                //    return;
-                //}
-                //var satTx = listTx.Find(p => p.TxType == EnumTxType.MainSat);
-                //var satNTx = listTx.Find(p => p.TxType == EnumTxType.AdjaSat);
-                //var cdbTx = listTx.Find(p => p.TxType == EnumTxType.Cdb);
-                //var refTx = listTx.Find(p => p.TxType == EnumTxType.Ref);
-
-
-
-                double[] main_sat = { -1608409.905, 5994264.071, 3139843.443, -6633.016931, -374.023436, -2678.158046 };
-                double[] neigh_sat = { -4629566.829, 4978943.601, 1487242.596, -4890.245126, -3337.702797, -4031.339975 };
-                double[] Ref_Station_LLH = { 112.33, 16.3, 0 };
-                double[] Zone = { -80, 80, -150, 150 };
-
-                double target_dto = -0.010246009710722;
-
-                double ref_dto = 0.002823291225258;
-
+                List<TxInfo> listTx = new List<TxInfo>();
+                List<Model.SatInfo> listSat = new List<Model.SatInfo>();
+                CgRes cg;
+                using (RHDWContext db = new RHDWContext())
+                {
+                    listTx = db.TxInfos.ToList();
+                    listSat = db.SatInfos.ToList();
+                    cg = await db.CgRes.Where(m => m.ID == item.CgResID).FirstOrDefaultAsync();
 
+                }
+                if (cg == null)
+                {
+                    XtraMessageBox.Show($"未找到定位相关的计算[{item.CgResID}]信息");
+                    return;
+                }
+                var satTx = listTx.Find(p => p.TxType == EnumTxType.MainSat);
+                var satNTx = listTx.Find(p => p.TxType == EnumTxType.AdjaSat);
+                var refTx = listTx.Find(p => p.TxType == EnumTxType.Ref);
+                //refTx.Lon = 112.33;
+                //refTx.Lat = 16.3;
                 DtoLineTwoStartOption twoStartOption = new DtoLineTwoStartOption();
-                twoStartOption.MsEph = main_sat;
-                twoStartOption.NsEph = neigh_sat;
-                twoStartOption.RefGeod = Ref_Station_LLH;
-                twoStartOption.TargetDto = target_dto * 1e6;
-                twoStartOption.RefDto = ref_dto * 1e6;
+                twoStartOption.MsEph = new double[6] { cg.MainX, cg.MainY, cg.MainZ, cg.MainVX, cg.MainVY, cg.MainVZ };
+                twoStartOption.NsEph = new double[6] { cg.AdjaX, cg.AdjaY, cg.AdjaZ, cg.AdjaVX, cg.AdjaVY, cg.AdjaVZ };
+                twoStartOption.RefGeod = new double[3] { refTx.Lon, refTx.Lat, 0 };
+                twoStartOption.TargetDto = cg.DtoSx * 1e6;
+                twoStartOption.RefDto = cg.DtoCdb * 1e6;
 
                 var tsDtoLine = DrawDtoLineHelper.DtoLineXZTwoStart(twoStartOption);
-                mapControl1.DrawDtoPonit($"双星时差线", tsDtoLine);
+                mapControl1.DrawDtoPonit($"双星[{listSat.FirstOrDefault(m => m.ID == satTx.ID)?.Sat},{listSat.FirstOrDefault(m => m.ID == satNTx.ID)?.Sat}]时差线", tsDtoLine);
 
 
             }
@@ -368,7 +371,7 @@ namespace XzXdDw.App.UserControl
                 XtraMessageBox.Show($"绘制时差线失败,失败信息:{ex.Message}");
             }
         }
-        private  void DrawDfoLine()
+        private async void DrawDfoLine()
         {
             try
             {
@@ -379,33 +382,53 @@ namespace XzXdDw.App.UserControl
                     return;
                 }
                 var item = gridView1.GetRow(ids[0]) as XZPosRes;
-              
+                List<TxInfo> listTx = new List<TxInfo>();
+                List<Model.SatInfo> listSat = new List<Model.SatInfo>();
+                CgRes cg;
+                using (RHDWContext db = new RHDWContext())
+                {
+                    listTx = db.TxInfos.ToList();
+                    listSat = db.SatInfos.ToList();
+                    cg = await db.CgRes.Where(m => m.ID == item.CgResID).FirstOrDefaultAsync();
+
+                }
+                if (cg == null)
+                {
+                    XtraMessageBox.Show($"未找到定位相关的计算[{item.CgResID}]信息");
+                    return;
+                }
+                var satTx = listTx.Find(p => p.TxType == EnumTxType.MainSat);
+                var satNTx = listTx.Find(p => p.TxType == EnumTxType.AdjaSat);
+                var refTx = listTx.Find(p => p.TxType == EnumTxType.Ref);
 
+                /*
                 double[] main_sat = { -1608409.905, 5994264.071, 3139843.443, -6633.016931, -374.023436, -2678.158046 };
                 double[] neigh_sat = { -4629566.829, 4978943.601, 1487242.596, -4890.245126, -3337.702797, -4031.339975 };
                 double[] Ref_Station_LLH = { 112.33, 16.3, 0 };
                 double[] Zone = { -80, 80, -150, 150 };
+                
 
-              
                 double target_dfo = 1.595360344349182e+03;
 
                 double ref_dfo = 1.132007974492508e+04;
 
                 double fu1 = 3.1085e8;
                 double fu2 = 2.95e8;
-
+                
+                refTx.Lon = 112.33;
+                refTx.Lat = 16.3;
+                */
                 DfoLineTwoStartOption twoStartOption = new DfoLineTwoStartOption();
-                twoStartOption.MsEph = main_sat;
-                twoStartOption.NsEph = neigh_sat;
-                twoStartOption.RefGeod = Ref_Station_LLH;
-                twoStartOption.TargetDfo = target_dfo;
-                twoStartOption.RefDfo = ref_dfo;
+                twoStartOption.MsEph = new double[6] { cg.MainX, cg.MainY, cg.MainZ, cg.MainVX, cg.MainVY, cg.MainVZ };
+                twoStartOption.NsEph = new double[6] { cg.AdjaX, cg.AdjaY, cg.AdjaZ, cg.AdjaVX, cg.AdjaVY, cg.AdjaVZ };
+                twoStartOption.RefGeod = new double[3] { refTx.Lon, refTx.Lat, 0 };
+                twoStartOption.TargetDfo = cg.DfoSx;
+                twoStartOption.RefDfo = cg.DfoCdb;
                 twoStartOption.fu1 = fu1;
                 twoStartOption.fu2 = fu2;
 
                 var tsDtoLine = DrawDtoLineHelper.DfoLineXZTwoStart(twoStartOption);
-                mapControl1.DrawDtoPonit($"双星频差线", tsDtoLine);
-
+                mapControl1.DrawDtoPonit($"双星[{listSat.FirstOrDefault(m => m.ID == satTx.ID)?.Sat},{listSat.FirstOrDefault(m => m.ID == satNTx.ID)?.Sat}]频差线", tsDtoLine);
 
             }
             catch (Exception ex)
@@ -415,7 +438,7 @@ namespace XzXdDw.App.UserControl
             }
         }
 
-        private void DrawErrorEllipseDTFO(double[] main_sat, double[] neigh_sat, double[] Ref_Station_LLH,double DtoErr,double DfoErr, double EphPosErr,double EphVelErr, double fu1, double fu2)
+        private void DrawErrorEllipseDTFO(double[] main_sat, double[] neigh_sat, double[] Ref_Station_LLH, double DtoErr, double DfoErr, double EphPosErr, double EphVelErr, double fu1, double fu2)
         {
             try
             {
@@ -437,7 +460,7 @@ namespace XzXdDw.App.UserControl
                 twoStartOption.MsEph = main_sat;
                 twoStartOption.NsEph = neigh_sat;
                 twoStartOption.RefGeod = Ref_Station_LLH;
-                twoStartOption.SelectPoint = new double[3] { item.PosLon,item.PosLat,0 };
+                twoStartOption.SelectPoint = new double[3] { item.PosLon, item.PosLat, 0 };
                 twoStartOption.DtoErr = DtoErr * 1e-6;
                 twoStartOption.DfoErr = DfoErr;
                 twoStartOption.EphPosErr = EphPosErr;