using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Data.Entity; using System.Data.Entity.Migrations; using System.Data.SqlClient; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web.Http; using XdCxRhDW.Dto; using XdCxRhDW.Api; using XdCxRhDW.Entity; using XdCxRhDW.Repostory; using XdCxRhDW.WebApi; namespace XdCxRhDW.App.Controllers { /// /// 星历推算功能相关接口 /// public class XlController : BaseController { /// /// 导入Tle星历文件 /// /// 星历导入参数 /// [HttpPost] public async Task> ImportTleAsync(XlImportDto dto) { //https://www.space-track.org/documentation#tle网站上有星历文件格式说明 string line = null; try { var count = await Task.Run(async () => { var lines = File.ReadAllLines(GetLocalFile(dto.File)).ToList(); lines.RemoveAll(p => string.IsNullOrWhiteSpace(p)); List tmp = new List(); for (int i = 0; i < lines.Count; i += 3) { line = lines[i]; var satName = lines[i].Trim(); if (satName.StartsWith("0 ")) satName = satName.Substring(2).Trim(); if (satName.StartsWith("TBA"))//待发布的卫星 continue; XlInfo xl = new XlInfo() { SatName = satName, Line1 = lines[i + 1], Line2 = lines[i + 2], SatCode = Convert.ToInt32(lines[i + 1].Substring(2, 5)) }; var timeStr = lines[i + 1].Substring(18, 14).Replace(" ", "");//https://www.space-track.org/documentation#tle星历接口中说这里面可以接受空格 var yearStr = timeStr.Substring(0, 2); var dayStr = timeStr.Substring(2, timeStr.Length - 2); var day = Convert.ToDouble(dayStr); var year = 2000 + Convert.ToInt32(yearStr); DateTime dt = new DateTime(year, 1, 1, 0, 0, 0); dt = dt.AddDays(day); xl.TimeUTC = dt; tmp.Add(xl); } using (RHDWContext db = new RHDWContext()) { db.XlInfos.AddRange(tmp); await db.SaveChangesAsync(); } return tmp.Count; }); Serilog.Log.Information($"星历导入成功,共{count}条"); return Success(new RecordRes(count)); } catch (Exception ex) { Serilog.Log.Error(ex, $"{line}星历导入异常"); return Error(ex.Message); } finally { try { File.Delete(GetLocalFile(dto.File)); } catch { } } } /// /// 推算某个时间点XYZ星历 /// /// 推算参数 /// [HttpPost] public AjaxResult Calc(XlCalcDto dto) { try { var p = EphHelper.Calc(dto.tleStr, dto.SigTime.ToUtc()); return Success(new SatEphResDto() { SatId = p.SatId, SatTime = p.SatTime.AddHours(SysConfig.Config.ZoneHours), TleTime = p.TleTime.AddHours(SysConfig.Config.ZoneHours), Lon = p.Lon, X = p.X, Y = p.Y, Z = p.Z, VX = p.VX, VY = p.VY, VZ = p.VZ, }); } catch (Exception ex) { return Error(ex.Message); } } /// /// 推算某个时间段XYZ星星历 /// /// 推算参数 /// [HttpPost] public AjaxResult> CalcMult(XlCalcMultDto dto) { try { var eph = EphHelper.CalcMult(dto.tleStr, dto.startTime.ToUtc(), dto.endTime.ToUtc(), dto.spanSeconds); return Success(eph.Select(p => new EphResDto() { SatId = p.SatId, SatTime = p.SatTime.AddHours(SysConfig.Config.ZoneHours), TleTime = p.TleTime.AddHours(SysConfig.Config.ZoneHours), Lon = p.Lon, X = p.X, Y = p.Y, Z = p.Z, VX = p.VX, VY = p.VY, VZ = p.VZ, }).ToList()); } catch (Exception ex) { return Error>(ex.Message); } } } }