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.Drawing.Internal.Fonts.Interop; 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.ObServer; 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 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, }); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, DtoCdb = dto.XdDto, DfoCdb = dto.XdDfo, SnrCdb = dto.XdSnr, YbMainDto = dto.MainYbDto, StationResID = StationRes.ID, MainX = dto.MainX, MainY = dto.MainY, MainZ = dto.MainZ, }); var cxRes = db.CxRes.Add(new CxRes() { SigTime = dto.SigTime, Fx = dto.CxRes, }); var res = PosApi.X1D1_Pos(cgRes, StationRes, cxRes); 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 = res[0], PosLat = res[1], MirrLon =res[3], MirrLat =res[4], }; posRes = db.PosRes.Add(posRes); await db.SaveChangesAsync(); PosObServer.Instance.Pub(posRes); return Success(posRes); } } /// /// 一星一地测向带参定位(无星历) /// /// 返回定位结果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 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, }); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, DtoCdb = dto.XdDto, DfoCdb = dto.XdDfo, SnrCdb = dto.XdSnr, YbMainDto = dto.MainYbDto, StationResID = StationRes.ID, MainX = ephMain.X, MainY = ephMain.Y, MainZ = ephMain.Z, }); var cxRes = db.CxRes.Add(new CxRes() { SigTime = dto.SigTime, Fx = dto.CxRes, }); var res = PosApi.X1D1_Pos(cgRes, StationRes, cxRes); 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], }; posRes = db.PosRes.Add(posRes); await db.SaveChangesAsync(); PosObServer.Instance.Pub(posRes); return Success(posRes); } } #endregion #region 两星一地定位 /// /// 两星一地带参定位(含星历) /// /// 定位参数 /// [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 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, }); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, Dto1 = dto.SxDto, Dfo1 = dto.SxDfo, Snr1 = dto.SxSnr, DtoCdb = dto.XdDto, DfoCdb = dto.XdDfo, SnrCdb = dto.XdSnr, YbMainDto = dto.MainYbDto, YbAdja1Dto = dto.AdjaYbDto, StationResID = StationRes.ID, MainX = dto.MainX, MainY = dto.MainY, MainZ = dto.MainZ, Adja1X = dto.AdjaX, Adja1Y = dto.AdjaY, Adja1Z = dto.AdjaZ, }); var res = PosApi.X2D1_Pos(cgRes, StationRes); PosRes posRes = new PosRes() { SigTime = cgRes.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], }; posRes = db.PosRes.Add(posRes); await db.SaveChangesAsync(); PosObServer.Instance.Pub(posRes); 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 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, }); var cgRes = db.CgRes.Add(new Model.CgRes() { SigTime = dto.SigTime, Dto1 = dto.SxDto, Dfo1 = dto.SxDfo, Snr1 = dto.SxSnr, DtoCdb = dto.XdDto, DfoCdb = dto.XdDfo, SnrCdb = dto.XdSnr, YbMainDto = dto.MainYbDto, YbAdja1Dto = dto.AdjaYbDto, StationResID = StationRes.ID, MainX = ephMain.X, MainY = ephMain.Y, MainZ = ephMain.Z, Adja1X = ephAdja.X, Adja1Y = ephAdja.Y, Adja1Z = ephAdja.Z, }); var res = PosApi.X2D1_Pos(cgRes, StationRes); 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], }; posRes = db.PosRes.Add(posRes); await db.SaveChangesAsync(); PosObServer.Instance.Pub(posRes); 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 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, }); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, Dto1 = dto.SxDto, Dfo1 = dto.SxDfo, Snr1 = dto.SxSnr, DtoCdb = dto.XdDto, DfoCdb = dto.XdDfo, SnrCdb = dto.XdSnr, StationResID = StationRes.ID, MainX = dto.MainX, MainY = dto.MainY, MainZ = dto.MainZ, Adja1X = dto.AdjaX, Adja1Y = dto.AdjaY, Adja1Z = dto.AdjaZ, }); var res = PosApi.X2D1_PosNoRef(cgRes, StationRes); PosRes posRes = new PosRes() { SigTime = cgRes.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], }; posRes = db.PosRes.Add(posRes); await db.SaveChangesAsync(); PosObServer.Instance.Pub(posRes); 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 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, }); var cgRes = db.CgRes.Add(new Model.CgRes() { SigTime = dto.SigTime, Dto1 = dto.SxDto, Dfo1 = dto.SxDfo, Snr1 = dto.SxSnr, DtoCdb = dto.XdDto, DfoCdb = dto.XdDfo, SnrCdb = dto.XdSnr, StationResID = StationRes.ID, MainX = ephMain.X, MainY = ephMain.Y, MainZ = ephMain.Z, Adja1X = ephAdja.X, Adja1Y = ephAdja.Y, Adja1Z = ephAdja.Z, }); var res = PosApi.X2D1_PosNoRef(cgRes, StationRes); 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], }; posRes = db.PosRes.Add(posRes); await db.SaveChangesAsync(); PosObServer.Instance.Pub(posRes); return Success(posRes); } } #endregion #region 融合定位 /// /// 融合带参定位(含星历) /// /// 定位参数 /// [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 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, }); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, Dto1 = dto.SxDto, Dfo1 = dto.SxDfo, Snr1 = dto.SxSnr, DtoCdb = dto.XdDto, DfoCdb = dto.XdDfo, SnrCdb = dto.XdSnr, YbMainDto = dto.MainYbDto, YbAdja1Dto = dto.AdjaYbDto, StationResID = StationRes.ID, MainX = dto.MainX, MainY = dto.MainY, MainZ = dto.MainZ, Adja1X = dto.AdjaX, Adja1Y = dto.AdjaY, Adja1Z = dto.AdjaZ, }); var cxRes = db.CxRes.Add(new CxRes() { SigTime = dto.SigTime, Fx = dto.CxRes, }); var res = PosApi.RH_Pos(cgRes, StationRes, cxRes); 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 = res[0], PosLat = res[1], MirrLon = res[3], MirrLat = res[4], }; posRes = db.PosRes.Add(posRes); await db.SaveChangesAsync(); PosObServer.Instance.Pub(posRes); 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 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, }); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, Dto1 = dto.SxDto, Dfo1 = dto.SxDfo, Snr1 = dto.SxSnr, DtoCdb = dto.XdDto, DfoCdb = dto.XdDfo, SnrCdb = dto.XdSnr, YbMainDto = dto.MainYbDto, YbAdja1Dto = dto.AdjaYbDto, StationResID = StationRes.ID, MainX = ephMain.X, MainY = ephMain.Y, MainZ = ephMain.Z, Adja1X = ephAdja.X, Adja1Y = ephAdja.Y, Adja1Z = ephAdja.Z, }); var cxRes = db.CxRes.Add(new CxRes() { SigTime = dto.SigTime, Fx = dto.CxRes, }); var res = PosApi.RH_Pos(cgRes, StationRes, cxRes); 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 = res[0], PosLat = res[1], MirrLon = res[3], MirrLat = res[4], }; posRes = db.PosRes.Add(posRes); await db.SaveChangesAsync(); PosObServer.Instance.Pub(posRes); return Success(posRes); } } #endregion #region 三星双时差定位 /// /// 三星双时差带参定位(含星历) /// /// 定位参数 /// [HttpPost] public async Task> PosX3TwoDtoAsync(X3TwoDtoPosDto dto) { using (RHDWContext db = new RHDWContext()) { var runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X3TwoDto && p.TaskState == EnumTaskState.Running); if (runTask == null) { Serilog.Log.Warning($"接收到三星双时差带参定位(含星历)参数,由于任务没有运行中忽略本次定位!"); return Error($"多模式融合定位平台没有启动三星双时差定位任务"); } 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, }); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, Dto1 = dto.Dto1, Dfo1 = dto.Dfo1, Snr1 = dto.Snr1, Dto2 = dto.Dto2, Dfo2 = dto.Dfo2, Snr2 = dto.Snr2, YbMainDto = dto.YbMainDto, YbAdja1Dto = dto.YbAdja1Dto, YbAdja2Dto=dto.YbAdja2Dto, StationResID = StationRes.ID, MainX = dto.MainX, MainY = dto.MainY, MainZ = dto.MainZ, Adja1X = dto.Adja1X, Adja1Y = dto.Adja1Y, Adja1Z = dto.Adja1Z, Adja2X = dto.Adja2X, Adja2Y = dto.Adja2Y, Adja2Z = dto.Adja2Z, }); var res = PosApi.X3_Pos(cgRes, StationRes); PosRes posRes = new PosRes() { SigTime = cgRes.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], }; posRes = db.PosRes.Add(posRes); await db.SaveChangesAsync(); PosObServer.Instance.Pub(posRes); return Success(posRes); } } /// /// 三星双时差带参定位(无星历) /// /// 返回定位结果ID [HttpPost] public async Task> PosX3TwoDtoNoXlAsync(X3TwoDtoNoXlPosDto dto) { using (RHDWContext db = new RHDWContext()) { var runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X3TwoDto).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.Adja1SatID); var parameter4 = new SQLiteParameter("@satcode", dto.Adja2SatID); 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.Adja1SatID}]的双行根数星历"); return Error($"未找到卫星[{dto.Adja1SatID}]的双行根数星历"); } var xlInfo3 = 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, parameter4).FirstOrDefaultAsync(); if (xlInfo3 == null) { Serilog.Log.Error($"未找到卫星[{dto.Adja2SatID}]的双行根数星历"); return Error($"未找到卫星[{dto.Adja2SatID}]的双行根数星历"); } Serilog.Log.Information($"卫星{dto.MainSatID}使用{xlInfo1.TwoLine}进行星历推算"); Serilog.Log.Information($"卫星{dto.Adja1SatID}使用{xlInfo2.TwoLine}进行星历推算"); Serilog.Log.Information($"卫星{dto.Adja2SatID}使用{xlInfo3.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.Adja1SatID}]星厉推算失败"); return Error($"[{dto.Adja1SatID}]星厉推算失败"); } var content2 = await response2.Content.ReadAsStringAsync(); var ephAdja1 = JsonConvert.DeserializeObject>(content2).data; var url3 = string.Format(url + "Xl/Calc?tleStr={0}&dt={1}", xlInfo3.TwoLine, dto.SigTime); var response3 = await client.GetAsync(url3); if (!response3.IsSuccessStatusCode) // 处理响应失败 { Serilog.Log.Error($"[{dto.Adja2SatID}]星厉推算失败"); return Error($"[{dto.Adja2SatID}]星厉推算失败"); } var content3 = await response2.Content.ReadAsStringAsync(); var ephAdja2 = JsonConvert.DeserializeObject>(content3).data; 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, }); var cgRes = db.CgRes.Add(new Model.CgRes() { SigTime = dto.SigTime, Dto1 = dto.Dto1, Dfo1 = dto.Dfo1, Snr1 = dto.Snr1, Dto2 = dto.Dto2, Dfo2 = dto.Dfo2, Snr2 = dto.Snr2, YbMainDto = dto.YbMainDto, YbAdja1Dto = dto.YbAdja1Dto, YbAdja2Dto = dto.YbAdja2Dto, StationResID = StationRes.ID, MainX = ephMain.X, MainY = ephMain.Y, MainZ = ephMain.Z, Adja1X = ephAdja1.X, Adja1Y = ephAdja1.Y, Adja1Z = ephAdja1.Z, Adja2X = ephAdja2.X, Adja2Y = ephAdja2.Y, Adja2Z = ephAdja2.Z, }); var res = PosApi.X3_Pos(cgRes, StationRes); 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], }; posRes = db.PosRes.Add(posRes); await db.SaveChangesAsync(); PosObServer.Instance.Pub(posRes); return Success(posRes); } } /// /// 三星双时差无参定位(含星历) /// /// 定位参数 /// [HttpPost] public async Task> PosX3TwoDtoNoParAsync(X3TwoDtoNoParPosDto dto) { using (RHDWContext db = new RHDWContext()) { var runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X3TwoDto && p.TaskState == EnumTaskState.Running); if (runTask == null) { Serilog.Log.Warning($"接收到三星双时差无参定位(含星历)参数,由于任务没有运行中忽略本次定位!"); return Error($"多模式融合定位平台没有启动三星双时差定位任务"); } 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, }); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, Dto1 = dto.Dto1, Dfo1 = dto.Dfo1, Snr1 = dto.Snr1, Dto2 = dto.Dto2, Dfo2 = dto.Dfo2, Snr2 = dto.Snr2, StationResID = StationRes.ID, MainX = dto.MainX, MainY = dto.MainY, MainZ = dto.MainZ, Adja1X = dto.Adja1X, Adja1Y = dto.Adja1Y, Adja1Z = dto.Adja1Z, Adja2X = dto.Adja2X, Adja2Y = dto.Adja2Y, Adja2Z = dto.Adja2Z, }); var res = PosApi.X3_PosNoRef(cgRes, StationRes); PosRes posRes = new PosRes() { SigTime = cgRes.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], }; posRes = db.PosRes.Add(posRes); await db.SaveChangesAsync(); PosObServer.Instance.Pub(posRes); return Success(posRes); } } /// /// 三星双时差无参定位(无星历) /// /// 返回定位结果ID [HttpPost] public async Task> PosX3TwoDtoNoXlNoParAsync(X3TwoDtoNoXlNoParPosDto dto) { using (RHDWContext db = new RHDWContext()) { var runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X3TwoDto).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.Adja1SatID); var parameter4 = new SQLiteParameter("@satcode", dto.Adja2SatID); 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.Adja1SatID}]的双行根数星历"); return Error($"未找到卫星[{dto.Adja1SatID}]的双行根数星历"); } var xlInfo3 = 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, parameter4).FirstOrDefaultAsync(); if (xlInfo3 == null) { Serilog.Log.Error($"未找到卫星[{dto.Adja2SatID}]的双行根数星历"); return Error($"未找到卫星[{dto.Adja2SatID}]的双行根数星历"); } Serilog.Log.Information($"卫星{dto.MainSatID}使用{xlInfo1.TwoLine}进行星历推算"); Serilog.Log.Information($"卫星{dto.Adja1SatID}使用{xlInfo2.TwoLine}进行星历推算"); Serilog.Log.Information($"卫星{dto.Adja2SatID}使用{xlInfo3.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.Adja1SatID}]星厉推算失败"); return Error($"[{dto.Adja1SatID}]星厉推算失败"); } var content2 = await response2.Content.ReadAsStringAsync(); var ephAdja1 = JsonConvert.DeserializeObject>(content2).data; var url3 = string.Format(url + "Xl/Calc?tleStr={0}&dt={1}", xlInfo3.TwoLine, dto.SigTime); var response3 = await client.GetAsync(url3); if (!response3.IsSuccessStatusCode) // 处理响应失败 { Serilog.Log.Error($"[{dto.Adja2SatID}]星厉推算失败"); return Error($"[{dto.Adja2SatID}]星厉推算失败"); } var content3 = await response2.Content.ReadAsStringAsync(); var ephAdja2 = JsonConvert.DeserializeObject>(content3).data; 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, }); var cgRes = db.CgRes.Add(new Model.CgRes() { SigTime = dto.SigTime, Dto1 = dto.Dto1, Dfo1 = dto.Dfo1, Snr1 = dto.Snr1, Dto2 = dto.Dto2, Dfo2 = dto.Dfo2, Snr2 = dto.Snr2, StationResID = StationRes.ID, MainX = ephMain.X, MainY = ephMain.Y, MainZ = ephMain.Z, Adja1X = ephAdja1.X, Adja1Y = ephAdja1.Y, Adja1Z = ephAdja1.Z, Adja2X = ephAdja2.X, Adja2Y = ephAdja2.Y, Adja2Z = ephAdja2.Z, }); var res = PosApi.X3_PosNoRef(cgRes, StationRes); 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], }; posRes = db.PosRes.Add(posRes); await db.SaveChangesAsync(); PosObServer.Instance.Pub(posRes); return Success(posRes); } } #endregion #region 三星双频差定位 /// /// 三星双频差带参定位(含星历) /// /// 定位参数 /// [HttpPost] public async Task> PosX3TwoDfoAsync(X3TwoDfoPosDto dto) { using (RHDWContext db = new RHDWContext()) { var runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X3TwoDfo && p.TaskState == EnumTaskState.Running); if (runTask == null) { Serilog.Log.Warning($"接收到三星双频差带参定位(含星历)参数,由于任务没有运行中忽略本次定位!"); return Error($"多模式融合定位平台没有启动三星双频差定位任务"); } 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, }); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, Dto1 = dto.Dto1, Dfo1 = dto.Dfo1, Snr1 = dto.Snr1, Dto2 = dto.Dto2, Dfo2 = dto.Dfo2, Snr2 = dto.Snr2, YbMainDfo = dto.YbMainDfo, YbAdja1Dfo = dto.YbAdja1Dfo, YbAdja2Dfo = dto.YbAdja2Dfo, TarFreqUp= dto.TarFreqUp, TarFreqDown=dto.TarFreqDown, RefFreqUp=dto.RefFreqUp, RefFreqDown=dto.RefFreqDown, StationResID = StationRes.ID, MainX = dto.MainX, MainY = dto.MainY, MainZ = dto.MainZ, MainVx = dto.MainVx, MainVy = dto.MainVy, MainVz = dto.MainVz, Adja1X = dto.Adja1X, Adja1Y = dto.Adja1Y, Adja1Z = dto.Adja1Z, Adja1Vx = dto.Adja1Vx, Adja1Vy = dto.Adja1Vy, Adja1Vz = dto.Adja1Vz, Adja2X = dto.Adja2X, Adja2Y = dto.Adja2Y, Adja2Z = dto.Adja2Z, Adja2Vx = dto.Adja2Vx, Adja2Vy = dto.Adja2Vy, Adja2Vz = dto.Adja2Vz, }); var res = PosApi.X3_PosTwoDfo(cgRes, StationRes); PosRes posRes = new PosRes() { SigTime = cgRes.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], }; posRes = db.PosRes.Add(posRes); await db.SaveChangesAsync(); PosObServer.Instance.Pub(posRes); return Success(posRes); } } /// /// 三星双频差带参定位(无星历) /// /// 返回定位结果ID [HttpPost] public async Task> PosX3TwoDfoNoXlAsync(X3TwoDfoNoXlPosDto dto) { using (RHDWContext db = new RHDWContext()) { var runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X3TwoDto).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.Adja1SatID); var parameter4 = new SQLiteParameter("@satcode", dto.Adja2SatID); 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.Adja1SatID}]的双行根数星历"); return Error($"未找到卫星[{dto.Adja1SatID}]的双行根数星历"); } var xlInfo3 = 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, parameter4).FirstOrDefaultAsync(); if (xlInfo3 == null) { Serilog.Log.Error($"未找到卫星[{dto.Adja2SatID}]的双行根数星历"); return Error($"未找到卫星[{dto.Adja2SatID}]的双行根数星历"); } Serilog.Log.Information($"卫星{dto.MainSatID}使用{xlInfo1.TwoLine}进行星历推算"); Serilog.Log.Information($"卫星{dto.Adja1SatID}使用{xlInfo2.TwoLine}进行星历推算"); Serilog.Log.Information($"卫星{dto.Adja2SatID}使用{xlInfo3.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.Adja1SatID}]星厉推算失败"); return Error($"[{dto.Adja1SatID}]星厉推算失败"); } var content2 = await response2.Content.ReadAsStringAsync(); var ephAdja1 = JsonConvert.DeserializeObject>(content2).data; var url3 = string.Format(url + "Xl/Calc?tleStr={0}&dt={1}", xlInfo3.TwoLine, dto.SigTime); var response3 = await client.GetAsync(url3); if (!response3.IsSuccessStatusCode) // 处理响应失败 { Serilog.Log.Error($"[{dto.Adja2SatID}]星厉推算失败"); return Error($"[{dto.Adja2SatID}]星厉推算失败"); } var content3 = await response2.Content.ReadAsStringAsync(); var ephAdja2 = JsonConvert.DeserializeObject>(content3).data; 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, }); var cgRes = db.CgRes.Add(new Model.CgRes() { SigTime = dto.SigTime, Dto1 = dto.Dto1, Dfo1 = dto.Dfo1, Snr1 = dto.Snr1, Dto2 = dto.Dto2, Dfo2 = dto.Dfo2, Snr2 = dto.Snr2, YbMainDfo = dto.YbMainDfo, YbAdja1Dfo = dto.YbAdja1Dfo, YbAdja2Dfo = dto.YbAdja2Dfo, TarFreqUp = dto.TarFreqUp, TarFreqDown = dto.TarFreqDown, RefFreqUp = dto.RefFreqUp, RefFreqDown = dto.RefFreqDown, StationResID = StationRes.ID, MainX = ephMain.X, MainY = ephMain.Y, MainZ = ephMain.Z, MainVx = ephMain.VX, MainVy = ephMain.VY, MainVz = ephMain.VZ, Adja1X = ephAdja1.X, Adja1Y = ephAdja1.Y, Adja1Z = ephAdja1.Z, Adja1Vx = ephAdja1.VX, Adja1Vy = ephAdja1.VY, Adja1Vz = ephAdja1.VZ, Adja2X = ephAdja2.X, Adja2Y = ephAdja2.Y, Adja2Z = ephAdja2.Z, Adja2Vx = ephAdja2.VX, Adja2Vy = ephAdja2.VY, Adja2Vz = ephAdja2.VZ, }); var res = PosApi.X3_PosTwoDfo(cgRes, StationRes); 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], }; posRes = db.PosRes.Add(posRes); await db.SaveChangesAsync(); PosObServer.Instance.Pub(posRes); return Success(posRes); } } #endregion #region 双星时频差定位 /// /// 双星时频差带参定位(含星历) /// /// 定位参数 /// [HttpPost] public async Task> PosX2DtoDfoAsync(X2DtoDfoPosDto dto) { using (RHDWContext db = new RHDWContext()) { var runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X2Dfo && p.TaskState == EnumTaskState.Running); if (runTask == null) { Serilog.Log.Warning($"接收到双星时频差带参定位(含星历)参数,由于任务没有运行中忽略本次定位!"); return Error($"多模式融合定位平台没有启动双星时频差定位任务"); } 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, }); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, Dto1 = dto.Dto, Dfo1 = dto.Dfo, Snr1 = dto.Snr, YbMainDto = dto.YbMainDto, YbAdja1Dto = dto.YbAdjaDto, YbMainDfo = dto.YbMainDfo, YbAdja1Dfo = dto.YbAdjaDfo, TarFreqUp = dto.TarFreqUp, TarFreqDown = dto.TarFreqDown, RefFreqUp = dto.RefFreqUp, RefFreqDown = dto.RefFreqDown, StationResID = StationRes.ID, MainX = dto.MainX, MainY = dto.MainY, MainZ = dto.MainZ, MainVx = dto.MainVx, MainVy = dto.MainVy, MainVz = dto.MainVz, Adja1X = dto.AdjaX, Adja1Y = dto.AdjaY, Adja1Z = dto.AdjaZ, Adja1Vx = dto.AdjaVx, Adja1Vy = dto.AdjaVy, Adja1Vz = dto.AdjaVz, }); var res = PosApi.X2_PosDtoDfo(cgRes, StationRes); PosRes posRes = new PosRes() { SigTime = cgRes.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], }; posRes = db.PosRes.Add(posRes); await db.SaveChangesAsync(); PosObServer.Instance.Pub(posRes); return Success(posRes); } } /// /// 双星时频差带参定位(无星历) /// /// 返回定位结果ID [HttpPost] public async Task> PosX2DtoDfoNoXlAsync(X2DtoDfoNoXlPosDto dto) { using (RHDWContext db = new RHDWContext()) { var runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X2Dfo).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 ephAdja1 = JsonConvert.DeserializeObject>(content2).data; 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, }); var cgRes = db.CgRes.Add(new Model.CgRes() { SigTime = dto.SigTime, Dto1 = dto.Dto, Dfo1 = dto.Dfo, Snr1 = dto.Snr, YbMainDto = dto.YbMainDto, YbAdja1Dto = dto.YbAdjaDto, YbMainDfo = dto.YbMainDfo, YbAdja1Dfo = dto.YbAdjaDfo, TarFreqUp = dto.TarFreqUp, TarFreqDown = dto.TarFreqDown, RefFreqUp = dto.RefFreqUp, RefFreqDown = dto.RefFreqDown, StationResID = StationRes.ID, MainX = ephMain.X, MainY = ephMain.Y, MainZ = ephMain.Z, MainVx = ephMain.VX, MainVy = ephMain.VY, MainVz = ephMain.VZ, Adja1X = ephAdja1.X, Adja1Y = ephAdja1.Y, Adja1Z = ephAdja1.Z, Adja1Vx = ephAdja1.VX, Adja1Vy = ephAdja1.VY, Adja1Vz = ephAdja1.VZ, }); var res = PosApi.X2_PosDtoDfo(cgRes, StationRes); 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], }; posRes = db.PosRes.Add(posRes); await db.SaveChangesAsync(); PosObServer.Instance.Pub(posRes); return Success(posRes); } } #endregion /// /// 查询定位结果(暂未实现) /// /// /// /// [HttpGet] public async Task> GetPosRes(PosResQueryDto dto) { await Task.Delay(100); return Error("该功能暂未实现!"); } } }