zoulei 1 жил өмнө
parent
commit
abd97d1893

+ 130 - 12
XdCxRhDW.Api/AddIns/定位/PosApi.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
 using System.Text;
 using System.Threading.Tasks;
@@ -80,7 +81,7 @@ namespace XdCxRhDW.Api
         /// <returns></returns>
         public static double[] X1D1_Pos(CgRes cgRes, StationRes sRes, CxRes cxRes, bool CalcConfidence = false)
         {
-            if (cgRes.DtoCdb.Value == 0) return new double[7] { 999, 999, 0, 999, 999, 0, -1};
+            if (cgRes.DtoCdb.Value == 0) return new double[7] { 999, 999, 0, 999, 999, 0, -1 };
             double[] mainSat = new double[3] { cgRes.MainX.Value, cgRes.MainY.Value, cgRes.MainZ.Value };
             double[] satStation = new double[3] { sRes.SatTxLon, sRes.SatTxLat, 0 };
             double[] cdbStation = new double[3] { sRes.CdbTxLon.Value, sRes.CdbTxLat.Value, 0 };
@@ -134,7 +135,7 @@ namespace XdCxRhDW.Api
         {
             if (cgRes.Dto1.Value == 0 || cgRes.DtoCdb.Value == 0)
             {
-                return new double[7] { 999, 999, 0, 999, 999, 0, -1};
+                return new double[7] { 999, 999, 0, 999, 999, 0, -1 };
             }
             double[] mainSat = new double[3] { cgRes.MainX.Value, cgRes.MainY.Value, cgRes.MainZ.Value };
             double[] adjaSat = new double[3] { cgRes.Adja1X.Value, cgRes.Adja1Y.Value, cgRes.Adja1Z.Value };
@@ -159,7 +160,7 @@ namespace XdCxRhDW.Api
         {
             if (cgRes.Dto1.Value == 0 || cgRes.Dto2.Value == 0)
             {
-                return new double[7] { 999, 999, 0, 999, 999, 0, -1};
+                return new double[7] { 999, 999, 0, 999, 999, 0, -1 };
             }
             double[] mainSat = new double[3] { cgRes.MainX.Value, cgRes.MainY.Value, cgRes.MainZ.Value };
             double[] adja1Sat = new double[3] { cgRes.Adja1X.Value, cgRes.Adja1Y.Value, cgRes.Adja1Z.Value };
@@ -188,7 +189,7 @@ namespace XdCxRhDW.Api
         {
             if (cgRes.Dto1.Value == 0 || cgRes.DtoCdb.Value == 0)
             {
-                return new double[7] { 999, 999, 0, 999, 999, 0, -1};
+                return new double[7] { 999, 999, 0, 999, 999, 0, -1 };
             }
             double[] mainSat = new double[3] { cgRes.MainX.Value, cgRes.MainY.Value, cgRes.MainZ.Value };
             double[] adjaSat = new double[3] { cgRes.Adja1X.Value, cgRes.Adja1Y.Value, cgRes.Adja1Z.Value };
@@ -204,7 +205,7 @@ namespace XdCxRhDW.Api
             X2D1_Pos20240305_Core(mainSat, adjaSat, cdbStation, satStation, satStation, satStation, satStation, satStation, refStation, zone, dto1, dtoCdb, ybDto1, ybDto2, res);
             ConvertToGeoPoint(res);
             var posRes = ConvertToGeoPoint(res);//精确搜索值
-            if (CalcConfidence&& IsGeoPoint2(posRes))
+            if (CalcConfidence && IsGeoPoint2(posRes))
             {
                 var posResGz = X2D1_GzPos(cgRes, sRes);
                 if (IsGeoPoint2(posResGz))
@@ -255,7 +256,7 @@ namespace XdCxRhDW.Api
         {
             if (cgRes.Dto1.Value == 0 || cgRes.DtoCdb.Value == 0)
             {
-                return new double[7] { 999, 999, 0, 999, 999, 0, -1};
+                return new double[7] { 999, 999, 0, 999, 999, 0, -1 };
             }
             double[] mainSat = new double[3] { cgRes.MainX.Value, cgRes.MainY.Value, cgRes.MainZ.Value };
             double[] adjaSat = new double[3] { cgRes.Adja1X.Value, cgRes.Adja1Y.Value, cgRes.Adja1Z.Value };
@@ -304,6 +305,123 @@ namespace XdCxRhDW.Api
             return posRes;
         }
 
+        public static double[] X2D1_PosNoRef_ZL(double[] posRes, CgRes cgRes, StationRes sRes)
+        {
+            if (cgRes.Dto1.Value == 0 || cgRes.DtoCdb.Value == 0)
+            {
+                return new double[7] { 999, 999, 0, 999, 999, 0, -1 };
+            }
+            double startLon = (int)sRes.CdbTxLon.Value - 20;
+            double endLon = (int)sRes.CdbTxLon.Value + 20;
+            double startLat = (int)sRes.CdbTxLat.Value - 20;
+            double endLat = (int)sRes.CdbTxLat.Value + 20;
+            List<(double, double, double, double)> list = new List<(double, double, double, double)>();
+            var recXYZ = PhysicsHelper.GeoToEcef((sRes.SatTxLon, sRes.SatTxLat, 0));
+            var cdbXYZ = PhysicsHelper.GeoToEcef((sRes.CdbTxLon.Value, sRes.CdbTxLat.Value, 0));
+            for (double lon = startLon; lon < endLon; lon += 0.0001)
+            {
+                int flag = 0;
+                for (double lat = startLat; lat < endLat; lat += 0.0001)
+                {
+                    var posXYZ = PhysicsHelper.GeoToEcef((lon, lat, 0));
+
+                    //目标-主星-接收站的时间(us)
+                    var dt1 = PhysicsHelper.Dto(posXYZ, (cgRes.MainX.Value, cgRes.MainY.Value, cgRes.MainZ.Value), recXYZ) * 1e6;
+
+                    //目标-超短站的时间(us)
+                    var dt3 = PhysicsHelper.Dto(posXYZ, cdbXYZ) * 1e6;
+                    var dto2 = Math.Abs(dt1 - dt3 - cgRes.DtoCdb.Value);
+                    if (dto2 > 100)
+                    {
+                        lat += 1;
+                        if (flag < 1)
+                            flag = 1;
+                        continue;
+                    }
+                    else if (dto2 > 50)
+                    {
+                        lat += 0.5;
+                        if (flag < 2)
+                            flag = 2;
+                        continue;
+                    }
+                    else if (dto2 > 20)
+                    {
+                        lat += 0.2;
+                        if (flag < 3)
+                            flag = 3;
+                        continue;
+                    }
+                    else if (dto2 > 5)
+                    {
+                        lat += 0.1;
+                        if (flag < 4)
+                            flag = 4;
+                        continue;
+                    }
+                    else if (dto2 > 2)
+                    {
+                        lat += 0.02;
+                        if (flag < 5)
+                            flag = 5;
+                        continue;
+                    }
+                    //目标-邻星-接收站的时间(us)
+                    var dt2 = PhysicsHelper.Dto(posXYZ, (cgRes.Adja1X.Value, cgRes.Adja1Y.Value, cgRes.Adja1Z.Value), recXYZ) * 1e6;
+                    var dto1 = Math.Abs(dt1 - dt2 - cgRes.Dto1.Value);
+                    //if (dto1 > 100)
+                    //{
+                    //    lat += 1;
+                    //    if (flag < 1)
+                    //        flag = 1;
+                    //    continue;
+                    //}
+                    //else if (dto1 > 50)
+                    //{
+                    //    lat += 0.5;
+                    //    if (flag < 2)
+                    //        flag = 2;
+                    //    continue;
+                    //}
+                    //else if (dto1 > 20)
+                    //{
+                    //    lat += 0.2;
+                    //    if (flag < 3)
+                    //        flag = 3;
+                    //    continue;
+                    //}
+                    //else if (dto1 > 5)
+                    //{
+                    //    lat += 0.1;
+                    //    if (flag < 4)
+                    //        flag = 4;
+                    //    continue;
+                    //}
+                    //else if (dto1 > 2)
+                    //{
+                    //    lat += 0.02;
+                    //    if (flag < 5)
+                    //        flag = 5;
+                    //    continue;
+                    //}
+                    list.Add((lon, lat, dto1, dto2));
+                }
+                if (flag == 1)
+                    lon += 1;
+                else if (flag == 2)
+                    lon += 0.5;
+                else if (flag == 3)
+                    lon += 0.2;
+                else if (flag == 4)
+                    lon += 0.1;
+                else if (flag == 5)
+                    lon += 0.02;
+            }
+
+            var val = list.OrderBy(p => p.Item3 + p.Item4).First();
+            return new double[7] { val.Item1, val.Item2, 0, 999, 999, 0, -1 };
+        }
+
         /// <summary>
         /// 融合定位带参,返回经度、纬度、高度、镜像点、置信度,数组长度为7
         /// </summary>
@@ -385,9 +503,9 @@ namespace XdCxRhDW.Api
         {
             if (cgRes.Dto1.Value == 0 || cgRes.Dto2.Value == 0)
             {
-                return new double[7] { 999, 999, 0, 999, 999, 0, -1};
+                return new double[7] { 999, 999, 0, 999, 999, 0, -1 };
             }
-            if (cgRes.Dto1.Value == 0 || cgRes.Dto2.Value == 0) return new double[7] { 999, 999, 0, 999, 999, 0, -1};
+            if (cgRes.Dto1.Value == 0 || cgRes.Dto2.Value == 0) return new double[7] { 999, 999, 0, 999, 999, 0, -1 };
             double[] mainSat = new double[3] { cgRes.MainX.Value, cgRes.MainY.Value, cgRes.MainZ.Value };
             double[] adjaSat1 = new double[3] { cgRes.Adja1X.Value, cgRes.Adja1Y.Value, cgRes.Adja1Z.Value };
             double[] adjaSat2 = new double[3] { cgRes.Adja2X.Value, cgRes.Adja2Y.Value, cgRes.Adja2Z.Value };
@@ -441,7 +559,7 @@ namespace XdCxRhDW.Api
                 else
                 {
                     posRes[6] = 0;
-                }    
+                }
             }
             return posRes;
         }
@@ -457,7 +575,7 @@ namespace XdCxRhDW.Api
         {
             if (cgRes.Dto1.Value == 0 || cgRes.Dto2.Value == 0)
             {
-                return new double[7] { 999, 999, 0, 999, 999, 0, -1};
+                return new double[7] { 999, 999, 0, 999, 999, 0, -1 };
             }
             double[] mainSat = new double[3] { cgRes.MainX.Value, cgRes.MainY.Value, cgRes.MainZ.Value };
             double[] adjaSat1 = new double[3] { cgRes.Adja1X.Value, cgRes.Adja1Y.Value, cgRes.Adja1Z.Value };
@@ -522,7 +640,7 @@ namespace XdCxRhDW.Api
         /// <returns></returns>
         public static double[] X3_PosTwoDfo(CgRes cgRes, StationRes sRes, bool CalcConfidence = false)
         {
-            if (cgRes.Dfo1.Value == 0 || cgRes.Dfo2.Value == 0) return new double[7] { 999, 999, 0, 999, 999, 0, -1};
+            if (cgRes.Dfo1.Value == 0 || cgRes.Dfo2.Value == 0) return new double[7] { 999, 999, 0, 999, 999, 0, -1 };
             double[] mainSat = new double[6] { cgRes.MainX.Value, cgRes.MainY.Value, cgRes.MainZ.Value, cgRes.MainVx.Value, cgRes.MainVy.Value, cgRes.MainVz.Value };
             double[] adjaSat1 = new double[6] { cgRes.Adja1X.Value, cgRes.Adja1Y.Value, cgRes.Adja1Z.Value, cgRes.Adja1Vx.Value, cgRes.Adja1Vy.Value, cgRes.Adja1Vz.Value };
             double[] adjaSat2 = new double[6] { cgRes.Adja2X.Value, cgRes.Adja2Y.Value, cgRes.Adja2Z.Value, cgRes.Adja2Vx.Value, cgRes.Adja2Vy.Value, cgRes.Adja2Vz.Value };
@@ -596,7 +714,7 @@ namespace XdCxRhDW.Api
         /// <returns></returns>
         public static double[] X2_PosDtoDfo(CgRes cgRes, StationRes sRes, bool CalcConfidence = false)
         {
-            if (cgRes.Dto1.Value == 0) return new double[7] { 999, 999, 0, 999, 999, 0, -1};
+            if (cgRes.Dto1.Value == 0) return new double[7] { 999, 999, 0, 999, 999, 0, -1 };
             double[] mainSat = new double[6] { cgRes.MainX.Value, cgRes.MainY.Value, cgRes.MainZ.Value, cgRes.MainVx.Value, cgRes.MainVy.Value, cgRes.MainVz.Value };
             double[] adjaSat = new double[6] { cgRes.Adja1X.Value, cgRes.Adja1Y.Value, cgRes.Adja1Z.Value, cgRes.Adja1Vx.Value, cgRes.Adja1Vy.Value, cgRes.Adja1Vz.Value };
             double[] satStation = new double[3] { sRes.SatTxLon, sRes.SatTxLat, 0 };

+ 88 - 1
XdCxRhDW.Api/AddIns/时差线/DrawDtoLineHelper.cs

@@ -6,6 +6,7 @@ using System.IO;
 using System.Linq;
 using System.Runtime.InteropServices;
 using System.Text;
+using XdCxRhDW.Entity;
 
 namespace XdCxRhDW.Api
 {
@@ -206,7 +207,93 @@ namespace XdCxRhDW.Api
             return mapDots;
         }
 
-
+        public static IEnumerable<(double lon, double lat)> DtoLineXdNoRefZl(DtoLineXdOption opt)
+        {
+            double startLon = (int)opt.CDBAnt[0] - 30;
+            double endLon = (int)opt.CDBAnt[0] + 30;
+            double startLat = (int)opt.CDBAnt[1] - 30;
+            double endLat = (int)opt.CDBAnt[1] + 30;
+            List<(double, double, double)> list2 = new List<(double, double, double)>();
+            var recXYZ = PhysicsHelper.GeoToEcef((opt.MsAnt[0], opt.MsAnt[1], opt.MsAnt[2]));
+            var cdbXYZ = PhysicsHelper.GeoToEcef((opt.CDBAnt[0], opt.CDBAnt[1], opt.CDBAnt[2]));
+            for (double lon = startLon; lon < endLon; lon += 0.01)
+            {
+                List<(double, double, double)> list = new List<(double, double, double)>();
+                int flag = 0;
+                for (double lat = startLat; lat < endLat; lat += 0.01)
+                {
+
+                    var posXYZ = PhysicsHelper.GeoToEcef((lon, lat, 0));
+
+                    //目标-主星-接收站的时间(us)
+                    var dt1 = PhysicsHelper.Dto(posXYZ, (opt.MsEph[0], opt.MsEph[1], opt.MsEph[2]), recXYZ) * 1e6;
+
+                    //目标-超短站的时间(us)
+                    var dt2 = PhysicsHelper.Dto(posXYZ, cdbXYZ) * 1e6;
+                    var dto = Math.Abs(dt1 - dt2 - opt.xdDto);
+                    if (dto > 100)
+                    {
+                        lat += 1;
+                        if (flag < 1)
+                            flag = 1;
+                        continue;
+                    }
+                    else if (dto > 50)
+                    {
+                        lat += 0.5;
+                        if (flag < 2)
+                            flag = 2;
+                        continue;
+                    }
+                    else if (dto > 20)
+                    {
+                        lat += 0.2;
+                        if (flag < 3)
+                            flag = 3;
+                        continue;
+                    }
+                    else if (dto > 5)
+                    {
+                        lat += 0.1;
+                        if (flag < 4)
+                            flag = 4;
+                        continue;
+                    }
+                    else if (dto > 2)
+                    {
+                        lat += 0.05;
+                        if (flag < 5)
+                            flag = 5;
+                        continue;
+                    }
+                    flag = 10;
+                    list.Add((lon, lat, dto));
+                }
+                if (list.Any())
+                {
+                    var p1 = list.OrderBy(p => p.Item3).FirstOrDefault();
+                    list2.Add(p1);
+                    var p2 = list.Where(p => p.Item3 < 0.01 && PhysicsHelper.DistanceGeo((p.Item1, p.Item2, 0), p1) > 5000).OrderBy(p => p.Item3).FirstOrDefault();
+                    if (p2 != default)
+                        list2.Add(p2);
+                }
+                else
+                {
+                    if (flag == 1)
+                        lon += 1;
+                    else if (flag == 2)
+                        lon += 0.5;
+                    else if (flag == 3)
+                        lon += 0.2;
+                    else if (flag == 4)
+                        lon += 0.1;
+                    else if (flag == 5)
+                        lon += 0.05;
+                }
+                list.Clear();
+            }
+            return list2.Select(p => (p.Item1, p.Item2)).OrderBy(p => p.Item1).OrderBy(p => p.Item2);
+        }
 
         /// <summary>
         /// 高轨双星时差线

+ 1 - 3
XdCxRhDW.App/Controllers/PosController.cs

@@ -485,7 +485,6 @@ namespace XdCxRhDW.App.Controllers
                 });
 
                 var res = PosApi.X2D1_Pos(cgRes, StationRes, dto.CalcConfidence);
-
                 PosRes posRes = new PosRes()
                 {
                     FreqUpHz = (long)cgRes.TarFreqUp.Value,
@@ -592,7 +591,7 @@ namespace XdCxRhDW.App.Controllers
                     TarFreqDown = dto.FreqDown,
                 });
                 var res = PosApi.X2D1_PosNoRef(cgRes, StationRes, dto.CalcConfidence);
-
+                PosApi.X2D1_PosNoRef_ZL(res,cgRes, StationRes);
                 PosRes posRes = new PosRes()
                 {
                     FreqUpHz = (long)cgRes.TarFreqUp.Value,
@@ -729,7 +728,6 @@ namespace XdCxRhDW.App.Controllers
                 });
 
                 var res = PosApi.X2D1_PosNoRef(cgRes, StationRes, dto.CalcConfidence);
-
                 PosRes posRes = new PosRes()
                 {
                     FreqUpHz = (long)cgRes.TarFreqUp.Value,

+ 7 - 2
XdCxRhDW.App/EditForms/X2D1DTOParamEditor.cs

@@ -215,10 +215,14 @@ namespace XdCxRhDW.App.EditForms
                     //mapControl1.DrawDtoLine($"[{msat},超短{CDBAnt[0]}°]时差线", xdDtoLine);
 
                     var xdDtoLine1 = DrawDtoLineHelper.DtoLineXdNoRefEx(dtoLineXd);
-                    mapControl1.DrawDtoLineTwo($"[{msat},超短{CDBAnt[0]}°]带参时差线2024", xdDtoLine1);
+                    mapControl1.DrawDtoLineTwo($"[{msat},超短{CDBAnt[0]}°]无参时差线", xdDtoLine1);
+
+                    var xdDtoLine2 = DrawDtoLineHelper.DtoLineXdNoRefZl(dtoLineXd);
+                    mapControl1.DrawDtoLine($"[{msat},超短{CDBAnt[0]}°]无参时差线zl", xdDtoLine2);
+
 
                     var tsDtoLine = DrawDtoLineHelper.DtoLine2XNoRefStart(twoStartOption);
-                   mapControl1.DrawDtoLine($"[{msat},{nsat}]时差线", tsDtoLine);
+                    mapControl1.DrawDtoLine($"[{msat},{nsat}]时差线", tsDtoLine);
                 }
             }
             catch (Exception ex)
@@ -341,6 +345,7 @@ namespace XdCxRhDW.App.EditForms
                         Adja1Z = dto.AdjaZ,
                     };
                     var res = PosApi.X2D1_PosNoRef(cgRes, StationRes);
+                    res = PosApi.X2D1_PosNoRef_ZL(res,cgRes, StationRes);
                     this.txtPosRes.Text = $"{info.PosResType.GetEnumDisplayName()}定位点:[{res[0]:f4},{res[1]:f4}] 镜像点:[{res[3]:f4},{res[4]:f4}]";
                 }
                 else