using System; using System.Collections.Generic; using System.Data.Entity; using System.Data.SqlClient; using System.Data.SQLite; using System.Linq; using System.Net.Http; using System.Security.Cryptography.Xml; using System.Text; using System.Threading.Tasks; using System.Web.Http; using System.Windows.Documents; using DevExpress.Mvvm.Native; using DevExpress.XtraCharts; using DevExpress.XtraPrinting; using Newtonsoft.Json; using PosResAnalysis; using Serilog; using Swashbuckle.Swagger; using XdCxRhDw.Dto; using XdCxRhDW.App.Api; using XdCxRhDW.App.App.Properties; using XdCxRhDW.App.Basic; using XdCxRhDW.App.EFContext; using XdCxRhDW.App.Model; using XdCxRhDW.App.WebAPI.DTO; using XdCxRhDW.Dto; using static System.Windows.Forms.VisualStyles.VisualStyleElement.TextBox; using static XdCxRhDw.CpuCgTools.FormCpuCg; using CgRes = XdCxRhDW.App.Model.CgRes; namespace XdCxRhDW.App.WebAPI { /// /// 定位功能相关接口 /// public class PosController : BaseController { #region 带参有星历 /// /// 一星一地测向带参定位(含星历) /// /// 定位参数 /// [HttpPost] public async Task> PosX1D1Async(X1D1PosDto dto) { using (RHDWContext db = new RHDWContext()) { var runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X1D1CX && p.TaskState == EnumTaskState.Running); if (runTask == null) { Serilog.Log.Warning($"接收到一星一地测向带参定位(含星历)参数,由于任务没有运行中忽略本次定位!"); return Error($"多模式融合定位平台没有启动一星一地测向定位任务"); } var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, DtoCdb = dto.XdDto * 1e6, DfoCdb = dto.XdDfo * 1e6, SnrCdb = dto.XdSnr, YbMain = dto.MainYbDto * 1e6, MainX = dto.MainX, MainY = dto.MainY, MainZ = dto.MainZ, }); var cxRes = db.CxRes.Add(new CxRes() { SigTime = dto.SigTime, Fx = dto.CxRes, }); var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.StationResInfo.SatTxLon, SatTxLat = dto.StationResInfo.SatTxLat, CdbTxLon = dto.StationResInfo.CdbTxLon, CdbTxLat = dto.StationResInfo.CdbTxLat, CxLon = dto.StationResInfo.CxLon, CxLat = dto.StationResInfo.CxLat, RefLon = dto.StationResInfo.RefLon, RefLat = dto.StationResInfo.RefLat, }); double[] res = new double[6]; double[] mainSat = new double[3] { cgRes.MainX, cgRes.MainY, cgRes.MainZ }; double[] satStation = new double[3] { dto.StationResInfo.SatTxLon, dto.StationResInfo.SatTxLat, 0 }; double[] cdbStation = new double[3] { dto.StationResInfo.CdbTxLon, dto.StationResInfo.CdbTxLat, 0 }; double[] cxStation = new double[3] { dto.StationResInfo.CxLon, dto.StationResInfo.CxLat, 0 }; double[] refStation = new double[3] { dto.StationResInfo.RefLon, dto.StationResInfo.RefLat, 0 }; double[] zone = new double[] { -85, 85, -180, 180 }; //定位区域 double theta = cxRes.Fx;//单位° PosApi.X1D1_POS2023_Core(mainSat, satStation, cdbStation, cxStation, refStation, zone, theta, cgRes.DtoCdb.Value / 1e6, cgRes.YbMain.Value / 1e6, res); PosRes posRes = new PosRes() { SigTime = cgRes.SigTime, TaskInfoID = runTask.ID, CxResID = cxRes.ID, CgResID = cgRes.ID, TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName, TsName = dto.TsName, PosLon = Math.Round(res[0], 4), PosLat = Math.Round(res[1], 4), MirrLon = Math.Round(res[3], 4), MirrLat = Math.Round(res[4], 4), }; db.PosRes.Add(posRes); await db.SaveChangesAsync(); return Success(posRes); } } /// /// 两星一地带参定位(含星历) /// /// 定位参数 /// [HttpPost] public async Task> PosX2D1Async(X2D1PosDto dto) { using (RHDWContext db = new RHDWContext()) { var runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running); if (runTask == null) { Serilog.Log.Warning($"接收到两星一地带参定位(含星历)参数,由于任务没有运行中忽略本次定位!"); return Error($"多模式融合定位平台没有启动两星一地定位任务"); } var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, DtoSx = dto.SxDto * 1e6, DfoSx = dto.SxDfo * 1e6, SnrSx = dto.SxSnr, DtoCdb = dto.XdDto * 1e6, DfoCdb = dto.XdDfo * 1e6, SnrCdb = dto.XdSnr, YbMain = dto.MainYbDto * 1e6, YbAdja = dto.AdjaYbDto * 1e6, MainX = dto.MainX, MainY = dto.MainY, MainZ = dto.MainZ, AdjaX = dto.AdjaX, AdjaY = dto.AdjaY, AdjaZ = dto.AdjaZ, }); var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.StationResInfo.SatTxLon, SatTxLat = dto.StationResInfo.SatTxLat, CdbTxLon = dto.StationResInfo.CdbTxLon, CdbTxLat = dto.StationResInfo.CdbTxLat, CxLon = dto.StationResInfo.CxLon, CxLat = dto.StationResInfo.CxLat, RefLon = dto.StationResInfo.RefLon, RefLat = dto.StationResInfo.RefLat, }); double[] res = new double[6]; double[] mainSat = new double[3] { cgRes.MainX, cgRes.MainY, cgRes.MainZ }; double[] adjaSat = new double[3] { cgRes.AdjaX, cgRes.AdjaY, cgRes.AdjaZ }; double[] satStation = new double[3] { dto.StationResInfo.SatTxLon, dto.StationResInfo.SatTxLat, 0 }; double[] cdbStation = new double[3] { dto.StationResInfo.CdbTxLon, dto.StationResInfo.CdbTxLat, 0 }; double[] cxStation = new double[3] { dto.StationResInfo.CxLon, dto.StationResInfo.CxLat, 0 }; double[] refStation = new double[3] { dto.StationResInfo.RefLon, dto.StationResInfo.RefLat, 0 }; double[] zone = new double[] { -85, 85, -180, 180 }; //定位区域 PosApi.X2D1_POS_Core(mainSat, adjaSat, cdbStation, satStation, satStation, satStation, satStation, satStation, refStation, zone, cgRes.DtoSx.Value / 1e6, cgRes.DtoCdb.Value / 1e6, cgRes.YbMain.Value / 1e6, cgRes.YbAdja.Value / 1e6, res); PosRes posRes = new PosRes() { SigTime = cgRes.SigTime, TaskInfoID = runTask.ID, CgResID = cgRes.ID, TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName, TsName = dto.TsName, PosLon = Math.Round(res[0], 4), PosLat = Math.Round(res[1], 4), MirrLon = Math.Round(res[3], 4), MirrLat = Math.Round(res[4], 4), }; db.PosRes.Add(posRes); await db.SaveChangesAsync(); return Success(posRes); } } /// /// 融合带参定位(含星历) /// /// 定位参数 /// [HttpPost] public async Task> PosRhAsync(RHPosDto dto) { using (RHDWContext db = new RHDWContext()) { var runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.RH && p.TaskState == EnumTaskState.Running); if (runTask == null) { Serilog.Log.Warning($"接收到融合带参定位(含星历)参数,由于任务没有运行中忽略本次定位!"); return Error($"多模式融合定位平台没有启动两星一地定位任务"); } var listTx = new List(); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, DtoSx = dto.SxDto * 1e6, DfoSx = dto.SxDfo * 1e6, SnrSx = dto.SxSnr, DtoCdb = dto.XdDto * 1e6, DfoCdb = dto.XdDfo * 1e6, SnrCdb = dto.XdSnr, YbMain = dto.MainYbDto * 1e6, YbAdja = dto.AdjaYbDto * 1e6, MainX = dto.MainX, MainY = dto.MainY, MainZ = dto.MainZ, AdjaX = dto.AdjaX, AdjaY = dto.AdjaY, AdjaZ = dto.AdjaZ, }); var cxRes = db.CxRes.Add(new CxRes() { SigTime = dto.SigTime, Fx = dto.CxRes, }); var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.StationResInfo.SatTxLon, SatTxLat = dto.StationResInfo.SatTxLat, CdbTxLon = dto.StationResInfo.CdbTxLon, CdbTxLat = dto.StationResInfo.CdbTxLat, CxLon = dto.StationResInfo.CxLon, CxLat = dto.StationResInfo.CxLat, RefLon = dto.StationResInfo.RefLon, RefLat = dto.StationResInfo.RefLat, }); double[] resX1D1 = new double[6]; double[] resX2D1 = new double[6]; double[] mainSat = new double[3] { cgRes.MainX, cgRes.MainY, cgRes.MainZ }; double[] adjaSat = new double[3] { cgRes.AdjaX, cgRes.AdjaY, cgRes.AdjaZ }; double[] satStation = new double[3] { dto.StationResInfo.SatTxLon, dto.StationResInfo.SatTxLat, 0 }; double[] cdbStation = new double[3] { dto.StationResInfo.CdbTxLon, dto.StationResInfo.CdbTxLat, 0 }; double[] cxStation = new double[3] { dto.StationResInfo.CxLon, dto.StationResInfo.CxLat, 0 }; double[] refStation = new double[3] { dto.StationResInfo.RefLon, dto.StationResInfo.RefLat, 0 }; double[] zone = new double[] { -85, 85, -180, 180 }; //定位区域 double theta = cxRes.Fx;//单位° PosApi.X1D1_POS2023_Core(mainSat, satStation, cdbStation, cxStation, refStation, zone, theta, cgRes.DtoCdb.Value / 1e6, cgRes.YbMain.Value / 1e6, resX1D1); PosApi.X2D1_POS_Core(mainSat, adjaSat, cdbStation, satStation, satStation, satStation, satStation, satStation, refStation, zone, cgRes.DtoSx.Value / 1e6, cgRes.DtoCdb.Value / 1e6, cgRes.YbMain.Value / 1e6, cgRes.YbAdja.Value / 1e6, resX2D1); double[] res = new double[] { 999, 999, 0, 999, 999, 0 }; if (PosApi.IsGeoPoint(resX1D1) && PosApi.IsGeoPoint(resX2D1)) { res = new double[6] { (resX1D1[0] + resX2D1[0]) / 2 + 0.003, (resX1D1[1] + resX2D1[1]) / 2 - 0.002, (resX1D1[2] + resX2D1[2]) / 2, (resX1D1[3] + resX2D1[3]) / 2 + 0.003, (resX1D1[4] + resX2D1[4]) / 2 - 0.002, (resX1D1[5] + resX2D1[5]) / 2, }; } else if (PosApi.IsGeoPoint(resX1D1)) { res = new double[6] { resX1D1[0] + 0.003, resX1D1[1] - 0.002, resX1D1[2], resX1D1[3] + 0.003, resX1D1[4] - 0.002, resX1D1[5], }; } else if (PosApi.IsGeoPoint(resX2D1)) { res = new double[6] { resX2D1[0] + 0.003, resX2D1[1] - 0.002, resX2D1[2], resX2D1[3] + 0.003, resX2D1[4] - 0.002, resX2D1[5], }; } PosRes posRes = new PosRes() { SigTime = cgRes.SigTime, TaskInfoID = runTask.ID, CxResID = cxRes.ID, CgResID = cgRes.ID, TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName, TsName = dto.TsName, PosLon = Math.Round(res[0], 4), PosLat = Math.Round(res[1], 4), MirrLon = Math.Round(res[3], 4), MirrLat = Math.Round(res[4], 4), }; db.PosRes.Add(posRes); await db.SaveChangesAsync(); return Success(posRes); } } #endregion #region 带参无星历 /// /// 一星一地带参定位(无星历) /// /// 返回定位结果ID [HttpPost] public async Task> PosX1D1NoXlAsync(X1D1NoXlPosDto dto) { using (RHDWContext db = new RHDWContext()) { var runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X1D1CX).FirstOrDefaultAsync(); if (runTask == null) { Serilog.Log.Warning($"接收到一星一地带参定位(无星历)参数,由于任务没有运行中忽略本次定位!"); return Error($"多模式融合定位平台没有启动一星一地定位任务"); } var parameter1 = new SQLiteParameter("@sigTime", dto.SigTime); var parameter2 = new SQLiteParameter("@satcode", dto.MainSatID); var xlInfo1 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter2).FirstOrDefaultAsync(); if (xlInfo1 == null) { Serilog.Log.Error($"未找到卫星[{dto.MainSatID}]的双行根数星历"); return Error($"未找到卫星[{dto.MainSatID}]的双行根数星历"); } Serilog.Log.Information($"卫星{dto.MainSatID}使用{xlInfo1.TwoLine}进行星历推算"); var settings = await db.SysSetings.FirstOrDefaultAsync(); var client = new HttpClient(); string url = string.Format("http://{0}:{1}/Api/", IpHelper.GetLocalIp(), settings.HttpPort); url += string.Format("Xl/Calc?tleStr={0}&dt={1}", xlInfo1.TwoLine, dto.SigTime); var response = await client.GetAsync(url); if (!response.IsSuccessStatusCode) // 处理响应失败 { Serilog.Log.Error($"[{dto.MainSatID}]星厉推算失败"); return Error($"[{dto.MainSatID}]星厉推算失败"); } var content = await response.Content.ReadAsStringAsync(); var ephMain = JsonConvert.DeserializeObject>(content).data; //var ephMain = EphHelper.Calc(xlInfo1.TwoLine, dto.SigTime); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, DtoCdb = dto.XdDto * 1e6, DfoCdb = dto.XdDfo * 1e6, SnrCdb = dto.XdSnr, YbMain = dto.MainYbDto * 1e6, MainX = ephMain.X, MainY = ephMain.Y, MainZ = ephMain.Z, }); var cxRes = db.CxRes.Add(new CxRes() { SigTime = dto.SigTime, Fx = dto.CxRes, }); var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.StationResInfo.SatTxLon, SatTxLat = dto.StationResInfo.SatTxLat, CdbTxLon = dto.StationResInfo.CdbTxLon, CdbTxLat = dto.StationResInfo.CdbTxLat, CxLon = dto.StationResInfo.CxLon, CxLat = dto.StationResInfo.CxLat, RefLon = dto.StationResInfo.RefLon, RefLat = dto.StationResInfo.RefLat, }); double[] res = new double[6]; double[] mainSat = new double[3] { cgRes.MainX, cgRes.MainY, cgRes.MainZ }; double[] satStation = new double[3] { dto.StationResInfo.SatTxLon, dto.StationResInfo.SatTxLat, 0 }; double[] cdbStation = new double[3] { dto.StationResInfo.CdbTxLon, dto.StationResInfo.CdbTxLat, 0 }; double[] cxStation = new double[3] { dto.StationResInfo.CxLon, dto.StationResInfo.CxLat, 0 }; double[] refStation = new double[3] { dto.StationResInfo.RefLon, dto.StationResInfo.RefLat, 0 }; double[] zone = new double[] { -85, 85, -180, 180 }; //定位区域 double theta = cxRes.Fx;//单位° PosApi.X1D1_POS2023_Core(mainSat, satStation, cdbStation, cxStation, refStation, zone, theta, cgRes.DtoCdb.Value / 1e6, cgRes.YbMain.Value / 1e6, res); PosRes posRes = new PosRes() { SigTime = dto.SigTime, TaskInfoID = runTask.ID, CgResID = cgRes.ID, TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName, TsName = dto.TsName, PosLon = res[0], PosLat = res[1], MirrLon = res[3], MirrLat = res[4], }; db.PosRes.Add(posRes); await db.SaveChangesAsync(); return Success(posRes); } } /// /// 两星一地带参定位(无星历) /// /// 返回定位结果ID [HttpPost] public async Task> PosX2D1NoXlAsync(X2D1NoXlPosDto dto) { using (RHDWContext db = new RHDWContext()) { var runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X2D1).FirstOrDefaultAsync(); if (runTask == null) { Serilog.Log.Warning($"接收到两星一地带参定位(无星历)参数,由于任务没有运行中忽略本次定位!"); return Error($"多模式融合定位平台没有启动两星一地定位任务"); } var parameter1 = new SQLiteParameter("@sigTime", dto.SigTime); var parameter2 = new SQLiteParameter("@satcode", dto.MainSatID); var parameter3 = new SQLiteParameter("@satcode", dto.AdjaSatID); var xlInfo1 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter2).FirstOrDefaultAsync(); if (xlInfo1 == null) { Serilog.Log.Error($"未找到卫星[{dto.MainSatID}]的双行根数星历"); return Error($"未找到卫星[{dto.MainSatID}]的双行根数星历"); } var xlInfo2 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter3).FirstOrDefaultAsync(); if (xlInfo2 == null) { Serilog.Log.Error($"未找到卫星[{dto.AdjaSatID}]的双行根数星历"); return Error($"未找到卫星[{dto.AdjaSatID}]的双行根数星历"); } Serilog.Log.Information($"卫星{dto.MainSatID}使用{xlInfo1.TwoLine}进行星历推算"); Serilog.Log.Information($"卫星{dto.AdjaSatID}使用{xlInfo2.TwoLine}进行星历推算"); var settings = await db.SysSetings.FirstOrDefaultAsync(); var client = new HttpClient(); string url = string.Format("http://{0}:{1}/Api/", IpHelper.GetLocalIp(), settings.HttpPort); var url1 = string.Format(url + "Xl/Calc?tleStr={0}&dt={1}", xlInfo1.TwoLine, dto.SigTime); var response = await client.GetAsync(url1); if (!response.IsSuccessStatusCode) // 处理响应失败 { Serilog.Log.Error($"[{dto.MainSatID}]星厉推算失败"); return Error($"[{dto.MainSatID}]星厉推算失败"); } var content = await response.Content.ReadAsStringAsync(); var ephMain = JsonConvert.DeserializeObject>(content).data; var url2 = string.Format(url + "Xl/Calc?tleStr={0}&dt={1}", xlInfo2.TwoLine, dto.SigTime); var response2 = await client.GetAsync(url2); if (!response2.IsSuccessStatusCode) // 处理响应失败 { Serilog.Log.Error($"[{dto.AdjaSatID}]星厉推算失败"); return Error($"[{dto.AdjaSatID}]星厉推算失败"); } var content2 = await response2.Content.ReadAsStringAsync(); var ephAdja = JsonConvert.DeserializeObject>(content2).data; //var ephMain = EphHelper.Calc(xlInfo1.TwoLine, dto.SigTime); //var ephAdja = EphHelper.Calc(xlInfo2.TwoLine, dto.SigTime); var cgRes = db.CgRes.Add(new Model.CgRes() { SigTime = dto.SigTime, DtoSx = dto.SxDto * 1e6, DfoSx = dto.SxDfo * 1e6, SnrSx = dto.SxSnr, DtoCdb = dto.XdDto * 1e6, DfoCdb = dto.XdDfo * 1e6, SnrCdb = dto.XdSnr, YbMain = dto.MainYbDto * 1e6, YbAdja = dto.AdjaYbDto * 1e6, MainX = ephMain.X, MainY = ephMain.Y, MainZ = ephMain.Z, AdjaX = ephAdja.X, AdjaY = ephAdja.Y, AdjaZ = ephAdja.Z, }); var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.StationResInfo.SatTxLon, SatTxLat = dto.StationResInfo.SatTxLat, CdbTxLon = dto.StationResInfo.CdbTxLon, CdbTxLat = dto.StationResInfo.CdbTxLat, CxLon = dto.StationResInfo.CxLon, CxLat = dto.StationResInfo.CxLat, RefLon = dto.StationResInfo.RefLon, RefLat = dto.StationResInfo.RefLat, }); double[] res = new double[6]; double[] mainSat = new double[3] { cgRes.MainX, cgRes.MainY, cgRes.MainZ }; double[] adjaSat = new double[3] { cgRes.AdjaX, cgRes.AdjaY, cgRes.AdjaZ }; double[] satStation = new double[3] { dto.StationResInfo.SatTxLon, dto.StationResInfo.SatTxLat, 0 }; double[] cdbStation = new double[3] { dto.StationResInfo.CdbTxLon, dto.StationResInfo.CdbTxLat, 0 }; double[] cxStation = new double[3] { dto.StationResInfo.CxLon, dto.StationResInfo.CxLat, 0 }; double[] refStation = new double[3] { dto.StationResInfo.RefLon, dto.StationResInfo.RefLat, 0 }; double[] zone = new double[] { -85, 85, -180, 180 }; //定位区域 PosApi.X2D1_POS_Core(mainSat, adjaSat, cdbStation, satStation, satStation, satStation, satStation, satStation, refStation, zone, cgRes.DtoSx.Value / 1e6, cgRes.DtoCdb.Value / 1e6, dto.MainYbDto / 1e6, dto.AdjaYbDto / 1e6, res); PosRes posRes = new PosRes() { SigTime = dto.SigTime, TaskInfoID = runTask.ID, CgResID = cgRes.ID, TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName, TsName = dto.TsName, PosLon = res[0], PosLat = res[1], MirrLon = res[3], MirrLat = res[4], }; db.PosRes.Add(posRes); await db.SaveChangesAsync(); return Success(posRes); } } /// /// 融合带参定位(无星历) /// /// 返回定位结果ID [HttpPost] public async Task> PosRhNoXlAsync(RHNoXlPosDto dto) { using (RHDWContext db = new RHDWContext()) { var runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.RH).FirstOrDefaultAsync(); if (runTask == null) { Serilog.Log.Warning($"接收到融合带参定位(无星历)参数,由于任务没有运行中忽略本次定位!"); return Error($"多模式融合定位平台没有启动融合定位任务"); } var parameter1 = new SQLiteParameter("@sigTime", dto.SigTime); var parameter2 = new SQLiteParameter("@satcode", dto.MainSatID); var parameter3 = new SQLiteParameter("@satcode", dto.AdjaSatID); var xlInfo1 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter2).FirstOrDefaultAsync(); if (xlInfo1 == null) { Serilog.Log.Error($"未找到卫星[{dto.MainSatID}]的双行根数星历"); return Error($"未找到卫星[{dto.MainSatID}]的双行根数星历"); } var xlInfo2 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter3).FirstOrDefaultAsync(); if (xlInfo2 == null) { Serilog.Log.Error($"未找到卫星[{dto.AdjaSatID}]的双行根数星历"); return Error($"未找到卫星[{dto.AdjaSatID}]的双行根数星历"); } Serilog.Log.Information($"卫星{dto.MainSatID}使用{xlInfo1.TwoLine}进行星历推算"); Serilog.Log.Information($"卫星{dto.AdjaSatID}使用{xlInfo2.TwoLine}进行星历推算"); var settings = await db.SysSetings.FirstOrDefaultAsync(); var client = new HttpClient(); string url = string.Format("http://{0}:{1}/Api/", IpHelper.GetLocalIp(), settings.HttpPort); var url1 = string.Format(url + "Xl/Calc?tleStr={0}&dt={1}", xlInfo1.TwoLine, dto.SigTime); var response = await client.GetAsync(url1); if (!response.IsSuccessStatusCode) // 处理响应失败 { Serilog.Log.Error($"[{dto.MainSatID}]星厉推算失败"); return Error($"[{dto.MainSatID}]星厉推算失败"); } var content = await response.Content.ReadAsStringAsync(); var ephMain = JsonConvert.DeserializeObject>(content).data; var url2 = string.Format(url + "Xl/Calc?tleStr={0}&dt={1}", xlInfo2.TwoLine, dto.SigTime); var response2 = await client.GetAsync(url2); if (!response2.IsSuccessStatusCode) // 处理响应失败 { Serilog.Log.Error($"[{dto.AdjaSatID}]星厉推算失败"); return Error($"[{dto.AdjaSatID}]星厉推算失败"); } var content2 = await response2.Content.ReadAsStringAsync(); var ephAdja = JsonConvert.DeserializeObject>(content2).data; //var ephMain = EphHelper.Calc(xlInfo1.TwoLine, dto.SigTime); //var ephAdja = EphHelper.Calc(xlInfo2.TwoLine, dto.SigTime); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, DtoSx = dto.SxDto * 1e6, DfoSx = dto.SxDfo * 1e6, SnrSx = dto.SxSnr, DtoCdb = dto.XdDto * 1e6, DfoCdb = dto.XdDfo * 1e6, SnrCdb = dto.XdSnr, YbMain = dto.MainYbDto * 1e6, YbAdja = dto.AdjaYbDto * 1e6, MainX = ephMain.X, MainY = ephMain.Y, MainZ = ephMain.Z, AdjaX = ephAdja.X, AdjaY = ephAdja.Y, AdjaZ = ephAdja.Z, }); var cxRes = db.CxRes.Add(new CxRes() { SigTime = dto.SigTime, Fx = dto.CxRes, }); var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.StationResInfo.SatTxLon, SatTxLat = dto.StationResInfo.SatTxLat, CdbTxLon = dto.StationResInfo.CdbTxLon, CdbTxLat = dto.StationResInfo.CdbTxLat, CxLon = dto.StationResInfo.CxLon, CxLat = dto.StationResInfo.CxLat, RefLon = dto.StationResInfo.RefLon, RefLat = dto.StationResInfo.RefLat, }); double[] resX1D1 = new double[6]; double[] resX2D1 = new double[6]; double[] mainSat = new double[3] { cgRes.MainX, cgRes.MainY, cgRes.MainZ }; double[] adjaSat = new double[3] { cgRes.AdjaX, cgRes.AdjaY, cgRes.AdjaZ }; double[] satStation = new double[3] { dto.StationResInfo.SatTxLon, dto.StationResInfo.SatTxLat, 0 }; double[] cdbStation = new double[3] { dto.StationResInfo.CdbTxLon, dto.StationResInfo.CdbTxLat, 0 }; double[] cxStation = new double[3] { dto.StationResInfo.CxLon, dto.StationResInfo.CxLat, 0 }; double[] refStation = new double[3] { dto.StationResInfo.RefLon, dto.StationResInfo.RefLat, 0 }; double[] zone = new double[] { -85, 85, -180, 180 }; //定位区域 double theta = cxRes.Fx;//单位° PosApi.X1D1_POS2023_Core(mainSat, satStation, cdbStation, cxStation, refStation, zone, theta, cgRes.DtoCdb.Value / 1e6, cgRes.YbMain.Value / 1e6, resX1D1); PosApi.X2D1_POS_Core(mainSat, adjaSat, cdbStation, satStation, satStation, satStation, satStation, satStation, refStation, zone, cgRes.DtoSx.Value / 1e6, cgRes.DtoCdb.Value / 1e6, cgRes.YbMain.Value / 1e6, cgRes.YbAdja.Value / 1e6, resX2D1); double[] res = new double[] { 999, 999, 0, 999, 999, 0 }; if (PosApi.IsGeoPoint(resX1D1) && PosApi.IsGeoPoint(resX2D1)) { res = new double[6] { (resX1D1[0] + resX2D1[0]) / 2 + 0.003, (resX1D1[1] + resX2D1[1]) / 2 - 0.002, (resX1D1[2] + resX2D1[2]) / 2, (resX1D1[3] + resX2D1[3]) / 2 + 0.003, (resX1D1[4] + resX2D1[4]) / 2 - 0.002, (resX1D1[5] + resX2D1[5]) / 2, }; } else if (PosApi.IsGeoPoint(resX1D1)) { res = new double[6] { resX1D1[0] + 0.003, resX1D1[1] - 0.002, resX1D1[2], resX1D1[3] + 0.003, resX1D1[4] - 0.002, resX1D1[5], }; } else if (PosApi.IsGeoPoint(resX2D1)) { res = new double[6] { resX2D1[0] + 0.003, resX2D1[1] - 0.002, resX2D1[2], resX2D1[3] + 0.003, resX2D1[4] - 0.002, resX2D1[5], }; } PosRes posRes = new PosRes() { SigTime = cgRes.SigTime, TaskInfoID = runTask.ID, CxResID = cxRes.ID, CgResID = cgRes.ID, TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName, TsName = dto.TsName, PosLon = Math.Round(res[0], 4), PosLat = Math.Round(res[1], 4), MirrLon = Math.Round(res[3], 4), MirrLat = Math.Round(res[4], 4), }; db.PosRes.Add(posRes); await db.SaveChangesAsync(); return Success(posRes); } } #endregion #region 无参有星历 /// /// 一星一地测向无参定位(含星历) /// /// 定位参数 /// [HttpPost] public async Task> PosX1D1NoParAsync(X1D1NoParPosDto dto) { using (RHDWContext db = new RHDWContext()) { var runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X1D1CX && p.TaskState == EnumTaskState.Running); if (runTask == null) { Serilog.Log.Warning($"接收到一星一地测向无参定位(含星历)参数,由于任务没有运行中忽略本次定位!"); return Error($"多模式融合定位平台没有启动一星一地测向定位任务"); } var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, DtoCdb = dto.XdDto * 1e6, DfoCdb = dto.XdDfo * 1e6, SnrCdb = dto.XdSnr, MainX = dto.MainX, MainY = dto.MainY, MainZ = dto.MainZ, }); var cxRes = db.CxRes.Add(new CxRes() { SigTime = dto.SigTime, Fx = dto.CxRes, }); var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.StationResInfo.SatTxLon, SatTxLat = dto.StationResInfo.SatTxLat, CdbTxLon = dto.StationResInfo.CdbTxLon, CdbTxLat = dto.StationResInfo.CdbTxLat, CxLon = dto.StationResInfo.CxLon, CxLat = dto.StationResInfo.CxLat, RefLon = dto.StationResInfo.RefLon, RefLat = dto.StationResInfo.RefLat, }); double[] res = new double[6]; double[] mainSat = new double[3] { cgRes.MainX, cgRes.MainY, cgRes.MainZ }; double[] satStation = new double[3] { dto.StationResInfo.SatTxLon, dto.StationResInfo.SatTxLat, 0 }; double[] cdbStation = new double[3] { dto.StationResInfo.CdbTxLon, dto.StationResInfo.CdbTxLat, 0 }; double[] cxStation = new double[3] { dto.StationResInfo.CxLon, dto.StationResInfo.CxLat, 0 }; double[] refStation = new double[3] { dto.StationResInfo.RefLon, dto.StationResInfo.RefLat, 0 }; double[] zone = new double[] { -85, 85, -180, 180 }; //定位区域 double theta = cxRes.Fx;//单位° PosApi.X1D1_POS2023_Core(mainSat, satStation, cdbStation, cxStation, refStation, zone, theta, cgRes.DtoCdb.Value / 1e6, cgRes.YbMain.Value / 1e6, res); PosRes posRes = new PosRes() { SigTime = cgRes.SigTime, TaskInfoID = runTask.ID, CxResID = cxRes.ID, CgResID = cgRes.ID, TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName, TsName = dto.TsName, PosLon = Math.Round(res[0], 4), PosLat = Math.Round(res[1], 4), MirrLon = Math.Round(res[3], 4), MirrLat = Math.Round(res[4], 4), }; db.PosRes.Add(posRes); await db.SaveChangesAsync(); return Success(posRes); } } /// /// 两星一地无参定位(含星历) /// /// 定位参数 /// [HttpPost] public async Task> PosX2D1NoParAsync(X2D1NoParPosDto dto) { using (RHDWContext db = new RHDWContext()) { var runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running); if (runTask == null) { Serilog.Log.Warning($"接收到两星一地无参定位(含星历)参数,由于任务没有运行中忽略本次定位!"); return Error($"多模式融合定位平台没有启动两星一地定位任务"); } var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, DtoSx = dto.SxDto * 1e6, DfoSx = dto.SxDfo * 1e6, SnrSx = dto.SxSnr, DtoCdb = dto.XdDto * 1e6, DfoCdb = dto.XdDfo * 1e6, SnrCdb = dto.XdSnr, MainX = dto.MainX, MainY = dto.MainY, MainZ = dto.MainZ, AdjaX = dto.AdjaX, AdjaY = dto.AdjaY, AdjaZ = dto.AdjaZ, }); var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.StationResInfo.SatTxLon, SatTxLat = dto.StationResInfo.SatTxLat, CdbTxLon = dto.StationResInfo.CdbTxLon, CdbTxLat = dto.StationResInfo.CdbTxLat, CxLon = dto.StationResInfo.CxLon, CxLat = dto.StationResInfo.CxLat, RefLon = dto.StationResInfo.RefLon, RefLat = dto.StationResInfo.RefLat, }); double[] res = new double[6]; double[] mainSat = new double[3] { cgRes.MainX, cgRes.MainY, cgRes.MainZ }; double[] adjaSat = new double[3] { cgRes.AdjaX, cgRes.AdjaY, cgRes.AdjaZ }; double[] satStation = new double[3] { dto.StationResInfo.SatTxLon, dto.StationResInfo.SatTxLat, 0 }; double[] cdbStation = new double[3] { dto.StationResInfo.CdbTxLon, dto.StationResInfo.CdbTxLat, 0 }; double[] cxStation = new double[3] { dto.StationResInfo.CxLon, dto.StationResInfo.CxLat, 0 }; double[] refStation = new double[3] { dto.StationResInfo.RefLon, dto.StationResInfo.RefLat, 0 }; double[] zone = new double[] { -85, 85, -180, 180 }; //定位区域 PosApi.X2D1_POS_Core(mainSat, adjaSat, cdbStation, satStation, satStation, satStation, satStation, satStation, refStation, zone, cgRes.DtoSx.Value / 1e6, cgRes.DtoCdb.Value / 1e6, cgRes.YbMain.Value / 1e6, cgRes.YbAdja.Value / 1e6, res); PosRes posRes = new PosRes() { SigTime = cgRes.SigTime, TaskInfoID = runTask.ID, CgResID = cgRes.ID, TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName, TsName = dto.TsName, PosLon = Math.Round(res[0], 4), PosLat = Math.Round(res[1], 4), MirrLon = Math.Round(res[3], 4), MirrLat = Math.Round(res[4], 4), }; db.PosRes.Add(posRes); await db.SaveChangesAsync(); return Success(posRes); } } /// /// 融合无参定位(含星历) /// /// 定位参数 /// [HttpPost] public async Task> PosRhNoParAsync(RHNoParPosDto dto) { using (RHDWContext db = new RHDWContext()) { var runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.RH && p.TaskState == EnumTaskState.Running); if (runTask == null) { Serilog.Log.Warning($"接收到融合无参定位(含星历)参数,由于任务没有运行中忽略本次定位!"); return Error($"多模式融合定位平台没有启动两星一地定位任务"); } var listTx = new List(); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, DtoSx = dto.SxDto * 1e6, DfoSx = dto.SxDfo * 1e6, SnrSx = dto.SxSnr, DtoCdb = dto.XdDto * 1e6, DfoCdb = dto.XdDfo * 1e6, SnrCdb = dto.XdSnr, MainX = dto.MainX, MainY = dto.MainY, MainZ = dto.MainZ, AdjaX = dto.AdjaX, AdjaY = dto.AdjaY, AdjaZ = dto.AdjaZ, }); var cxRes = db.CxRes.Add(new CxRes() { SigTime = dto.SigTime, Fx = dto.CxRes, }); var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.StationResInfo.SatTxLon, SatTxLat = dto.StationResInfo.SatTxLat, CdbTxLon = dto.StationResInfo.CdbTxLon, CdbTxLat = dto.StationResInfo.CdbTxLat, CxLon = dto.StationResInfo.CxLon, CxLat = dto.StationResInfo.CxLat, RefLon = dto.StationResInfo.RefLon, RefLat = dto.StationResInfo.RefLat, }); double[] resX1D1 = new double[6]; double[] resX2D1 = new double[6]; double[] mainSat = new double[3] { cgRes.MainX, cgRes.MainY, cgRes.MainZ }; double[] adjaSat = new double[3] { cgRes.AdjaX, cgRes.AdjaY, cgRes.AdjaZ }; double[] satStation = new double[3] { dto.StationResInfo.SatTxLon, dto.StationResInfo.SatTxLat, 0 }; double[] cdbStation = new double[3] { dto.StationResInfo.CdbTxLon, dto.StationResInfo.CdbTxLat, 0 }; double[] cxStation = new double[3] { dto.StationResInfo.CxLon, dto.StationResInfo.CxLat, 0 }; double[] refStation = new double[3] { dto.StationResInfo.RefLon, dto.StationResInfo.RefLat, 0 }; double[] zone = new double[] { -85, 85, -180, 180 }; //定位区域 double theta = cxRes.Fx;//单位° PosApi.X1D1_POS2023_Core(mainSat, satStation, cdbStation, cxStation, refStation, zone, theta, cgRes.DtoCdb.Value / 1e6, cgRes.YbMain.Value / 1e6, resX1D1); PosApi.X2D1_POS_Core(mainSat, adjaSat, cdbStation, satStation, satStation, satStation, satStation, satStation, refStation, zone, cgRes.DtoSx.Value / 1e6, cgRes.DtoCdb.Value / 1e6, cgRes.YbMain.Value / 1e6, cgRes.YbAdja.Value / 1e6, resX2D1); double[] res = new double[] { 999, 999, 0, 999, 999, 0 }; if (PosApi.IsGeoPoint(resX1D1) && PosApi.IsGeoPoint(resX2D1)) { res = new double[6] { (resX1D1[0] + resX2D1[0]) / 2 + 0.003, (resX1D1[1] + resX2D1[1]) / 2 - 0.002, (resX1D1[2] + resX2D1[2]) / 2, (resX1D1[3] + resX2D1[3]) / 2 + 0.003, (resX1D1[4] + resX2D1[4]) / 2 - 0.002, (resX1D1[5] + resX2D1[5]) / 2, }; } else if (PosApi.IsGeoPoint(resX1D1)) { res = new double[6] { resX1D1[0] + 0.003, resX1D1[1] - 0.002, resX1D1[2], resX1D1[3] + 0.003, resX1D1[4] - 0.002, resX1D1[5], }; } else if (PosApi.IsGeoPoint(resX2D1)) { res = new double[6] { resX2D1[0] + 0.003, resX2D1[1] - 0.002, resX2D1[2], resX2D1[3] + 0.003, resX2D1[4] - 0.002, resX2D1[5], }; } PosRes posRes = new PosRes() { SigTime = cgRes.SigTime, TaskInfoID = runTask.ID, CxResID = cxRes.ID, CgResID = cgRes.ID, TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName, TsName = dto.TsName, PosLon = Math.Round(res[0], 4), PosLat = Math.Round(res[1], 4), MirrLon = Math.Round(res[3], 4), MirrLat = Math.Round(res[4], 4), }; db.PosRes.Add(posRes); await db.SaveChangesAsync(); return Success(posRes); } } #endregion #region 无参无星历 /// /// 一星一地无参定位(无星历) /// /// 返回定位结果ID [HttpPost] public async Task> PosX1D1NoXlNoParAsync(X1D1NoXlNoParPosDto dto) { using (RHDWContext db = new RHDWContext()) { var runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X1D1CX).FirstOrDefaultAsync(); if (runTask == null) { Serilog.Log.Warning($"接收到一星一地带参定位(无星历)参数,由于任务没有运行中忽略本次定位!"); return Error($"多模式融合定位平台没有启动一星一地定位任务"); } var parameter1 = new SQLiteParameter("@sigTime", dto.SigTime); var parameter2 = new SQLiteParameter("@satcode", dto.MainSatID); var xlInfo1 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter2).FirstOrDefaultAsync(); if (xlInfo1 == null) { Serilog.Log.Error($"未找到卫星[{dto.MainSatID}]的双行根数星历"); return Error($"未找到卫星[{dto.MainSatID}]的双行根数星历"); } Serilog.Log.Information($"卫星{dto.MainSatID}使用{xlInfo1.TwoLine}进行星历推算"); var settings = await db.SysSetings.FirstOrDefaultAsync(); var client = new HttpClient(); string url = string.Format("http://{0}:{1}/Api/", IpHelper.GetLocalIp(), settings.HttpPort); url += string.Format("Xl/Calc?tleStr={0}&dt={1}", xlInfo1.TwoLine, dto.SigTime); var response = await client.GetAsync(url); if (!response.IsSuccessStatusCode) // 处理响应失败 { Serilog.Log.Error($"[{dto.MainSatID}]星厉推算失败"); return Error($"[{dto.MainSatID}]星厉推算失败"); } var content = await response.Content.ReadAsStringAsync(); var ephMain = JsonConvert.DeserializeObject>(content).data; //var ephMain = EphHelper.Calc(xlInfo1.TwoLine, dto.SigTime); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, DtoCdb = dto.XdDto * 1e6, DfoCdb = dto.XdDfo * 1e6, SnrCdb = dto.XdSnr, MainX = ephMain.X, MainY = ephMain.Y, MainZ = ephMain.Z, }); var cxRes = db.CxRes.Add(new CxRes() { SigTime = dto.SigTime, Fx = dto.CxRes, }); var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.StationResInfo.SatTxLon, SatTxLat = dto.StationResInfo.SatTxLat, CdbTxLon = dto.StationResInfo.CdbTxLon, CdbTxLat = dto.StationResInfo.CdbTxLat, CxLon = dto.StationResInfo.CxLon, CxLat = dto.StationResInfo.CxLat, RefLon = dto.StationResInfo.RefLon, RefLat = dto.StationResInfo.RefLat, }); double[] res = new double[6]; double[] mainSat = new double[3] { cgRes.MainX, cgRes.MainY, cgRes.MainZ }; double[] satStation = new double[3] { dto.StationResInfo.SatTxLon, dto.StationResInfo.SatTxLat, 0 }; double[] cdbStation = new double[3] { dto.StationResInfo.CdbTxLon, dto.StationResInfo.CdbTxLat, 0 }; double[] cxStation = new double[3] { dto.StationResInfo.CxLon, dto.StationResInfo.CxLat, 0 }; double[] refStation = new double[3] { dto.StationResInfo.RefLon, dto.StationResInfo.RefLat, 0 }; double[] zone = new double[] { -85, 85, -180, 180 }; //定位区域 double theta = cxRes.Fx;//单位° PosApi.X1D1_POS2023_Core(mainSat, satStation, cdbStation, cxStation, refStation, zone, theta, cgRes.DtoCdb.Value / 1e6, cgRes.YbMain.Value / 1e6, res); PosRes posRes = new PosRes() { SigTime = dto.SigTime, TaskInfoID = runTask.ID, CgResID = cgRes.ID, TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName, TsName = dto.TsName, PosLon = res[0], PosLat = res[1], MirrLon = res[3], MirrLat = res[4], }; db.PosRes.Add(posRes); await db.SaveChangesAsync(); return Success(posRes); } } /// /// 两星一地无参定位(无星历) /// /// 返回定位结果ID [HttpPost] public async Task> PosX2D1NoXlNoParAsync(X2D1NoXlNoParlPosDto dto) { using (RHDWContext db = new RHDWContext()) { var runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X2D1).FirstOrDefaultAsync(); if (runTask == null) { Serilog.Log.Warning($"接收到两星一地带参定位(无星历)参数,由于任务没有运行中忽略本次定位!"); return Error($"多模式融合定位平台没有启动两星一地定位任务"); } var parameter1 = new SQLiteParameter("@sigTime", dto.SigTime); var parameter2 = new SQLiteParameter("@satcode", dto.MainSatID); var parameter3 = new SQLiteParameter("@satcode", dto.AdjaSatID); var xlInfo1 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter2).FirstOrDefaultAsync(); if (xlInfo1 == null) { Serilog.Log.Error($"未找到卫星[{dto.MainSatID}]的双行根数星历"); return Error($"未找到卫星[{dto.MainSatID}]的双行根数星历"); } var xlInfo2 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter3).FirstOrDefaultAsync(); if (xlInfo2 == null) { Serilog.Log.Error($"未找到卫星[{dto.AdjaSatID}]的双行根数星历"); return Error($"未找到卫星[{dto.AdjaSatID}]的双行根数星历"); } Serilog.Log.Information($"卫星{dto.MainSatID}使用{xlInfo1.TwoLine}进行星历推算"); Serilog.Log.Information($"卫星{dto.AdjaSatID}使用{xlInfo2.TwoLine}进行星历推算"); var settings = await db.SysSetings.FirstOrDefaultAsync(); var client = new HttpClient(); string url = string.Format("http://{0}:{1}/Api/", IpHelper.GetLocalIp(), settings.HttpPort); var url1 = string.Format(url + "Xl/Calc?tleStr={0}&dt={1}", xlInfo1.TwoLine, dto.SigTime); var response = await client.GetAsync(url1); if (!response.IsSuccessStatusCode) // 处理响应失败 { Serilog.Log.Error($"[{dto.MainSatID}]星厉推算失败"); return Error($"[{dto.MainSatID}]星厉推算失败"); } var content = await response.Content.ReadAsStringAsync(); var ephMain = JsonConvert.DeserializeObject>(content).data; var url2 = string.Format(url + "Xl/Calc?tleStr={0}&dt={1}", xlInfo2.TwoLine, dto.SigTime); var response2 = await client.GetAsync(url2); if (!response2.IsSuccessStatusCode) // 处理响应失败 { Serilog.Log.Error($"[{dto.AdjaSatID}]星厉推算失败"); return Error($"[{dto.AdjaSatID}]星厉推算失败"); } var content2 = await response2.Content.ReadAsStringAsync(); var ephAdja = JsonConvert.DeserializeObject>(content2).data; //var ephMain = EphHelper.Calc(xlInfo1.TwoLine, dto.SigTime); //var ephAdja = EphHelper.Calc(xlInfo2.TwoLine, dto.SigTime); var cgRes = db.CgRes.Add(new Model.CgRes() { SigTime = dto.SigTime, DtoSx = dto.SxDto * 1e6, DfoSx = dto.SxDfo * 1e6, SnrSx = dto.SxSnr, DtoCdb = dto.XdDto * 1e6, DfoCdb = dto.XdDfo * 1e6, SnrCdb = dto.XdSnr, MainX = ephMain.X, MainY = ephMain.Y, MainZ = ephMain.Z, AdjaX = ephAdja.X, AdjaY = ephAdja.Y, AdjaZ = ephAdja.Z, }); var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.StationResInfo.SatTxLon, SatTxLat = dto.StationResInfo.SatTxLat, CdbTxLon = dto.StationResInfo.CdbTxLon, CdbTxLat = dto.StationResInfo.CdbTxLat, CxLon = dto.StationResInfo.CxLon, CxLat = dto.StationResInfo.CxLat, RefLon = dto.StationResInfo.RefLon, RefLat = dto.StationResInfo.RefLat, }); double[] res = new double[6]; double[] mainSat = new double[3] { cgRes.MainX, cgRes.MainY, cgRes.MainZ }; double[] adjaSat = new double[3] { cgRes.AdjaX, cgRes.AdjaY, cgRes.AdjaZ }; double[] satStation = new double[3] { dto.StationResInfo.SatTxLon, dto.StationResInfo.SatTxLat, 0 }; double[] cdbStation = new double[3] { dto.StationResInfo.CdbTxLon, dto.StationResInfo.CdbTxLat, 0 }; double[] cxStation = new double[3] { dto.StationResInfo.CxLon, dto.StationResInfo.CxLat, 0 }; double[] refStation = new double[3] { dto.StationResInfo.RefLon, dto.StationResInfo.RefLat, 0 }; double[] zone = new double[] { -85, 85, -180, 180 }; //定位区域 PosApi.X2D1_POS_Core(mainSat, adjaSat, cdbStation, satStation, satStation, satStation, satStation, satStation, refStation, zone, cgRes.DtoSx.Value / 1e6, cgRes.DtoCdb.Value / 1e6, cgRes.YbMain.Value / 1e6, cgRes.YbAdja.Value / 1e6, res); PosRes posRes = new PosRes() { SigTime = dto.SigTime, TaskInfoID = runTask.ID, CgResID = cgRes.ID, TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName, TsName = dto.TsName, PosLon = res[0], PosLat = res[1], MirrLon = res[3], MirrLat = res[4], }; db.PosRes.Add(posRes); await db.SaveChangesAsync(); return Success(posRes); } } /// /// 融合无参定位(无星历) /// /// 返回定位结果ID [HttpPost] public async Task> PosRhNoXlNoParAsync(RHNoXlNoParPosDto dto) { using (RHDWContext db = new RHDWContext()) { var runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.RH).FirstOrDefaultAsync(); if (runTask == null) { Serilog.Log.Warning($"接收到融合带参定位(无星历)参数,由于任务没有运行中忽略本次定位!"); return Error($"多模式融合定位平台没有启动融合定位任务"); } var parameter1 = new SQLiteParameter("@sigTime", dto.SigTime); var parameter2 = new SQLiteParameter("@satcode", dto.MainSatID); var parameter3 = new SQLiteParameter("@satcode", dto.AdjaSatID); var xlInfo1 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter2).FirstOrDefaultAsync(); if (xlInfo1 == null) { Serilog.Log.Error($"未找到卫星[{dto.MainSatID}]的双行根数星历"); return Error($"未找到卫星[{dto.MainSatID}]的双行根数星历"); } var xlInfo2 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter3).FirstOrDefaultAsync(); if (xlInfo2 == null) { Serilog.Log.Error($"未找到卫星[{dto.AdjaSatID}]的双行根数星历"); return Error($"未找到卫星[{dto.AdjaSatID}]的双行根数星历"); } Serilog.Log.Information($"卫星{dto.MainSatID}使用{xlInfo1.TwoLine}进行星历推算"); Serilog.Log.Information($"卫星{dto.AdjaSatID}使用{xlInfo2.TwoLine}进行星历推算"); var settings = await db.SysSetings.FirstOrDefaultAsync(); var client = new HttpClient(); string url = string.Format("http://{0}:{1}/Api/", IpHelper.GetLocalIp(), settings.HttpPort); var url1 = string.Format(url + "Xl/Calc?tleStr={0}&dt={1}", xlInfo1.TwoLine, dto.SigTime); var response = await client.GetAsync(url1); if (!response.IsSuccessStatusCode) // 处理响应失败 { Serilog.Log.Error($"[{dto.MainSatID}]星厉推算失败"); return Error($"[{dto.MainSatID}]星厉推算失败"); } var content = await response.Content.ReadAsStringAsync(); var ephMain = JsonConvert.DeserializeObject>(content).data; var url2 = string.Format(url + "Xl/Calc?tleStr={0}&dt={1}", xlInfo2.TwoLine, dto.SigTime); var response2 = await client.GetAsync(url2); if (!response2.IsSuccessStatusCode) // 处理响应失败 { Serilog.Log.Error($"[{dto.AdjaSatID}]星厉推算失败"); return Error($"[{dto.AdjaSatID}]星厉推算失败"); } var content2 = await response2.Content.ReadAsStringAsync(); var ephAdja = JsonConvert.DeserializeObject>(content2).data; //var ephMain = EphHelper.Calc(xlInfo1.TwoLine, dto.SigTime); //var ephAdja = EphHelper.Calc(xlInfo2.TwoLine, dto.SigTime); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, DtoSx = dto.SxDto * 1e6, DfoSx = dto.SxDfo * 1e6, SnrSx = dto.SxSnr, DtoCdb = dto.XdDto * 1e6, DfoCdb = dto.XdDfo * 1e6, SnrCdb = dto.XdSnr, MainX = ephMain.X, MainY = ephMain.Y, MainZ = ephMain.Z, AdjaX = ephAdja.X, AdjaY = ephAdja.Y, AdjaZ = ephAdja.Z, }); var cxRes = db.CxRes.Add(new CxRes() { SigTime = dto.SigTime, Fx = dto.CxRes, }); var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.StationResInfo.SatTxLon, SatTxLat = dto.StationResInfo.SatTxLat, CdbTxLon = dto.StationResInfo.CdbTxLon, CdbTxLat = dto.StationResInfo.CdbTxLat, CxLon = dto.StationResInfo.CxLon, CxLat = dto.StationResInfo.CxLat, RefLon = dto.StationResInfo.RefLon, RefLat = dto.StationResInfo.RefLat, }); double[] resX1D1 = new double[6]; double[] resX2D1 = new double[6]; double[] mainSat = new double[3] { cgRes.MainX, cgRes.MainY, cgRes.MainZ }; double[] adjaSat = new double[3] { cgRes.AdjaX, cgRes.AdjaY, cgRes.AdjaZ }; double[] satStation = new double[3] { dto.StationResInfo.SatTxLon, dto.StationResInfo.SatTxLat, 0 }; double[] cdbStation = new double[3] { dto.StationResInfo.CdbTxLon, dto.StationResInfo.CdbTxLat, 0 }; double[] cxStation = new double[3] { dto.StationResInfo.CxLon, dto.StationResInfo.CxLat, 0 }; double[] refStation = new double[3] { dto.StationResInfo.RefLon, dto.StationResInfo.RefLat, 0 }; double[] zone = new double[] { -85, 85, -180, 180 }; //定位区域 double theta = cxRes.Fx;//单位° PosApi.X1D1_POS2023_Core(mainSat, satStation, cdbStation, cxStation, refStation, zone, theta, cgRes.DtoCdb.Value / 1e6, cgRes.YbMain.Value / 1e6, resX1D1); PosApi.X2D1_POS_Core(mainSat, adjaSat, cdbStation, satStation, satStation, satStation, satStation, satStation, refStation, zone, cgRes.DtoSx.Value / 1e6, cgRes.DtoCdb.Value / 1e6, cgRes.YbMain.Value / 1e6, cgRes.YbAdja.Value / 1e6, resX2D1); double[] res = new double[] { 999, 999, 0, 999, 999, 0 }; if (PosApi.IsGeoPoint(resX1D1) && PosApi.IsGeoPoint(resX2D1)) { res = new double[6] { (resX1D1[0] + resX2D1[0]) / 2 + 0.003, (resX1D1[1] + resX2D1[1]) / 2 - 0.002, (resX1D1[2] + resX2D1[2]) / 2, (resX1D1[3] + resX2D1[3]) / 2 + 0.003, (resX1D1[4] + resX2D1[4]) / 2 - 0.002, (resX1D1[5] + resX2D1[5]) / 2, }; } else if (PosApi.IsGeoPoint(resX1D1)) { res = new double[6] { resX1D1[0] + 0.003, resX1D1[1] - 0.002, resX1D1[2], resX1D1[3] + 0.003, resX1D1[4] - 0.002, resX1D1[5], }; } else if (PosApi.IsGeoPoint(resX2D1)) { res = new double[6] { resX2D1[0] + 0.003, resX2D1[1] - 0.002, resX2D1[2], resX2D1[3] + 0.003, resX2D1[4] - 0.002, resX2D1[5], }; } PosRes posRes = new PosRes() { SigTime = cgRes.SigTime, TaskInfoID = runTask.ID, CxResID = cxRes.ID, CgResID = cgRes.ID, TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName, TsName = dto.TsName, PosLon = Math.Round(res[0], 4), PosLat = Math.Round(res[1], 4), MirrLon = Math.Round(res[3], 4), MirrLat = Math.Round(res[4], 4), }; db.PosRes.Add(posRes); await db.SaveChangesAsync(); return Success(posRes); } } #endregion /// /// 查询定位结果(暂未实现) /// /// /// /// [HttpGet] public async Task> GetPosRes(PosResQueryDto dto) { await Task.Delay(100); return Error("该功能暂未实现!"); } } }