zoule пре 1 година
родитељ
комит
e0bc04eba7

+ 2 - 0
Service/X2D1TaskServer/App.config

@@ -40,6 +40,8 @@
 		<!--星历误差(单位:m)-->
 		<add key="EphErrm" value="10000"/>
 
+		<!--参估误差us-->
+		<add key="CgErr" value="4"/>
 	</appSettings>
 	<startup>
 		<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />

+ 7 - 2
Service/X2D1TaskServer/Service/TaskHistoryService.cs

@@ -6,6 +6,7 @@ using System.Linq;
 using System.Threading;
 using System.Threading.Tasks;
 using XdCxRhDW.Dto;
+using XdCxRhDW.Framework;
 
 namespace X2D1TaskServer54.Service
 {
@@ -170,6 +171,8 @@ namespace X2D1TaskServer54.Service
                 if (csvFile != null && mainFileTmp != null && adjaFileTmp != null && cdbFileTmp != null)
                 {
                     var lines = File.ReadAllLines(csvFile).Skip(1).ToList();
+                    Random r = new Random(2024);
+                    var dtoErr = AppConfigHelper.Get<int>("CgErr", 2);
                     for (int i = 0; i < lines.Count; i += 2)
                     {
                         var arr1 = lines[i].Split(',');
@@ -178,11 +181,11 @@ namespace X2D1TaskServer54.Service
                         var upFreqHz = (long)(Convert.ToDouble(arr1[1]) * 1e6);
                         var cdbLon = Convert.ToDouble(arr2[21]);
                         var cdbLat = Convert.ToDouble(arr2[22]);
-                        var dt1 = Convert.ToDouble(arr1[24]) * 1e6;//主邻1时差
+                        var dt1 = Convert.ToDouble(arr1[24]) * 1e6 + r.Next(-dtoErr, dtoErr) + Math.Round(r.NextDouble(), 3);//主邻1时差
                         var df1 = Convert.ToDouble(arr1[25]);//Hz
                         var snr1 = Convert.ToDouble(arr1[26]);
 
-                        var dt2 = Convert.ToDouble(arr2[24]) * 1e6;//主超短时差
+                        var dt2 = Convert.ToDouble(arr2[24]) * 1e6 + r.Next(-dtoErr, dtoErr) + Math.Round(r.NextDouble(), 3);//主超短时差
                         var df2 = Convert.ToDouble(arr2[25]);//Hz
                         var snr2 = Convert.ToDouble(arr2[26]);
 
@@ -306,6 +309,7 @@ namespace X2D1TaskServer54.Service
                             continue;
                         }
                         string msg = $"【任务{dto.ID}】目标信号[{paramInfo.TaskSig.FreqUp / 1e6:f3}MHz]";
+                        dto.CsvFileIndex = i;
                         await Pos(dto, paramInfo, deteRes, data1, data2, cts, msg, capTime, mainEph, adjaEph, refDto1, refDto2, cdbLoc);
                     }
 
@@ -326,6 +330,7 @@ namespace X2D1TaskServer54.Service
                     var detect = deteRes.First(r => r.Start == data1[i].Smpstart && r.Length == data1[i].Smplen);
                     X2D1PosDto x2D1 = new X2D1PosDto()
                     {
+                        CsvFileIndex = dto.CsvFileIndex,
                         TaskID = dto.ID,
                         SigTime = sigTime,
                         MainCode = paramInfo.Minfo.SatId,

+ 4 - 2
XdCxRhDW.App/Controllers/PosController.cs

@@ -118,6 +118,7 @@ namespace XdCxRhDW.App.Controllers
                     }
                     PosRes posRes = new PosRes()
                     {
+                        CsvFileIndex = dto.CsvFileIndex,
                         FreqUpHz = (long)cgRes.TarFreqUp.Value,
                         SigTime = cgRes.SigTime,
                         TaskInfoID = runTask.ID,
@@ -786,7 +787,7 @@ namespace XdCxRhDW.App.Controllers
                     if (dto.TaskID == null)
                     {
                         runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
-                        &&(p.PosType == EnumPosType.X3TwoDtoNoRef||p.PosType== EnumPosType.X3Leo1||p.PosType==EnumPosType.X3Leo) && p.TaskState == EnumTaskState.Running);
+                        && (p.PosType == EnumPosType.X3TwoDtoNoRef || p.PosType == EnumPosType.X3Leo1 || p.PosType == EnumPosType.X3Leo) && p.TaskState == EnumTaskState.Running);
                         if (runTask == null)
                         {
                             await XdCxRhDW.UI.Lib.LogHelper.Warning($"接收到三星双时差无参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
@@ -918,7 +919,7 @@ namespace XdCxRhDW.App.Controllers
                     if (dto.TaskID == null)
                     {
                         runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
-                        && ( p.PosType == EnumPosType.X3Leo1) && p.TaskState == EnumTaskState.Running);
+                        && (p.PosType == EnumPosType.X3Leo1) && p.TaskState == EnumTaskState.Running);
                         if (runTask == null)
                         {
                             await XdCxRhDW.UI.Lib.LogHelper.Warning($"接收到三星双时差无参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
@@ -1493,6 +1494,7 @@ namespace XdCxRhDW.App.Controllers
                 TargetInfoID = res.TargetInfoID,
                 UpdateTime = res.UpdateTime,
                 Confidence = res.Confidence,
+                CsvFileIndex = res.CsvFileIndex,
             };
         }
 

+ 83 - 24
XdCxRhDW.App/Controllers/ResultController.cs

@@ -304,27 +304,59 @@ namespace XdCxRhDW.App.Controllers
                 foreach (var item in list)
                 {
                     var dayFile = Path.Combine(dir, item);
-                    using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile))
+                    try
                     {
-                        if (db == null) continue;
-                        var query = db.PosRes.Where(p => p.SigTime >= start && p.SigTime <= end && p.TaskInfoID == dto.TaskInfoID);
-                        if (!dto.IncludeInvalidate)
-                            query = query.Where(p => p.PosLon != 999);
-                        if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0)
-                            query = query.Where(p => p.FreqUpHz == dto.TarFrequpHz.Value);
-                        var posRes = await query.Include(p => p.CheckRes).OrderByDescending(p => p.SigTime).ToListAsync();
+                        using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile))
+                        {
+                            if (db == null) continue;
+                            var query = db.PosRes.Where(p => p.SigTime >= start && p.SigTime <= end && p.TaskInfoID == dto.TaskInfoID);
+                            if (!dto.IncludeInvalidate)
+                                query = query.Where(p => p.PosLon != 999);
+                            if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0)
+                                query = query.Where(p => p.FreqUpHz == dto.TarFrequpHz.Value);
+                            var posRes = await query.Include(p => p.CheckRes).OrderByDescending(p => p.SigTime).ToListAsync();
 
-                        foreach (var itemPos in posRes)
+                            foreach (var itemPos in posRes)
+                            {
+                                if (itemPos.TargetInfoID > 0)
+                                {
+                                    itemPos.TargetInfo = targets.FirstOrDefault(p => p.ID == itemPos.TargetInfoID);
+                                    if (itemPos.TargetInfo != null && !string.IsNullOrWhiteSpace(itemPos.TargetInfo.TargeColor))
+                                        itemPos.ColorKey = itemPos.TargetInfo.TargeColor;
+
+                                }
+                            }
+                            posList.AddRange(posRes);
+                        }
+                    }
+                    catch (Exception ex)
+                    {
+                        using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile))
                         {
-                            if (itemPos.TargetInfoID > 0)
+                            db.SyncDb();
+                        }
+                        using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile))
+                        {
+                            if (db == null) continue;
+                            var query = db.PosRes.Where(p => p.SigTime >= start && p.SigTime <= end && p.TaskInfoID == dto.TaskInfoID);
+                            if (!dto.IncludeInvalidate)
+                                query = query.Where(p => p.PosLon != 999);
+                            if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0)
+                                query = query.Where(p => p.FreqUpHz == dto.TarFrequpHz.Value);
+                            var posRes = await query.Include(p => p.CheckRes).OrderByDescending(p => p.SigTime).ToListAsync();
+
+                            foreach (var itemPos in posRes)
                             {
-                                itemPos.TargetInfo = targets.FirstOrDefault(p => p.ID == itemPos.TargetInfoID);
-                                if (itemPos.TargetInfo != null && !string.IsNullOrWhiteSpace(itemPos.TargetInfo.TargeColor))
-                                    itemPos.ColorKey = itemPos.TargetInfo.TargeColor;
+                                if (itemPos.TargetInfoID > 0)
+                                {
+                                    itemPos.TargetInfo = targets.FirstOrDefault(p => p.ID == itemPos.TargetInfoID);
+                                    if (itemPos.TargetInfo != null && !string.IsNullOrWhiteSpace(itemPos.TargetInfo.TargeColor))
+                                        itemPos.ColorKey = itemPos.TargetInfo.TargeColor;
 
+                                }
                             }
+                            posList.AddRange(posRes);
                         }
-                        posList.AddRange(posRes);
                     }
                 }
                 return Success(posList);
@@ -445,22 +477,49 @@ namespace XdCxRhDW.App.Controllers
                     var dayFiles = Directory.EnumerateFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, yearDir), "*.db").OrderByDescending(p => Convert.ToInt32(new DirectoryInfo(p).Name.Substring(0, 4)));
                     foreach (var dayFile in dayFiles)
                     {
-                        using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile))
+                        try
                         {
-                            if (db == null) continue;
-                            var query = db.PosRes.Where(p => p.TaskInfoID == dto.TaskInfoID);
-                            if (!dto.IncludeInvalidate)
+                            using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile))
                             {
-                                query = query.Where(p => p.PosLon != 999);
+                                if (db == null) continue;
+                                var query = db.PosRes.Where(p => p.TaskInfoID == dto.TaskInfoID);
+                                if (!dto.IncludeInvalidate)
+                                {
+                                    query = query.Where(p => p.PosLon != 999);
 
+                                }
+                                if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0)
+                                {
+                                    query = query.Where(p => p.FreqUpHz == dto.TarFrequpHz);
+                                }
+                                bool any = await query.AnyAsync();
+                                if (any)
+                                    max = await query.MaxAsync(p => p.SigTime);
                             }
-                            if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0)
+                        }
+                        catch (Exception ex)
+                        {
+                            using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile))
+                            {
+                                db.SyncDb();
+                            }
+                            using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile))
                             {
-                                query = query.Where(p => p.FreqUpHz == dto.TarFrequpHz);
+                                if (db == null) continue;
+                                var query = db.PosRes.Where(p => p.TaskInfoID == dto.TaskInfoID);
+                                if (!dto.IncludeInvalidate)
+                                {
+                                    query = query.Where(p => p.PosLon != 999);
+
+                                }
+                                if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0)
+                                {
+                                    query = query.Where(p => p.FreqUpHz == dto.TarFrequpHz);
+                                }
+                                bool any = await query.AnyAsync();
+                                if (any)
+                                    max = await query.MaxAsync(p => p.SigTime);
                             }
-                            bool any = await query.AnyAsync();
-                            if (any)
-                                max = await query.MaxAsync(p => p.SigTime);
                         }
                         if (max != DateTime.MinValue)
                         {

+ 75 - 4
XdCxRhDW.App/UserControl/CtrlHome.cs

@@ -16,8 +16,10 @@ using System.Data.Entity;
 using System.Data.Entity.Migrations;
 using System.Diagnostics;
 using System.Drawing;
+using System.IO;
 using System.Linq;
 using System.Net;
+using System.Security.Cryptography;
 using System.Security.Policy;
 using System.Threading;
 using System.Threading.Tasks;
@@ -164,8 +166,50 @@ namespace XdCxRhDW.App.UserControl
                 mapControl1.AddRectMenu<ModelPosRes>("删除定位点", SvgHelper.CreateClose(), async items => await DeletePosRes(items.ToList()))
                 .AddRectMenu<ModelPosRes>("使用镜像点", SvgHelper.CreateUseMirr(), async items => await UseMirr(items.ToList()))
                 .AddRectMenu<ModelPosRes>("编辑目标", SvgHelper.CreateEdit(), async items => await EditTarget(items.ToList()))
-                .AddRectMenu<ModelPosRes>("转到列表", SvgHelper.CreateGoto(),
-                items => ToPosList(items.ToList()));
+                .AddRectMenu<ModelPosRes>("转到列表", SvgHelper.CreateGoto(), items => ToPosList(items.ToList()))
+                .AddRectMenu<ModelPosRes>("误差统计", SvgHelper.CreateDistanceLine(), data =>
+                {
+                    OpenFileDialog dialog = new OpenFileDialog();
+                    if (dialog.ShowDialog() == DialogResult.OK)
+                    {
+                        string csv = dialog.FileName;
+                        var lines = File.ReadAllLines(csv).Skip(1).ToList();
+                        List<string> wlines = new List<string>();
+                        List<double> listDis = new List<double>();
+                        foreach (var item in data)
+                        {
+                            if (item.CsvFileIndex == null) continue;
+                            var line = lines[item.CsvFileIndex.Value + 1];
+                            var arr = line.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
+                            var lonStr = arr[3];
+                            var latStr = arr[4];
+                            var lon = GetLonLat(lonStr);
+                            var lat = GetLonLat(latStr);
+                            var dis1 = (int)PhysicsHelper.DistanceGeo((lon, lat, 0), (item.PosLon, item.PosLat, 0));
+
+                            var lonStr2 = arr[5];
+                            var latStr2 = arr[6];
+                            var lon2 = GetLonLat(lonStr2);
+                            var lat2 = GetLonLat(latStr2);
+                            var dis2 = (int)PhysicsHelper.DistanceGeo((lon2, lat2, 0), (item.PosLon, item.PosLat, 0));
+                            if (dis1 < dis2)
+                            {
+                                string wline = $"{item.SigTime.Year}\t{item.SigTime.Month:D2}\t{item.SigTime.Day:D2}\t{item.SigTime.Hour:D2}\t{item.SigTime.Minute:D2}\t{item.SigTime.Second:D2}\t{item.SigTime.Millisecond:D3}\t{GetLonLat(lon)}\t{GetLonLat(lat)}\t{GetLonLat(item.PosLon)}\t{GetLonLat(item.PosLat)}\t{dis1:D5}\t";
+                                listDis.Add(dis1);
+                                wlines.Add(wline);
+                            }
+                            else
+                            {
+                                string wline = $"{item.SigTime.Year}\t{item.SigTime.Month:D2}\t{item.SigTime.Day:D2}\t{item.SigTime.Hour:D2}\t{item.SigTime.Minute:D2}\t{item.SigTime.Second:D2}\t{item.SigTime.Millisecond:D3}\t{GetLonLat(lon2)}\t{GetLonLat(lat2)}\t{GetLonLat(item.PosLon)}\t{GetLonLat(item.PosLat)}\t{dis2:D5}\t";
+                                listDis.Add(dis2);
+                                wlines.Add(wline);
+                            }
+
+                        }
+                        File.WriteAllLines("误差统计.txt", wlines);
+                        DxHelper.MsgBoxHelper.ShowInfo($"最大误差:{listDis.Max():f0}m\r\n平均误差:{listDis.Average():f0}m\r\n详情请查看误差统计.txt文件");
+                    }
+                });
 
             }
             catch (Exception ex)
@@ -185,7 +229,34 @@ namespace XdCxRhDW.App.UserControl
             txtTimeCho_SelectedIndexChanged(null, null);
             WaitHelper.CloseForm();
         }
+        private string GetLonLat(double lon)
+        {
+            var tmp = lon * 1e6;
+            long val = (long)tmp;
+            return val.ToString("D10");
+        }
 
+        private double GetLonLat(string lonLatStr)
+        {
+            try
+            {
+                var lonD = lonLatStr.Split("°".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)[0];
+                var tmp = lonLatStr.Replace(lonD + "°", "");
+                var lonF = tmp.Split("′".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)[0];
+                tmp = tmp.Replace(lonF + "′", "");
+                var lonM = tmp.Split("″".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)[0];
+
+                var dLonD = Convert.ToDouble(lonD);
+                var dLonF = Convert.ToDouble(lonF);
+                var dLonM = Convert.ToDouble(lonM);
+                var val = dLonD + dLonF / 60d + dLonM / 3600d;
+                return val;
+            }
+            catch
+            {
+                return 0;
+            }
+        }
         private void OnSysSetingsChanged(SysSetings settings)
         {
             if (settings.MapType == 0)
@@ -1710,7 +1781,7 @@ namespace XdCxRhDW.App.UserControl
             }
             catch (Exception ex)
             {
-                XdCxRhDW.Framework.LogHelper.Error( "使用镜像点失败!", ex);
+                XdCxRhDW.Framework.LogHelper.Error("使用镜像点失败!", ex);
                 MsgBoxHelper.ShowError("使用镜像点失败!");
             }
 
@@ -1747,7 +1818,7 @@ namespace XdCxRhDW.App.UserControl
             }
             catch (Exception ex)
             {
-                XdCxRhDW.Framework.LogHelper.Error( "删除定位点失败", ex);
+                XdCxRhDW.Framework.LogHelper.Error("删除定位点失败", ex);
                 MsgBoxHelper.ShowError("删除定位点失败!");
             }
         }

+ 2 - 0
XdCxRhDW.Entity/PosRes.cs

@@ -92,6 +92,8 @@ namespace XdCxRhDW.Entity
         [ToolTip]
         public EnumTargetState TargetState { get; set; }
 
+        public int? CsvFileIndex { get; set; }
+
 
     }
 }

+ 4 - 0
XdCxRhDw.Dto/PosDto/X2D1PosDto.cs

@@ -211,5 +211,9 @@ namespace XdCxRhDW.Dto
         /// </summary>
         public bool CalcConfidence { get; set; } = false;
 
+        /// <summary>
+        /// 数据来自105导出的CSV中的行号,用来做误差对比
+        /// </summary>
+        public int? CsvFileIndex { get; set; }
     }
 }

+ 5 - 0
XdCxRhDw.Dto/TaskHandleDto/X2D1TaskHandleDto.cs

@@ -107,5 +107,10 @@ namespace XdCxRhDW.Dto
         /// </summary>
         public double RefLat { get; set; }
 
+        /// <summary>
+        /// 数据来自105导出的CSV中的行号,用来做误差对比
+        /// </summary>
+        public int? CsvFileIndex { get; set; }
+
     }
 }