123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.IO;
- using System.Linq;
- using System.Runtime.InteropServices;
- using System.Text;
- using System.Threading.Tasks;
- namespace XdCxRhDW.Api
- {
- /// <summary>
- /// 星历推算帮助类.该类调用了Tle2XYZ.exe进程
- /// </summary>
- public static class EphHelper
- {
- private static readonly DateTime dtZero = new DateTime(1970, 1, 1, 0, 0, 0, 0);
- private const string dll = @"AddIns\星历推算\Tle2XYZ.dll";//此dll已加密
- #region cpp dll Interop
- [DllImport(dll, EntryPoint = "GenerateXYZByPeriod", CallingConvention = CallingConvention.Cdecl)]
- private extern static void GenerateXYZByPeriod(string line1, string line2, long startTime, int period, int count, double[] res);
- #endregion
- /// <summary>
- /// 推算双行星历
- /// </summary>
- /// <param name="tleStr">双行根数</param>
- /// <param name="utcTime">指定时刻(UTC)</param>
- /// <returns></returns>
- public static SatEphCore Calc(string tleStr, DateTime utcTime)
- {
- if (string.IsNullOrWhiteSpace(dll))
- throw new Exception($"找不到{dll}");
- tleStr = tleStr.Replace(";", ";");
- var line1 = tleStr.Split(';')[0];
- var line2 = tleStr.Split(';')[1];
- var timeSpan = (long)(utcTime - dtZero).TotalSeconds;
- double[] res = new double[6];
- GenerateXYZByPeriod(line1, line2, timeSpan, 1, 1, res);
- int satIdD = Convert.ToInt32(line2.Split(" ".ToArray(), StringSplitOptions.RemoveEmptyEntries)[1]);
- string timeStr = line1.Split(" ".ToArray(), StringSplitOptions.RemoveEmptyEntries)[3];
- //24078.27199282
- int year = Convert.ToInt32("20" + timeStr.Substring(0, 2));
- double days = Convert.ToDouble(timeStr.Substring(2));
- DateTime tleTime = new DateTime(year, 1, 1, 0, 0, 0);
- tleTime = tleTime.AddDays(days);
- var dto= new SatEphCore()
- {
- SatId = satIdD,
- SatTime = utcTime,
- TleTime = tleTime,
- X = Math.Round(res[0], 4),
- Y = Math.Round(res[1], 4),
- Z = Math.Round(res[2], 4),
- VX = Math.Round(res[3], 4),
- VY = Math.Round(res[4], 4),
- VZ = Math.Round(res[5], 4),
- };
- dto.Lon = Math.Round(PhysicsHelper.EcefToGeo((dto.X, dto.Y, dto.Z)).lon, 1);
- return dto;
- }
- /// <summary>
- /// 批量推算双行星历
- /// </summary>
- /// <param name="tleStr">双行根数</param>
- /// <param name="startUtc">起始时刻(UTC)</param>
- /// <param name="endUtc">结束(UTC)</param>
- /// <param name="spanSeconds">推算间隔(秒)</param>
- /// <returns></returns>
- public static List<SatEphCore> CalcMult(string tleStr, DateTime startUtc, DateTime endUtc, int spanSeconds)
- {
- if (string.IsNullOrWhiteSpace(dll))
- throw new Exception($"找不到{dll}");
- tleStr = tleStr.Replace(";", ";");
- if (tleStr.EndsWith(";"))
- tleStr = tleStr.Substring(0, tleStr.Length - 1);
- tleStr = tleStr.Replace(";", ";");
- var line1 = tleStr.Split(';')[0];
- var line2 = tleStr.Split(';')[1];
- var timeSpan = (long)(startUtc - dtZero).TotalSeconds;
- var c = (int)((endUtc - startUtc).TotalSeconds / spanSeconds + 1);
- double[] res = new double[6 * c];
- GenerateXYZByPeriod(line1, line2, timeSpan, spanSeconds, c, res);
- int satIdD = Convert.ToInt32(line2.Split(" ".ToArray(), StringSplitOptions.RemoveEmptyEntries)[1]);
- string timeStr = line1.Split(" ".ToArray(), StringSplitOptions.RemoveEmptyEntries)[3];
- //24078.27199282
- int year = Convert.ToInt32("20" + timeStr.Substring(0, 2));
- double days = Convert.ToDouble(timeStr.Substring(2));
- DateTime tleTime = new DateTime(year, 1, 1, 0, 0, 0);
- tleTime = tleTime.AddDays(days);
- var list = new List<SatEphCore>();
- for (int i = 0; i < res.Length; i += 6)
- {
- var dto = new SatEphCore()
- {
- SatId = satIdD,
- SatTime = startUtc.AddSeconds(i / 6 * spanSeconds),
- TleTime = tleTime,
- X = Math.Round(res[i], 4),
- Y = Math.Round(res[i + 1], 4),
- Z = Math.Round(res[i + 2], 4),
- VX = Math.Round(res[i + 3], 4),
- VY = Math.Round(res[i + 4], 4),
- VZ = Math.Round(res[i + 5], 4),
- };
- dto.Lon = Math.Round(PhysicsHelper.EcefToGeo((dto.X, dto.Y, dto.Z)).lon, 1);
- list.Add(dto);
- }
- return list;
- }
- }
- public class SatEphCore
- {
- /// <summary>
- /// 卫星编号
- /// </summary>
- public int SatId { get; set; }
- /// <summary>
- /// 时间UTC
- /// </summary>
- public DateTime SatTime { get; set; }
- /// <summary>
- /// 星历发布时刻UTC
- /// </summary>
- public DateTime TleTime { get; set; }
- /// <summary>
- /// 轨道经度
- /// </summary>
- public double Lon { get; set; }
- /// <summary>
- /// 坐标X
- /// </summary>
- public double X { get; set; }
- /// <summary>
- /// 坐标Y
- /// </summary>
- public double Y { get; set; }
- /// <summary>
- /// 坐标Z
- /// </summary>
- public double Z { get; set; }
- /// <summary>
- /// 速度VX(m/s)
- /// </summary>
- public double VX { get; set; }
- /// <summary>
- /// 速度VY(m/s)
- /// </summary>
- public double VY { get; set; }
- /// <summary>
- /// 速度VZ(m/s)
- /// </summary>
- public double VZ { get; set; }
- public override string ToString()
- {
- return $"{SatId}-{SatTime:yyyyMMddHHmmss}-{X},{Y},{Z},{VX},{VY},{VZ}";
- }
- }
- }
|