EphHelper.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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="dt">指定时刻(北京时间)</param>
  28. /// <returns></returns>
  29. public static SatEphCore Calc(string tleStr, DateTime dt)
  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 dtUtc = dt.AddHours(-8);
  37. var timeSpan = (long)(dtUtc - dtZero).TotalSeconds;
  38. double[] res = new double[6];
  39. GenerateXYZByPeriod(line1, line2, timeSpan, 1, 1, res);
  40. int satIdD = Convert.ToInt32(line2.Split(" ".ToArray(), StringSplitOptions.RemoveEmptyEntries)[1]);
  41. string timeStr = line1.Split(" ".ToArray(), StringSplitOptions.RemoveEmptyEntries)[3];
  42. //24078.27199282
  43. int year = Convert.ToInt32("20" + timeStr.Substring(0, 2));
  44. double days = Convert.ToDouble(timeStr.Substring(2));
  45. DateTime tleTime = new DateTime(year, 1, 1, 8, 0, 0);
  46. tleTime = tleTime.AddDays(days);
  47. var dto= new SatEphCore()
  48. {
  49. SatId = satIdD,
  50. SatTime = dt,
  51. TleTime = tleTime,
  52. X = Math.Round(res[0], 4),
  53. Y = Math.Round(res[1], 4),
  54. Z = Math.Round(res[2], 4),
  55. VX = Math.Round(res[3], 4),
  56. VY = Math.Round(res[4], 4),
  57. VZ = Math.Round(res[5], 4),
  58. };
  59. dto.Lon = Math.Round(PhysicsHelper.EcefToGeo((dto.X, dto.Y, dto.Z)).lon, 1);
  60. return dto;
  61. }
  62. /// <summary>
  63. /// 批量推算双行星历
  64. /// </summary>
  65. /// <param name="tleStr">双行根数</param>
  66. /// <param name="start">起始时刻(北京)</param>
  67. /// <param name="end">结束(北京)</param>
  68. /// <param name="spanSeconds">推算间隔(秒)</param>
  69. /// <returns></returns>
  70. public static List<SatEphCore> CalcMult(string tleStr, DateTime start, DateTime end, int spanSeconds)
  71. {
  72. if (string.IsNullOrWhiteSpace(dll))
  73. throw new Exception($"找不到{dll}");
  74. tleStr = tleStr.Replace(";", ";");
  75. if (tleStr.EndsWith(";"))
  76. tleStr = tleStr.Substring(0, tleStr.Length - 1);
  77. tleStr = tleStr.Replace(";", ";");
  78. var line1 = tleStr.Split(';')[0];
  79. var line2 = tleStr.Split(';')[1];
  80. var dtUtc = start.AddHours(-8);
  81. var timeSpan = (long)(dtUtc - dtZero).TotalSeconds;
  82. var c = (int)((end - start).TotalSeconds / spanSeconds + 1);
  83. double[] res = new double[6 * c];
  84. GenerateXYZByPeriod(line1, line2, timeSpan, spanSeconds, c, res);
  85. int satIdD = Convert.ToInt32(line2.Split(" ".ToArray(), StringSplitOptions.RemoveEmptyEntries)[1]);
  86. string timeStr = line1.Split(" ".ToArray(), StringSplitOptions.RemoveEmptyEntries)[3];
  87. //24078.27199282
  88. int year = Convert.ToInt32("20" + timeStr.Substring(0, 2));
  89. double days = Convert.ToDouble(timeStr.Substring(2));
  90. DateTime tleTime = new DateTime(year, 1, 1, 8, 0, 0);
  91. tleTime = tleTime.AddDays(days);
  92. var list = new List<SatEphCore>();
  93. for (int i = 0; i < res.Length; i += 6)
  94. {
  95. var dto = new SatEphCore()
  96. {
  97. SatId = satIdD,
  98. SatTime = start.AddSeconds(i / 6 * spanSeconds),
  99. TleTime = tleTime,
  100. X = Math.Round(res[i], 4),
  101. Y = Math.Round(res[i + 1], 4),
  102. Z = Math.Round(res[i + 2], 4),
  103. VX = Math.Round(res[i + 3], 4),
  104. VY = Math.Round(res[i + 4], 4),
  105. VZ = Math.Round(res[i + 5], 4),
  106. };
  107. dto.Lon = Math.Round(PhysicsHelper.EcefToGeo((dto.X, dto.Y, dto.Z)).lon, 1);
  108. list.Add(dto);
  109. }
  110. return list;
  111. }
  112. }
  113. public class SatEphCore
  114. {
  115. /// <summary>
  116. /// 卫星编号
  117. /// </summary>
  118. public int SatId { get; set; }
  119. /// <summary>
  120. /// 时间(北京)
  121. /// </summary>
  122. public DateTime SatTime { get; set; }
  123. /// <summary>
  124. /// 星历发布时刻(北京时间)
  125. /// </summary>
  126. public DateTime TleTime { get; set; }
  127. /// <summary>
  128. /// 轨道经度
  129. /// </summary>
  130. public double Lon { get; set; }
  131. /// <summary>
  132. /// 坐标X
  133. /// </summary>
  134. public double X { get; set; }
  135. /// <summary>
  136. /// 坐标Y
  137. /// </summary>
  138. public double Y { get; set; }
  139. /// <summary>
  140. /// 坐标Z
  141. /// </summary>
  142. public double Z { get; set; }
  143. /// <summary>
  144. /// 速度VX(m/s)
  145. /// </summary>
  146. public double VX { get; set; }
  147. /// <summary>
  148. /// 速度VY(m/s)
  149. /// </summary>
  150. public double VY { get; set; }
  151. /// <summary>
  152. /// 速度VZ(m/s)
  153. /// </summary>
  154. public double VZ { get; set; }
  155. public override string ToString()
  156. {
  157. return $"{SatId}-{SatTime:yyyyMMddHHmmss}-{X},{Y},{Z},{VX},{VY},{VZ}";
  158. }
  159. }
  160. }