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("该功能暂未实现!");
}
}
}