EphHelper.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Diagnostics;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Runtime.InteropServices;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. namespace XdCxRhDW.Api
  11. {
  12. /// <summary>
  13. /// 星历推算帮助类.该类调用了Tle2XYZ.exe进程
  14. /// </summary>
  15. public static class EphHelper
  16. {
  17. private static readonly DateTime dtZero = new DateTime(1970, 1, 1, 0, 0, 0, 0);
  18. private const string dll = @"AddIns\星历推算\Tle2XYZ.dll";//此dll已加密
  19. #region cpp dll Interop
  20. [DllImport(dll, EntryPoint = "GenerateXYZByPeriod", CallingConvention = CallingConvention.Cdecl)]
  21. private extern static void GenerateXYZByPeriod(string line1, string line2, long startTime, int period, int count, double[] res);
  22. #endregion
  23. /// <summary>
  24. /// 推算双行星历
  25. /// </summary>
  26. /// <param name="tleStr">双行根数</param>
  27. /// <param name="utcTime">指定时刻(UTC)</param>
  28. /// <returns></returns>
  29. public static SatEphCore Calc(string tleStr, DateTime utcTime)
  30. {
  31. if (string.IsNullOrWhiteSpace(dll))
  32. throw new Exception($"找不到{dll}");
  33. tleStr = tleStr.Replace(";", ";");
  34. var line1 = tleStr.Split(';')[0];
  35. var line2 = tleStr.Split(';')[1];
  36. var timeSpan = (long)(utcTime - dtZero).TotalSeconds;
  37. double[] res = new double[6];
  38. GenerateXYZByPeriod(line1, line2, timeSpan, 1, 1, res);
  39. int satIdD = Convert.ToInt32(line2.Split(" ".ToArray(), StringSplitOptions.RemoveEmptyEntries)[1]);
  40. string timeStr = line1.Split(" ".ToArray(), StringSplitOptions.RemoveEmptyEntries)[3];
  41. //24078.27199282
  42. int year = Convert.ToInt32("20" + timeStr.Substring(0, 2));
  43. double days = Convert.ToDouble(timeStr.Substring(2));
  44. DateTime tleTime = new DateTime(year, 1, 1, 0, 0, 0);
  45. tleTime = tleTime.AddDays(days);
  46. var dto= new SatEphCore()
  47. {
  48. SatId = satIdD,
  49. SatTime = utcTime,
  50. TleTime = tleTime,
  51. X = Math.Round(res[0], 4),
  52. Y = Math.Round(res[1], 4),
  53. Z = Math.Round(res[2], 4),
  54. VX = Math.Round(res[3], 4),
  55. VY = Math.Round(res[4], 4),
  56. VZ = Math.Round(res[5], 4),
  57. };
  58. dto.Lon = Math.Round(PhysicsHelper.EcefToGeo((dto.X, dto.Y, dto.Z)).lon, 1);
  59. return dto;
  60. }
  61. /// <summary>
  62. /// 批量推算双行星历
  63. /// </summary>
  64. /// <param name="tleStr">双行根数</param>
  65. /// <param name="startUtc">起始时刻(UTC)</param>
  66. /// <param name="endUtc">结束(UTC)</param>
  67. /// <param name="spanSeconds">推算间隔(秒)</param>
  68. /// <returns></returns>
  69. public static List<SatEphCore> CalcMult(string tleStr, DateTime startUtc, DateTime endUtc, int spanSeconds)
  70. {
  71. if (string.IsNullOrWhiteSpace(dll))
  72. throw new Exception($"找不到{dll}");
  73. tleStr = tleStr.Replace(";", ";");
  74. if (tleStr.EndsWith(";"))
  75. tleStr = tleStr.Substring(0, tleStr.Length - 1);
  76. tleStr = tleStr.Replace(";", ";");
  77. var line1 = tleStr.Split(';')[0];
  78. var line2 = tleStr.Split(';')[1];
  79. var timeSpan = (long)(startUtc - dtZero).TotalSeconds;
  80. var c = (int)((endUtc - startUtc).TotalSeconds / spanSeconds + 1);
  81. double[] res = new double[6 * c];
  82. GenerateXYZByPeriod(line1, line2, timeSpan, spanSeconds, c, res);
  83. int satIdD = Convert.ToInt32(line2.Split(" ".ToArray(), StringSplitOptions.RemoveEmptyEntries)[1]);
  84. string timeStr = line1.Split(" ".ToArray(), StringSplitOptions.RemoveEmptyEntries)[3];
  85. //24078.27199282
  86. int year = Convert.ToInt32("20" + timeStr.Substring(0, 2));
  87. double days = Convert.ToDouble(timeStr.Substring(2));
  88. DateTime tleTime = new DateTime(year, 1, 1, 0, 0, 0);
  89. tleTime = tleTime.AddDays(days);
  90. var list = new List<SatEphCore>();
  91. for (int i = 0; i < res.Length; i += 6)
  92. {
  93. var dto = new SatEphCore()
  94. {
  95. SatId = satIdD,
  96. SatTime = startUtc.AddSeconds(i / 6 * spanSeconds),
  97. TleTime = tleTime,
  98. X = Math.Round(res[i], 4),
  99. Y = Math.Round(res[i + 1], 4),
  100. Z = Math.Round(res[i + 2], 4),
  101. VX = Math.Round(res[i + 3], 4),
  102. VY = Math.Round(res[i + 4], 4),
  103. VZ = Math.Round(res[i + 5], 4),
  104. };
  105. dto.Lon = Math.Round(PhysicsHelper.EcefToGeo((dto.X, dto.Y, dto.Z)).lon, 1);
  106. list.Add(dto);
  107. }
  108. return list;
  109. }
  110. }
  111. public class SatEphCore
  112. {
  113. /// <summary>
  114. /// 卫星编号
  115. /// </summary>
  116. public int SatId { get; set; }
  117. /// <summary>
  118. /// 时间UTC
  119. /// </summary>
  120. public DateTime SatTime { get; set; }
  121. /// <summary>
  122. /// 星历发布时刻UTC
  123. /// </summary>
  124. public DateTime TleTime { get; set; }
  125. /// <summary>
  126. /// 轨道经度
  127. /// </summary>
  128. public double Lon { get; set; }
  129. /// <summary>
  130. /// 坐标X
  131. /// </summary>
  132. public double X { get; set; }
  133. /// <summary>
  134. /// 坐标Y
  135. /// </summary>
  136. public double Y { get; set; }
  137. /// <summary>
  138. /// 坐标Z
  139. /// </summary>
  140. public double Z { get; set; }
  141. /// <summary>
  142. /// 速度VX(m/s)
  143. /// </summary>
  144. public double VX { get; set; }
  145. /// <summary>
  146. /// 速度VY(m/s)
  147. /// </summary>
  148. public double VY { get; set; }
  149. /// <summary>
  150. /// 速度VZ(m/s)
  151. /// </summary>
  152. public double VZ { get; set; }
  153. public override string ToString()
  154. {
  155. return $"{SatId}-{SatTime:yyyyMMddHHmmss}-{X},{Y},{Z},{VX},{VY},{VZ}";
  156. }
  157. }
  158. }