RefManager.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. using DevExpress.Xpo;
  2. using Ips.Library.Basic;
  3. using Ips.Library.Entity;
  4. using Ips.LocAlgorithm;
  5. using Ips.Sps.Ephs;
  6. using Ips.Sps.TskResults.Peses;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. namespace Ips.Sps.Refs
  13. {
  14. public sealed class RefManager
  15. {
  16. public static readonly RefManager Default = new RefManager();
  17. private RefManager()
  18. {
  19. }
  20. public static int RefFindMin { get; set; } = 30;
  21. public Pes GetRefPes(Pes tarPes, List<Pes> pesList, out List<Pes> usePesList, bool findDbRef = false)
  22. {
  23. usePesList = new List<Pes>();
  24. Pes pesRef = null;
  25. pesList = pesList?.Where(m => m.IsValid)?.OrderBy(m => Math.Abs((m.SigTime - tarPes.SigTime).TotalSeconds))?.ToList();
  26. if (pesList.IsNotNullOrEmpty())
  27. {
  28. var maRefPes = pesList.FirstOrDefault(m => (m.MainSatId == tarPes.MainSatId && m.AdjaSatId == tarPes.AdjaSatId) || (m.MainSatId == tarPes.AdjaSatId && m.AdjaSatId == tarPes.MainSatId));
  29. if (maRefPes != null)
  30. {
  31. pesRef = CreateRefPes(tarPes, maRefPes);
  32. usePesList.Add(maRefPes);
  33. }
  34. else
  35. {
  36. var mRefPes = pesList.FirstOrDefault(m => m.AdjaSatId == tarPes.MainSatId);
  37. if (mRefPes != null)
  38. {
  39. var aRefPes = pesList.FirstOrDefault(m => m.EmtId == mRefPes.EmtId && m.MainSatId == mRefPes.MainSatId && m.AdjaSatId == tarPes.AdjaSatId);
  40. if (aRefPes != null)
  41. {
  42. usePesList.AddRange(new[] { mRefPes, aRefPes });
  43. pesRef = CreateRefPes(tarPes, mRefPes, aRefPes);
  44. }
  45. }
  46. }
  47. }
  48. if (findDbRef && pesRef == null)
  49. {
  50. Session session = new Session();
  51. var minSigTime = tarPes.SigTime.AddMinutes(-RefFindMin);
  52. var maxSigTime = tarPes.SigTime.AddMinutes(RefFindMin);
  53. var maRefPes = session.Query<Pes>()
  54. .Where(m => m.Category == SignalCategory.RefSig && m.IsValid)
  55. .Where(m => (m.MainSatId == tarPes.MainSatId && m.AdjaSatId == tarPes.AdjaSatId) || (m.MainSatId == tarPes.AdjaSatId && m.AdjaSatId == tarPes.MainSatId))
  56. .Where(m => m.SigTime <= tarPes.SigTime && m.SigTime >= minSigTime)
  57. .OrderByDescending(m => m.SigTime)
  58. .FirstOrDefault();
  59. if (maRefPes != null)
  60. {
  61. pesRef = CreateRefPes(tarPes, maRefPes);
  62. usePesList.Add(maRefPes);
  63. }
  64. else
  65. {
  66. var mRefPes = session.Query<Pes>()
  67. .Where(m => m.Category == SignalCategory.RefSig && m.IsValid)
  68. .Where(m => m.AdjaSatId == tarPes.MainSatId)
  69. .Where(m => m.SigTime <= tarPes.SigTime && m.SigTime >= minSigTime)
  70. .OrderByDescending(m => m.SigTime)
  71. .FirstOrDefault();
  72. if (mRefPes != null)
  73. {
  74. var aRefPes = session.Query<Pes>()
  75. .Where(m => m.Category == SignalCategory.RefSig && m.IsValid)
  76. .Where(m => m.EmtId == mRefPes.EmtId && m.MainSatId == mRefPes.MainSatId && m.AdjaSatId == tarPes.AdjaSatId)
  77. .Where(m => m.SigTime <= tarPes.SigTime && m.SigTime >= minSigTime)
  78. .OrderByDescending(m => m.SigTime)
  79. .FirstOrDefault();
  80. if (aRefPes != null)
  81. {
  82. pesRef = CreateRefPes(tarPes, mRefPes, aRefPes);
  83. usePesList.AddRange(new[] { mRefPes, aRefPes });
  84. }
  85. }
  86. }
  87. }
  88. return pesRef;
  89. }
  90. private Pes CreateRefPes(Pes tarPes, Pes maRefPes)
  91. {
  92. bool isMain = maRefPes.MainSatId == tarPes.MainSatId;
  93. var refPes = new Pes();
  94. refPes.SigId = maRefPes.SigId;
  95. refPes.EmtId = maRefPes.EmtId;
  96. refPes.SigTime = maRefPes.SigTime;
  97. refPes.Category = SignalCategory.RefSig;
  98. refPes.SigFreq = maRefPes.SigFreq;
  99. refPes.SigType = maRefPes.SigType;
  100. refPes.SigLon = maRefPes.SigLon;
  101. refPes.SigLat = maRefPes.SigLat;
  102. refPes.SigAlt = maRefPes.SigAlt;
  103. refPes.LonMin = maRefPes.LonMin;
  104. refPes.LonMax = maRefPes.LonMax;
  105. refPes.LatMin = maRefPes.LatMin;
  106. refPes.LatMax = maRefPes.LatMax;
  107. refPes.MainSatId = isMain ? maRefPes.MainSatId : maRefPes.AdjaSatId;
  108. refPes.MainSatNum = isMain ? maRefPes.MainSatNum : maRefPes.AdjaSatNum;
  109. refPes.MainAntId = isMain ? maRefPes.MainAntId : maRefPes.AdjaAntId;
  110. refPes.MainAntLon = isMain ? maRefPes.MainAntLon : maRefPes.AdjaAntLon;
  111. refPes.MainAntLat = isMain ? maRefPes.MainAntLat : maRefPes.AdjaAntLat;
  112. refPes.MainAntAlt = isMain ? maRefPes.MainAntAlt : maRefPes.MainAntAlt;
  113. refPes.MainEphX = isMain ? maRefPes.MainEphX : maRefPes.AdjaEphX;
  114. refPes.MainEphY = isMain ? maRefPes.MainEphY : maRefPes.AdjaEphY;
  115. refPes.MainEphZ = isMain ? maRefPes.MainEphZ : maRefPes.AdjaEphZ;
  116. refPes.MainEphVx = isMain ? maRefPes.MainEphVx : maRefPes.AdjaEphVx;
  117. refPes.MainEphVy = isMain ? maRefPes.MainEphVy : maRefPes.AdjaEphVy;
  118. refPes.MainEphVz = isMain ? maRefPes.MainEphVz : maRefPes.AdjaEphVz;
  119. refPes.AdjaSatId = !isMain ? maRefPes.MainSatId : maRefPes.AdjaSatId;
  120. refPes.AdjaSatNum = !isMain ? maRefPes.MainSatNum : maRefPes.AdjaSatNum;
  121. refPes.AdjaAntId = !isMain ? maRefPes.MainAntId : maRefPes.AdjaAntId;
  122. refPes.AdjaAntLon = !isMain ? maRefPes.MainAntLon : maRefPes.AdjaAntLon;
  123. refPes.AdjaAntLat = !isMain ? maRefPes.MainAntLat : maRefPes.AdjaAntLat;
  124. refPes.AdjaAntAlt = !isMain ? maRefPes.MainAntAlt : maRefPes.MainAntAlt;
  125. refPes.AdjaEphX = !isMain ? maRefPes.MainEphX : maRefPes.AdjaEphX;
  126. refPes.AdjaEphY = !isMain ? maRefPes.MainEphY : maRefPes.AdjaEphY;
  127. refPes.AdjaEphZ = !isMain ? maRefPes.MainEphZ : maRefPes.AdjaEphZ;
  128. refPes.AdjaEphVx = !isMain ? maRefPes.MainEphVx : maRefPes.AdjaEphVx;
  129. refPes.AdjaEphVy = !isMain ? maRefPes.MainEphVy : maRefPes.AdjaEphVy;
  130. refPes.AdjaEphVz = !isMain ? maRefPes.MainEphVz : maRefPes.AdjaEphVz;
  131. refPes.StartPos = maRefPes.StartPos;
  132. refPes.Length = maRefPes.Length;
  133. refPes.IsValid = true;
  134. refPes.Dt = maRefPes.Dt * (isMain ? 1 : -1);
  135. refPes.Df = maRefPes.Df * (isMain ? 1 : -1);
  136. refPes.Snr = maRefPes.Snr;
  137. refPes.Dt = CalcRefDt(tarPes, refPes);
  138. refPes.Df = refPes.Df;
  139. //if (SpsConst.EnableDtfLoc)
  140. //{
  141. // refPes.Df = CalcRefDf(tarPes, refPes) + SpsConst.DefaultStdfErr;
  142. //}
  143. refPes.SigTime = tarPes.SigTime;
  144. refPes.MainEphX = tarPes.MainEphX;
  145. refPes.MainEphY = tarPes.MainEphY;
  146. refPes.MainEphZ = tarPes.MainEphZ;
  147. refPes.MainEphVx = tarPes.MainEphVx;
  148. refPes.MainEphVy = tarPes.MainEphVy;
  149. refPes.MainEphVz = tarPes.MainEphVz;
  150. refPes.AdjaEphX = tarPes.AdjaEphX;
  151. refPes.AdjaEphY = tarPes.AdjaEphY;
  152. refPes.AdjaEphZ = tarPes.AdjaEphZ;
  153. refPes.AdjaEphVx = tarPes.AdjaEphVx;
  154. refPes.AdjaEphVy = tarPes.AdjaEphVy;
  155. refPes.AdjaEphVz = tarPes.AdjaEphVz;
  156. return refPes;
  157. }
  158. private Pes CreateRefPes(Pes tarPes, Pes mRefPes, Pes aRefPes)
  159. {
  160. var pesRef = new Pes();
  161. pesRef.SigId = mRefPes.SigId;
  162. pesRef.EmtId = mRefPes.EmtId;
  163. pesRef.SigTime = tarPes.SigTime;
  164. pesRef.Category = SignalCategory.RefSig;
  165. pesRef.SigFreq = mRefPes.SigFreq;
  166. pesRef.SigType = mRefPes.SigType;
  167. pesRef.SigLon = mRefPes.SigLon;
  168. pesRef.SigLat = mRefPes.SigLat;
  169. pesRef.SigAlt = mRefPes.SigAlt;
  170. pesRef.LonMin = mRefPes.LonMin;
  171. pesRef.LonMax = mRefPes.LonMax;
  172. pesRef.LatMin = mRefPes.LatMin;
  173. pesRef.LatMax = mRefPes.LatMax;
  174. pesRef.MainSatId = mRefPes.AdjaSatId;
  175. pesRef.MainSatNum = mRefPes.AdjaSatNum;
  176. pesRef.MainAntId = mRefPes.AdjaAntId;
  177. pesRef.MainAntLon = mRefPes.AdjaAntLon;
  178. pesRef.MainAntLat = mRefPes.AdjaAntLat;
  179. pesRef.MainAntAlt = mRefPes.AdjaAntAlt;
  180. pesRef.MainEphX = tarPes.MainEphX;
  181. pesRef.MainEphY = tarPes.MainEphY;
  182. pesRef.MainEphZ = tarPes.MainEphZ;
  183. pesRef.AdjaSatId = aRefPes.AdjaSatId;
  184. pesRef.AdjaSatNum = aRefPes.AdjaSatNum;
  185. pesRef.AdjaAntId = aRefPes.AdjaAntId;
  186. pesRef.AdjaAntLon = aRefPes.AdjaAntLon;
  187. pesRef.AdjaAntLat = aRefPes.AdjaAntLat;
  188. pesRef.AdjaAntAlt = aRefPes.AdjaAntAlt;
  189. pesRef.AdjaEphX = tarPes.AdjaEphX;
  190. pesRef.AdjaEphY = tarPes.AdjaEphY;
  191. pesRef.AdjaEphZ = tarPes.AdjaEphZ;
  192. pesRef.StartPos = mRefPes.StartPos;
  193. pesRef.Length = mRefPes.Length;
  194. pesRef.Df = aRefPes.Df - mRefPes.Df;
  195. pesRef.Snr = Math.Min(mRefPes.Snr, aRefPes.Snr);
  196. pesRef.IsValid = true;
  197. var mRefDt = CalcRefDt(tarPes, mRefPes);
  198. var aRefDt = CalcRefDt(tarPes, aRefPes);
  199. pesRef.Dt = aRefDt - mRefDt;
  200. return pesRef;
  201. }
  202. private double CalcRefDt(Pes tarPes, Pes refPes)
  203. {
  204. double refDt = refPes.Dt;
  205. if (Math.Abs((tarPes.SigTime - refPes.SigTime).TotalSeconds) < 2)
  206. return refDt;
  207. if (refPes.MainSatId > 0)
  208. {
  209. var refTimeDt = GeoUtil.CalcDtoCenter(refPes.GetSigLLA(), refPes.GetMainEphXYZ(), refPes.GetAdjaEphXYZ(), refPes.GetMainAntLLA(), refPes.GetAdjaAntLLA());
  210. var tarTimeDt = GeoUtil.CalcDtoCenter(refPes.GetSigLLA(), tarPes.GetMainEphXYZ(), tarPes.GetAdjaEphXYZ(), refPes.GetMainAntLLA(), refPes.GetAdjaAntLLA());
  211. refDt = refPes.Dt - (refTimeDt - tarTimeDt);
  212. }
  213. else
  214. {
  215. var refTimeDt = GeoUtil.CalcDtoCenter(refPes.GetSigLLA(), refPes.GetAdjaEphXYZ(), refPes.GetAdjaAntLLA());
  216. bool isMain = tarPes.MainSatId == refPes.AdjaSatId;
  217. var tarEphX = isMain ? tarPes.MainEphX : tarPes.AdjaEphX;
  218. var tarEphY = isMain ? tarPes.MainEphY : tarPes.AdjaEphY;
  219. var tarEphZ = isMain ? tarPes.MainEphZ : tarPes.AdjaEphZ;
  220. var tarEphXyz = new[] { tarEphX, tarEphY, tarEphZ };
  221. var tarTimeDt = GeoUtil.CalcDtoCenter(refPes.GetSigLLA(), tarEphXyz, refPes.GetAdjaAntLLA());
  222. refDt = refPes.Dt - (refTimeDt - tarTimeDt);
  223. }
  224. return refDt;
  225. }
  226. private double CalcRefDf(Pes tarPes, Pes refPes)
  227. {
  228. double refDf = refPes.Df;
  229. bool isSameTime = Math.Abs((tarPes.SigTime - refPes.SigTime).TotalSeconds) < 2;
  230. if (isSameTime && (!SpsConst.EnableCatchFixError || tarPes.EmtId == 0))
  231. {
  232. return refDf;
  233. }
  234. var refLla = refPes.GetSigLLA();
  235. var mainAnt = refPes.GetMainAntLLA();
  236. var adjaAnt = refPes.GetAdjaAntLLA();
  237. var mainEph1 = refPes.GetMainEphXYZ();
  238. var adjaEph1 = refPes.GetAdjaEphXYZ();
  239. var mainEph2 = tarPes.GetMainEphXYZ();
  240. var adjaEph2 = tarPes.GetAdjaEphXYZ();
  241. var refFreqUp = refPes.SigFreq + SpsConst.DfoLocTurn;
  242. var turn = SpsConst.DfoLocTurn;
  243. //var mainEph1 = EphManager.Default.GetEph(refPes.MainSatNum, refPes.SigTime).GetEphXyz();
  244. //var adjaEph1 = EphManager.Default.GetEph(refPes.AdjaSatNum, refPes.SigTime).GetEphXyz();
  245. //var mainEph2 = EphManager.Default.GetEph(tarPes.MainSatNum, tarPes.SigTime).GetEphXyz();
  246. //var adjaEph2 = EphManager.Default.GetEph(tarPes.AdjaSatNum, tarPes.SigTime).GetEphXyz();
  247. if (refPes.MainSatId > 0)
  248. {
  249. //var refTimeDf = GeoUtil.CalcDtoCenter(refPes.GetSigLLA(), refPes.GetMainEphXYZ(), refPes.GetAdjaEphXYZ(), refPes.GetMainAntLLA(), refPes.GetAdjaAntLLA());
  250. //var tarTimeDf = GeoUtil.CalcDtoCenter(refPes.GetSigLLA(), tarPes.GetMainEphXYZ(), tarPes.GetAdjaEphXYZ(), refPes.GetMainAntLLA(), refPes.GetAdjaAntLLA());
  251. var refTimeDf = LocUtil.CalcDf(refFreqUp, turn, turn, refLla, mainEph1, adjaEph1, mainAnt, adjaAnt).Result.Result;
  252. var tarTimeDf = LocUtil.CalcDf(refFreqUp, turn, turn, refLla, mainEph2, adjaEph2, mainAnt, adjaAnt).Result.Result;
  253. refDf = refPes.Df - (refTimeDf - tarTimeDf);
  254. }
  255. else
  256. {
  257. //var refTimeDf = LocUtil.CalcDf(refFreqUp, turn, turn, refLla, mainEph1, adjaEph1, mainAnt, adjaAnt).Result.Result;
  258. //bool isMain = tarPes.MainSatId == refPes.AdjaSatId;
  259. //var tarEphX = isMain ? tarPes.MainEphX : tarPes.AdjaEphX;
  260. //var tarEphY = isMain ? tarPes.MainEphY : tarPes.AdjaEphY;
  261. //var tarEphZ = isMain ? tarPes.MainEphZ : tarPes.AdjaEphZ;
  262. //var tarEphXyz = new[] { tarEphX, tarEphY, tarEphZ };
  263. //var tarTimeDf = GeoUtil.CalcDtoCenter(refPes.GetSigLLA(), tarEphXyz, refPes.GetAdjaAntLLA());
  264. //refDf = refPes.Df - (-tart);
  265. }
  266. if (SpsConst.EnableCatchFixError)
  267. {
  268. var dfRefDiff = CalcDfCenter(tarPes, refPes);
  269. if (dfRefDiff.HasValue)
  270. {
  271. var realDiff = tarPes.Df - refDf;
  272. var errDfDiff = Math.Abs(dfRefDiff.Value - realDiff);
  273. var realDfNew = dfRefDiff.Value + errDfDiff * (isSameTime ? 0.4 : 0.6);
  274. refDf = tarPes.Df - realDfNew;
  275. }
  276. }
  277. return refDf;
  278. }
  279. public double[] CalcDtCR(DateTime sigTime, long sigFreq, int bandWidth, int mainAntId, int adjaAntId, EphResult mainEph, EphResult adjaEph)
  280. {
  281. var pes = GetSigLastPes(sigTime, sigFreq, bandWidth, mainAntId, adjaAntId, mainEph?.SatNum ?? 0, adjaEph.SatNum);
  282. if (pes == null) return null;
  283. double[] dtcr = null;
  284. if (mainAntId > 0 && adjaAntId > 0)
  285. {
  286. var dtc = GeoUtil.CalcLeadDt(pes.Dt, pes.GetSigLLA(), pes.GetMainAntLLA(), pes.GetAdjaAntLLA(), pes.GetMainEphXYZ(), pes.GetAdjaEphXYZ(), mainEph.GetEphXyz(), adjaEph.GetEphXyz());
  287. dtcr = new double[2] { dtc, 200 };
  288. }
  289. else if (adjaAntId > 0)
  290. {
  291. var dtc = GeoUtil.CalcLeadDt(pes.Dt, pes.GetSigLLA(), pes.GetAdjaAntLLA(), pes.GetAdjaEphXYZ(), adjaEph.GetEphXyz());
  292. dtcr = new double[2] { dtc, 200 };
  293. }
  294. return dtcr;
  295. }
  296. private double? CalcDfCenter(Pes tarPes, Pes refPes)
  297. {
  298. if (tarPes.EmtId == 0 || refPes == null) return null;
  299. var msAnt = tarPes.GetMainAntLLA();
  300. var nsAnt = tarPes.GetAdjaAntLLA();
  301. var msEph = tarPes.GetMainEphXYZ();
  302. var nsEph = tarPes.GetAdjaEphXYZ();
  303. var dt = tarPes.Dt;
  304. var df = tarPes.Df;
  305. var dtRef = refPes?.Dt ?? 0;
  306. var dfRef = refPes?.Df ?? 0;
  307. var freqUp = tarPes.SigFreq + SpsConst.DfoLocTurn;
  308. var refFreqUp = (refPes?.SigFreq ?? 0) + SpsConst.DfoLocTurn;
  309. var turn = SpsConst.DfoLocTurn;
  310. var refLla = refPes?.GetSigLLA() ?? null;
  311. var pos = tarPes.GetSigLLA();
  312. var df0 = Task.Run(
  313. () => Loc32Util.CalcDf(freqUp, turn, turn, tarPes.GetSigLLA(), msEph, nsEph, msAnt, nsAnt, refFreqUp, refLla).Result.Result).Result;
  314. return df0;
  315. }
  316. private Pes GetSigLastPes(DateTime sigTime, long sigFreq, int bandWidth, int mainAntId, int adjaAntId, int mainSatNum, int adjaSatNum)
  317. {
  318. Session session = new Session();
  319. var minSigTime = sigTime.AddMinutes(-RefFindMin);
  320. var pes = session.Query<Pes>()
  321. .Where(m => m.SigTime <= sigTime && m.SigTime >= minSigTime)
  322. .Where(m => m.SigFreq == sigFreq && m.BandWidth == bandWidth)
  323. .Where(m => m.MainAntId == mainAntId && m.AdjaAntId == adjaAntId)
  324. .Where(m => m.MainSatNum == mainSatNum && m.AdjaSatNum == adjaSatNum)
  325. .Where(m => m.IsValid && m.Snr > 15)
  326. .OrderByDescending(m => m.SigTime)
  327. .FirstOrDefault();
  328. return pes;
  329. }
  330. }
  331. }