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