|
@@ -4,9 +4,11 @@ using DevExpress.XtraPrinting;
|
|
|
using Newtonsoft.Json;
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
+using System.Data.Entity.Core.Common.EntitySql;
|
|
|
using System.Diagnostics;
|
|
|
using System.IO;
|
|
|
using System.Linq;
|
|
|
+using System.Runtime.InteropServices;
|
|
|
using System.Text;
|
|
|
using System.Threading.Tasks;
|
|
|
using XdCxRhDW.App.DTO;
|
|
@@ -24,350 +26,72 @@ namespace XzXdDw.App.Api.星地GDOP误差椭圆
|
|
|
private static string exePath = "Api\\星地GDOP误差椭圆\\GDOP";
|
|
|
private const string exeName = "GdopCore.exe";
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// 三星双时差GDOP误差分布带参
|
|
|
- /// </summary>
|
|
|
- /// <param name="refLonLat">参考站经纬度,数组长度=2</param>
|
|
|
- /// <param name="mainSatTle">主星双行根数</param>
|
|
|
- /// <param name="adja1SatTle">邻1星双行根数</param>
|
|
|
- /// <param name="adja2SatTle">邻2星双行根数</param>
|
|
|
- /// <param name="time">采集时刻</param>
|
|
|
- /// <param name="dtousErr">时差误差(单位us)</param>
|
|
|
- /// <param name="satLocErr">星历位置误差(单位米)</param>
|
|
|
- /// <returns></returns>
|
|
|
- public static (List<SatInfo>, List<ErrDistanceMapLines>) Gdop3Sat2DtoRef(double[] refLonLat, string mainSatTle, string adja1SatTle, string adja2SatTle, DateTime time, double dtousErr = 1, double satLocErr = 10000)
|
|
|
- {
|
|
|
- if (string.IsNullOrWhiteSpace(exePath))
|
|
|
- throw new Exception($"请先调用SetExePath指定{exeName}进程所在路径,支持相对路径");
|
|
|
- if (!Directory.Exists(exePath))
|
|
|
- throw new Exception($"路径[{exePath}]不存在");
|
|
|
- var exeFile = Path.Combine(exePath, exeName);
|
|
|
- if (!File.Exists(exeFile))
|
|
|
- throw new Exception($"文件[{exeFile}]不存在");
|
|
|
- Process p = new Process();
|
|
|
- p.StartInfo.WorkingDirectory = exePath;
|
|
|
- p.StartInfo.FileName = exeFile;
|
|
|
- p.StartInfo.Arguments = $"60 \"{mainSatTle}\" \"{adja1SatTle}\" \"{adja2SatTle}\" \"{time:yyyy-MM-dd HH:mm:ss.000000}\" {string.Join(" ", refLonLat)} {dtousErr} {satLocErr}";
|
|
|
- p.StartInfo.CreateNoWindow = true;
|
|
|
- p.StartInfo.RedirectStandardError = true;
|
|
|
- p.StartInfo.RedirectStandardOutput = true;
|
|
|
- p.StartInfo.UseShellExecute = false;
|
|
|
- StringBuilder sb = new StringBuilder();
|
|
|
- p.OutputDataReceived += (sender, e) => sb.Append(e.Data);
|
|
|
- p.Start();
|
|
|
- p.BeginOutputReadLine();
|
|
|
- p.WaitForExit();//WaitForExit加了超时时间的话进程退出后不能保证异步流已经读取完成,这是.NET框架的BUG
|
|
|
- return ParseResult(3, sb.ToString());
|
|
|
- }
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- /// 三星双时差GDOP误差分布带参
|
|
|
- /// </summary>
|
|
|
- /// <param name="refLonLat">参考站经纬度,数组长度=2</param>
|
|
|
- /// <param name="mainSatEph">主星xyz星历,数组长度=3</param>
|
|
|
- /// <param name="adja1SatEph">邻1星xyz星历,数组长度=3</param>
|
|
|
- /// <param name="adja2SatEph">邻2星xyz星历,数组长度=3</param>
|
|
|
- /// <param name="dtousErr">时差误差(单位us)</param>
|
|
|
- /// <param name="satLocErr">星历位置误差(单位米)</param>
|
|
|
- /// <returns></returns>
|
|
|
- /// <exception cref="Exception"></exception>
|
|
|
- public static (List<SatInfo>, List<ErrDistanceMapLines>) Gdop3Sat2DtoRef(double[] refLonLat, double[] mainSatEph, double[] adja1SatEph, double[] adja2SatEph, double dtousErr = 1, double satLocErr = 10000)
|
|
|
- {
|
|
|
- if (string.IsNullOrWhiteSpace(exePath))
|
|
|
- throw new Exception($"请先调用SetExePath指定{exeName}进程所在路径,支持相对路径");
|
|
|
- if (!Directory.Exists(exePath))
|
|
|
- throw new Exception($"路径[{exePath}]不存在");
|
|
|
- var exeFile = Path.Combine(exePath, exeName);
|
|
|
- if (!File.Exists(exeFile))
|
|
|
- throw new Exception($"文件[{exeFile}]不存在");
|
|
|
- Process p = new Process();
|
|
|
- p.StartInfo.WorkingDirectory = exePath;
|
|
|
- p.StartInfo.FileName = exeFile;
|
|
|
- p.StartInfo.Arguments = $"61 {string.Join(" ", mainSatEph)} {string.Join(" ", adja1SatEph)} {string.Join(" ", adja2SatEph)} {string.Join(" ", refLonLat)} {dtousErr} {satLocErr}";
|
|
|
- p.StartInfo.CreateNoWindow = true;
|
|
|
- p.StartInfo.RedirectStandardError = true;
|
|
|
- p.StartInfo.RedirectStandardOutput = true;
|
|
|
- p.StartInfo.UseShellExecute = false;
|
|
|
- StringBuilder sb = new StringBuilder();
|
|
|
- p.OutputDataReceived += (sender, e) => sb.Append(e.Data);
|
|
|
- p.Start();
|
|
|
- p.BeginOutputReadLine();
|
|
|
- p.WaitForExit();//WaitForExit加了超时时间的话进程退出后不能保证异步流已经读取完成,这是.NET框架的BUG
|
|
|
- return ParseResult(3, sb.ToString());
|
|
|
- }
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- /// 三星双时差GDOP误差分布无参
|
|
|
- /// </summary>
|
|
|
- /// <param name="recLonLat">接收站经纬度,数组长度=2</param>
|
|
|
- /// <param name="mainSatTle">主星双行根数</param>
|
|
|
- /// <param name="adja1SatTle">邻1星双行根数</param>
|
|
|
- /// <param name="adja2SatTle">邻2星双行根数</param>
|
|
|
- /// <param name="time">采集时刻</param>
|
|
|
- /// <param name="dtousErr">时差误差(单位us)</param>
|
|
|
- /// <param name="satLocErr">星历位置误差(单位米)</param>
|
|
|
- /// <returns></returns>
|
|
|
- public static (List<SatInfo>, List<ErrDistanceMapLines>) Gdop3Sat2Dto(double[] recLonLat, string mainSatTle, string adja1SatTle, string adja2SatTle, DateTime time, double dtousErr = 1, double satLocErr = 10000)
|
|
|
- {
|
|
|
- if (string.IsNullOrWhiteSpace(exePath))
|
|
|
- throw new Exception($"请先调用SetExePath指定{exeName}进程所在路径,支持相对路径");
|
|
|
- if (!Directory.Exists(exePath))
|
|
|
- throw new Exception($"路径[{exePath}]不存在");
|
|
|
- var exeFile = Path.Combine(exePath, exeName);
|
|
|
- if (!File.Exists(exeFile))
|
|
|
- throw new Exception($"文件[{exeFile}]不存在");
|
|
|
- Process p = new Process();
|
|
|
- p.StartInfo.WorkingDirectory = exePath;
|
|
|
- p.StartInfo.FileName = exeFile;
|
|
|
- p.StartInfo.Arguments = $"62 \"{mainSatTle}\" \"{adja1SatTle}\" \"{adja2SatTle}\" \"{time:yyyy-MM-dd HH:mm:ss.000000}\" {string.Join(" ", recLonLat)} {dtousErr} {satLocErr}";
|
|
|
- p.StartInfo.CreateNoWindow = true;
|
|
|
- p.StartInfo.RedirectStandardError = true;
|
|
|
- p.StartInfo.RedirectStandardOutput = true;
|
|
|
- p.StartInfo.UseShellExecute = false;
|
|
|
- StringBuilder sb = new StringBuilder();
|
|
|
- p.OutputDataReceived += (sender, e) => sb.Append(e.Data);
|
|
|
- p.Start();
|
|
|
- p.BeginOutputReadLine();
|
|
|
- p.WaitForExit();//WaitForExit加了超时时间的话进程退出后不能保证异步流已经读取完成,这是.NET框架的BUG
|
|
|
- return ParseResult(3, sb.ToString());
|
|
|
- }
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- /// 三星双时差GDOP误差分布无参
|
|
|
- /// </summary>
|
|
|
- /// <param name="recLonLat">接收站经纬度,数组长度=2</param>
|
|
|
- /// <param name="mainSatEph">主星xyz星历,数组长度=3</param>
|
|
|
- /// <param name="adja1SatEph">邻1星xyz星历,数组长度=3</param>
|
|
|
- /// <param name="adja2SatEph">邻2星xyz星历,数组长度=3</param>
|
|
|
- /// <param name="dtousErr">时差误差(单位us)</param>
|
|
|
- /// <param name="satLocErr">星历位置误差(单位米)</param>
|
|
|
- /// <returns></returns>
|
|
|
- /// <exception cref="Exception"></exception>
|
|
|
- public static (List<SatInfo>, List<ErrDistanceMapLines>) Gdop3Sat2Dto(double[] recLonLat, double[] mainSatEph, double[] adja1SatEph, double[] adja2SatEph, double dtousErr = 1, double satLocErr = 10000)
|
|
|
- {
|
|
|
- if (string.IsNullOrWhiteSpace(exePath))
|
|
|
- throw new Exception($"请先调用SetExePath指定{exeName}进程所在路径,支持相对路径");
|
|
|
- if (!Directory.Exists(exePath))
|
|
|
- throw new Exception($"路径[{exePath}]不存在");
|
|
|
- var exeFile = Path.Combine(exePath, exeName);
|
|
|
- if (!File.Exists(exeFile))
|
|
|
- throw new Exception($"文件[{exeFile}]不存在");
|
|
|
- Process p = new Process();
|
|
|
- p.StartInfo.WorkingDirectory = exePath;
|
|
|
- p.StartInfo.FileName = exeFile;
|
|
|
- p.StartInfo.Arguments = $"63 {string.Join(" ", mainSatEph)} {string.Join(" ", adja1SatEph)} {string.Join(" ", adja2SatEph)} {string.Join(" ", recLonLat)} {dtousErr} {satLocErr}";
|
|
|
- p.StartInfo.CreateNoWindow = true;
|
|
|
- p.StartInfo.RedirectStandardError = true;
|
|
|
- p.StartInfo.RedirectStandardOutput = true;
|
|
|
- p.StartInfo.UseShellExecute = false;
|
|
|
- StringBuilder sb = new StringBuilder();
|
|
|
- p.OutputDataReceived += (sender, e) => sb.Append(e.Data);
|
|
|
- p.Start();
|
|
|
- p.BeginOutputReadLine();
|
|
|
- p.WaitForExit();//WaitForExit加了超时时间的话进程退出后不能保证异步流已经读取完成,这是.NET框架的BUG
|
|
|
- return ParseResult(3, sb.ToString());
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- /// 双星时频差GDOP误差分布带参
|
|
|
- /// </summary>
|
|
|
- /// <param name="tarFreqUpMHz">目标上行频点MHz</param>
|
|
|
- /// <param name="refFreqUpMHz">参考上行频点MHz</param>
|
|
|
- /// <param name="mainSatTransMHz">主星转发器本振MHz</param>
|
|
|
- /// <param name="adjaSatTransMHz">邻星转发器本振MHz</param>
|
|
|
- /// <param name="recLonLat">接收站经纬度,数组长度=2</param>
|
|
|
- /// <param name="refLonLat">参考站经纬度,数组长度=2</param>
|
|
|
- /// <param name="mainTle">主星双行根数</param>
|
|
|
- /// <param name="adjaTle">邻星双行根数</param>
|
|
|
- /// <param name="time">采集时刻</param>
|
|
|
- /// <param name="dtousErr">时差误差(单位us)</param>
|
|
|
- /// <param name="dfoHzErr">频差误差(单位Hz)</param>
|
|
|
- /// <param name="satLocErr">星历位置误差(单位米)</param>
|
|
|
- /// <returns></returns>
|
|
|
- public static (List<SatInfo>, List<ErrDistanceMapLines>) Gdop2SatDtoDfoRef(double tarFreqUpMHz, double refFreqUpMHz, double mainSatTransMHz, double adjaSatTransMHz, double[] recLonLat, double[] refLonLat, string mainTle, string adjaTle, DateTime time, double dtousErr = 1, double dfoHzErr = 1, double satLocErr = 10000)
|
|
|
- {
|
|
|
- if (string.IsNullOrWhiteSpace(exePath))
|
|
|
- throw new Exception($"请先调用SetExePath指定{exeName}进程所在路径,支持相对路径");
|
|
|
- if (!Directory.Exists(exePath))
|
|
|
- throw new Exception($"路径[{exePath}]不存在");
|
|
|
- var exeFile = Path.Combine(exePath, exeName);
|
|
|
- if (!File.Exists(exeFile))
|
|
|
- throw new Exception($"文件[{exeFile}]不存在");
|
|
|
- Process p = new Process();
|
|
|
- p.StartInfo.WorkingDirectory = exePath;
|
|
|
- p.StartInfo.FileName = exeFile;
|
|
|
- p.StartInfo.Arguments = $"64 \"{mainTle}\" \"{adjaTle}\" \"{time:yyyy-MM-dd HH:mm:ss.000000}\" {string.Join(" ", recLonLat)} {string.Join(" ", refLonLat)} {tarFreqUpMHz} {refFreqUpMHz} {mainSatTransMHz} {adjaSatTransMHz} {dtousErr} {dfoHzErr} {satLocErr}";
|
|
|
- p.StartInfo.CreateNoWindow = true;
|
|
|
- p.StartInfo.RedirectStandardError = true;
|
|
|
- p.StartInfo.RedirectStandardOutput = true;
|
|
|
- p.StartInfo.UseShellExecute = false;
|
|
|
- StringBuilder sb = new StringBuilder();
|
|
|
- p.OutputDataReceived += (sender, e) => sb.Append(e.Data);
|
|
|
- p.Start();
|
|
|
- p.BeginOutputReadLine();
|
|
|
- p.WaitForExit();//WaitForExit加了超时时间的话进程退出后不能保证异步流已经读取完成,这是.NET框架的BUG
|
|
|
- return ParseResult(2, sb.ToString());
|
|
|
- }
|
|
|
+ private const string GDOPDll = @"Api\星地GDOP误差椭圆\GDOP\GDOP_Draw.dll";
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// 双星时频差GDOP误差分布带参
|
|
|
- /// </summary>
|
|
|
- /// <param name="tarFreqUpMHz">目标上行频点MHz</param>
|
|
|
- /// <param name="refFreqUpMHz">参考上行频点MHz</param>
|
|
|
- /// <param name="mainSatTransMHz">主星转发器本振MHz</param>
|
|
|
- /// <param name="adjaSatTransMHz">邻星转发器本振MHz</param>
|
|
|
- /// <param name="recLonLat">接收站经纬度,数组长度=2</param>
|
|
|
- /// <param name="refLonLat">参考站经纬度,数组长度=2</param>
|
|
|
- /// <param name="mainSatEph">主星星历xyz vx vy vz,数组长度=6</param>
|
|
|
- /// <param name="adjaSatEph">邻星星历xyz vx vy vz,数组长度=6</param>
|
|
|
- /// <param name="dtousErr">时差误差(单位us)</param>
|
|
|
- /// <param name="dfoHzErr">频差误差(单位Hz)</param>
|
|
|
- /// <param name="satLocErr">星历位置误差(单位米)</param>
|
|
|
+ static readonly DateTime dtZero = new DateTime(1970, 1, 1, 8, 0, 0, 0);
|
|
|
/// <returns></returns>
|
|
|
- public static (List<SatInfo>, List<ErrDistanceMapLines>) Gdop2SatDtoDfoRef(double tarFreqUpMHz, double refFreqUpMHz, double mainSatTransMHz, double adjaSatTransMHz, double[] recLonLat, double[] refLonLat, double[] mainSatEph, double[] adjaSatEph, double dtousErr = 1, double dfoHzErr = 1, double satLocErr = 10000)
|
|
|
- {
|
|
|
- if (string.IsNullOrWhiteSpace(exePath))
|
|
|
- throw new Exception($"请先调用SetExePath指定{exeName}进程所在路径,支持相对路径");
|
|
|
- if (!Directory.Exists(exePath))
|
|
|
- throw new Exception($"路径[{exePath}]不存在");
|
|
|
- var exeFile = Path.Combine(exePath, exeName);
|
|
|
- if (!File.Exists(exeFile))
|
|
|
- throw new Exception($"文件[{exeFile}]不存在");
|
|
|
- Process p = new Process();
|
|
|
- p.StartInfo.WorkingDirectory = exePath;
|
|
|
- p.StartInfo.FileName = exeFile;
|
|
|
- p.StartInfo.Arguments = $"65 {string.Join(" ", mainSatEph)} {string.Join(" ", adjaSatEph)} {string.Join(" ", recLonLat)} {string.Join(" ", refLonLat)} {tarFreqUpMHz} {refFreqUpMHz} {mainSatTransMHz} {adjaSatTransMHz} {dtousErr} {dfoHzErr} {satLocErr}";
|
|
|
- p.StartInfo.CreateNoWindow = true;
|
|
|
- p.StartInfo.RedirectStandardError = true;
|
|
|
- p.StartInfo.RedirectStandardOutput = true;
|
|
|
- p.StartInfo.UseShellExecute = false;
|
|
|
- StringBuilder sb = new StringBuilder();
|
|
|
- p.OutputDataReceived += (sender, e) => sb.Append(e.Data);
|
|
|
- p.Start();
|
|
|
- p.BeginOutputReadLine();
|
|
|
- p.WaitForExit();//WaitForExit加了超时时间的话进程退出后不能保证异步流已经读取完成,这是.NET框架的BUG
|
|
|
- return ParseResult(2, sb.ToString());
|
|
|
- }
|
|
|
+ [DllImport(GDOPDll, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ public static extern int GdopLeoTowSatDRef(string mainLines, string adajLines, Int64 captime, double[] refPos
|
|
|
+ , double fuHz1, double fuHz2, double dtousErr, double dfoHzErr, double ephLocErr, double ephVLocErr
|
|
|
+ , double[] level, int levlen, int[] resCount, out IntPtr res, double[] satllh);
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// 双星时频差GDOP误差分布无参
|
|
|
- /// </summary>
|
|
|
- /// <param name="tarFreqUpMHz">目标上行频点MHz</param>
|
|
|
- /// <param name="refFreqUpMHz">参考上行频点MHz</param>
|
|
|
- /// <param name="mainSatTransMHz">主星转发器本振MHz</param>
|
|
|
- /// <param name="adjaSatTransMHz">邻星转发器本振MHz</param>
|
|
|
- /// <param name="recLonLat">接收站经纬度,数组长度=2</param>
|
|
|
- /// <param name="refLonLat">参考站经纬度,数组长度=2</param>
|
|
|
- /// <param name="mainTle">主星双行根数</param>
|
|
|
- /// <param name="adjaTle">邻星双行根数</param>
|
|
|
- /// <param name="time">采集时刻</param>
|
|
|
- /// <param name="dtousErr">时差误差(单位us)</param>
|
|
|
- /// <param name="dfoHzErr">频差误差(单位Hz)</param>
|
|
|
- /// <param name="satLocErr">星历位置误差(单位米)</param>
|
|
|
- /// <returns></returns>
|
|
|
- public static (List<SatInfo>, List<ErrDistanceMapLines>) Gdop2SatDtoDfo(double tarFreqUpMHz, double mainSatTransMHz, double adjaSatTransMHz, double[] recLonLat, string mainTle, string adjaTle, DateTime time, double dtousErr = 1, double dfoHzErr = 1, double satLocErr = 10000)
|
|
|
- {
|
|
|
- if (string.IsNullOrWhiteSpace(exePath))
|
|
|
- throw new Exception($"请先调用SetExePath指定{exeName}进程所在路径,支持相对路径");
|
|
|
- if (!Directory.Exists(exePath))
|
|
|
- throw new Exception($"路径[{exePath}]不存在");
|
|
|
- var exeFile = Path.Combine(exePath, exeName);
|
|
|
- if (!File.Exists(exeFile))
|
|
|
- throw new Exception($"文件[{exeFile}]不存在");
|
|
|
- Process p = new Process();
|
|
|
- p.StartInfo.WorkingDirectory = exePath;
|
|
|
- p.StartInfo.FileName = exeFile;
|
|
|
- p.StartInfo.Arguments = $"66 \"{mainTle}\" \"{adjaTle}\" \"{time:yyyy-MM-dd HH:mm:ss.000000}\" {string.Join(" ", recLonLat)} {tarFreqUpMHz} {mainSatTransMHz} {adjaSatTransMHz} {dtousErr} {dfoHzErr} {satLocErr}";
|
|
|
- p.StartInfo.CreateNoWindow = true;
|
|
|
- p.StartInfo.RedirectStandardError = true;
|
|
|
- p.StartInfo.RedirectStandardOutput = true;
|
|
|
- p.StartInfo.UseShellExecute = false;
|
|
|
- StringBuilder sb = new StringBuilder();
|
|
|
- p.OutputDataReceived += (sender, e) => sb.Append(e.Data);
|
|
|
- p.Start();
|
|
|
- p.BeginOutputReadLine();
|
|
|
- p.WaitForExit();//WaitForExit加了超时时间的话进程退出后不能保证异步流已经读取完成,这是.NET框架的BUG
|
|
|
- return ParseResult(2, sb.ToString());
|
|
|
- }
|
|
|
+ [DllImport(GDOPDll, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ public static extern void FreeGDOPBuf(IntPtr val);
|
|
|
|
|
|
/// <summary>
|
|
|
- /// 双星时频差GDOP误差分布无参
|
|
|
+ /// 低轨双星GDOP
|
|
|
/// </summary>
|
|
|
- /// <param name="tarFreqUpMHz">目标上行频点MHz</param>
|
|
|
- /// <param name="refFreqUpMHz">参考上行频点MHz</param>
|
|
|
- /// <param name="mainSatTransMHz">主星转发器本振MHz</param>
|
|
|
- /// <param name="adjaSatTransMHz">邻星转发器本振MHz</param>
|
|
|
- /// <param name="recLonLat">接收站经纬度,数组长度=2</param>
|
|
|
- /// <param name="refLonLat">参考站经纬度,数组长度=2</param>
|
|
|
- /// <param name="mainSatEph">主星星历xyz vx vy vz,数组长度=6</param>
|
|
|
- /// <param name="adjaSatEph">邻星星历xyz vx vy vz,数组长度=6</param>
|
|
|
- /// <param name="dtousErr">时差误差(单位us)</param>
|
|
|
- /// <param name="dfoHzErr">频差误差(单位Hz)</param>
|
|
|
- /// <param name="satLocErr">星历位置误差(单位米)</param>
|
|
|
- /// <returns></returns>
|
|
|
- public static (List<SatInfo>, List<ErrDistanceMapLines>) Gdop2SatDtoDfo(double tarFreqUpMHz, double mainSatTransMHz, double adjaSatTransMHz, double[] recLonLat, double[] mainSatEph, double[] adjaSatEph, double dtousErr = 1, double dfoHzErr = 1, double satLocErr = 10000)
|
|
|
- {
|
|
|
- if (string.IsNullOrWhiteSpace(exePath))
|
|
|
- throw new Exception($"请先调用SetExePath指定{exeName}进程所在路径,支持相对路径");
|
|
|
- if (!Directory.Exists(exePath))
|
|
|
- throw new Exception($"路径[{exePath}]不存在");
|
|
|
- var exeFile = Path.Combine(exePath, exeName);
|
|
|
- if (!File.Exists(exeFile))
|
|
|
- throw new Exception($"文件[{exeFile}]不存在");
|
|
|
- Process p = new Process();
|
|
|
- p.StartInfo.WorkingDirectory = exePath;
|
|
|
- p.StartInfo.FileName = exeFile;
|
|
|
- p.StartInfo.Arguments = $"67 {string.Join(" ", mainSatEph)} {string.Join(" ", adjaSatEph)} {string.Join(" ", recLonLat)} {tarFreqUpMHz} {mainSatTransMHz} {adjaSatTransMHz} {dtousErr} {dfoHzErr} {satLocErr}";
|
|
|
- p.StartInfo.CreateNoWindow = true;
|
|
|
- p.StartInfo.RedirectStandardError = true;
|
|
|
- p.StartInfo.RedirectStandardOutput = true;
|
|
|
- p.StartInfo.UseShellExecute = false;
|
|
|
- StringBuilder sb = new StringBuilder();
|
|
|
- p.OutputDataReceived += (sender, e) => sb.Append(e.Data);
|
|
|
- p.Start();
|
|
|
- p.BeginOutputReadLine();
|
|
|
- p.WaitForExit();//WaitForExit加了超时时间的话进程退出后不能保证异步流已经读取完成,这是.NET框架的BUG
|
|
|
- return ParseResult(2, sb.ToString());
|
|
|
- }
|
|
|
+ /// <param name="mainLines">主星星历</param>
|
|
|
+ /// <param name="adajLines">邻星星历</param>
|
|
|
+ /// <param name="captime">采集时间</param>
|
|
|
+ /// <param name="refPos">参考站位置 长度3</param>
|
|
|
+ /// <param name="fuHz1">目标上行频点 Hz</param>
|
|
|
+ /// <param name="fuHz2">参考上行频点 Hz</param>
|
|
|
+ /// <param name="dtousErr">时差误差</param>
|
|
|
+ /// <param name="dfoHzErr">频差误差</param>
|
|
|
+ /// <param name="ephLocErr">星历位置误差</param>
|
|
|
+ /// <param name="ephVLocErr">星历速度误差</param>
|
|
|
+ /// <param name="level"></param>
|
|
|
+ /// <param name="satllh"></param>
|
|
|
+ /// <param name="points"></param>
|
|
|
+ public static (List<SatInfo>, List<ErrDistanceMapPoints>) GdopLeoTowSatDRef(string mainLines, string adajLines, DateTime captime, double[] refPos
|
|
|
+ , double fuHz1, double fuHz2, double dtousErr, double dfoHzErr, double ephLocErr, double ephVLocErr)
|
|
|
+ {
|
|
|
+ int satCount = 2;
|
|
|
+ //该值和points 一一对应
|
|
|
+ double[] level = GdopParam.误差配置.小误差距离m;
|
|
|
+ double[] satllh = new double[satCount*3];
|
|
|
+ var timeSpan = (long)(captime - dtZero).TotalSeconds;
|
|
|
+ IntPtr res = IntPtr.Zero;
|
|
|
+ int[] resCount = new int[level.Length];
|
|
|
+ GdopLeoTowSatDRef(mainLines, adajLines, timeSpan, refPos
|
|
|
+ , fuHz1, fuHz2, dtousErr, dfoHzErr, ephLocErr, ephVLocErr, level, level.Length, resCount, out res, satllh);
|
|
|
+
|
|
|
+ IntPtr tmp = res;
|
|
|
+
|
|
|
+ //用于绘制的数据
|
|
|
+ List<double[]> points = new List<double[]>();
|
|
|
+ for (int idx = 0; idx < level.Length; ++idx)
|
|
|
+ {
|
|
|
+ double[] levelval = new double[resCount[idx]];
|
|
|
+ Marshal.Copy(tmp, levelval, 0, resCount[idx]);
|
|
|
+ tmp += (resCount[idx] * sizeof(double));
|
|
|
+ points.Add(levelval);
|
|
|
+ }
|
|
|
+ FreeGDOPBuf(res);
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// 两星一地GDOP带参
|
|
|
- /// </summary>
|
|
|
- /// <param name="cdbLonLat">超短波天线经纬度,数组长度=2</param>
|
|
|
- /// <param name="refLonLat">参考站经纬度,数组长度=2</param>
|
|
|
- /// <param name="mainTle">主星双行根数</param>
|
|
|
- /// <param name="adjaTle">邻星双行根数</param>
|
|
|
- /// <param name="time">采集时刻</param>
|
|
|
- /// <param name="dtousErr">时差误差(单位us)</param>
|
|
|
- /// <param name="satLocErr">星历位置误差(单位米)</param>
|
|
|
- /// <returns></returns>
|
|
|
- public static (List<SatInfo>, List<ErrDistanceMapLines>) Gdop2Sat1DRef(double[] cdbLonLat, double[] refLonLat, string mainTle, string adjaTle, DateTime time, double dtousErr = 1, double satLocErr = 10000)
|
|
|
- {
|
|
|
- if (string.IsNullOrWhiteSpace(exePath))
|
|
|
- throw new Exception($"请先调用SetExePath指定{exeName}进程所在路径,支持相对路径");
|
|
|
- if (!Directory.Exists(exePath))
|
|
|
- throw new Exception($"路径[{exePath}]不存在");
|
|
|
- var exeFile = Path.Combine(exePath, exeName);
|
|
|
- if (!File.Exists(exeFile))
|
|
|
- throw new Exception($"文件[{exeFile}]不存在");
|
|
|
- Process p = new Process();
|
|
|
- p.StartInfo.WorkingDirectory = exePath;
|
|
|
- p.StartInfo.FileName = exeFile;
|
|
|
- p.StartInfo.Arguments = $"68 \"{mainTle}\" \"{adjaTle}\" \"{time:yyyy-MM-dd HH:mm:ss.000000}\" {string.Join(" ", cdbLonLat)} {string.Join(" ", refLonLat)} {dtousErr} {satLocErr}";
|
|
|
- p.StartInfo.CreateNoWindow = true;
|
|
|
- p.StartInfo.RedirectStandardError = true;
|
|
|
- p.StartInfo.RedirectStandardOutput = true;
|
|
|
- p.StartInfo.UseShellExecute = false;
|
|
|
- StringBuilder sb = new StringBuilder();
|
|
|
- p.OutputDataReceived += (sender, e) => sb.Append(e.Data);
|
|
|
- p.Start();
|
|
|
- p.BeginOutputReadLine();
|
|
|
- p.WaitForExit();//WaitForExit加了超时时间的话进程退出后不能保证异步流已经读取完成,这是.NET框架的BUG
|
|
|
- return ParseResult(2, sb.ToString());
|
|
|
+ List<SatInfo> satInfos = ParseResult(satCount, satllh, mainLines, adajLines);
|
|
|
+ List<ErrDistanceMapPoints> errs = new List<ErrDistanceMapPoints>();
|
|
|
+ for (int i = 0; i < points.Count; i++)
|
|
|
+ {
|
|
|
+ ErrDistanceMapPoints errDistanceMap = new ErrDistanceMapPoints();
|
|
|
+ errDistanceMap.ErrDistance = level[i];
|
|
|
+ errDistanceMap.MapDots.AddRange(ParseResult(points[i]));
|
|
|
+ errs.Add(errDistanceMap);
|
|
|
+ }
|
|
|
+ return (satInfos, errs);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/// <summary>
|
|
|
/// 低轨两星GDOP
|
|
|
/// </summary>
|
|
@@ -383,7 +107,7 @@ namespace XzXdDw.App.Api.星地GDOP误差椭圆
|
|
|
/// <param name="fu2">邻星上行频点</param>
|
|
|
/// <returns></returns>
|
|
|
/// <exception cref="Exception"></exception>
|
|
|
- public static (List<SatInfo>, List<ErrDistanceMapLines>) GdopLeoTowSatDRef( double[] refLonLat, string mainTle, string adjaTle, DateTime time, double dtousErr,double dfoHzErr, double ephLocErr,double ephVLocErr,double fuHz1,double fuHz2)
|
|
|
+ public static (List<SatInfo>, List<ErrDistanceMapLines>) GdopLeoTowSatDRef(double[] refLonLat, string mainTle, string adjaTle, DateTime time, double dtousErr, double dfoHzErr, double ephLocErr, double ephVLocErr, double fuHz1, double fuHz2)
|
|
|
{
|
|
|
if (string.IsNullOrWhiteSpace(exePath))
|
|
|
throw new Exception($"请先调用SetExePath指定{exeName}进程所在路径,支持相对路径");
|
|
@@ -446,147 +170,44 @@ namespace XzXdDw.App.Api.星地GDOP误差椭圆
|
|
|
return ParseResult(1, sb.ToString());
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- /// 两星一地GDOP带参
|
|
|
- /// </summary>
|
|
|
- /// <param name="cdbLonLat">超短波天线经纬度,数组长度=2</param>
|
|
|
- /// <param name="refLonLat">参考站经纬度,数组长度=2</param>
|
|
|
- /// <param name="mainSatEph">主星星历xyz,数组长度=3</param>
|
|
|
- /// <param name="adjaSatEph">邻星星历xyz,数组长度=3</param>
|
|
|
- /// <param name="dtousErr">时差误差(单位us)</param>
|
|
|
- /// <param name="satLocErr">星历位置误差(单位米)</param>
|
|
|
- /// <returns></returns>
|
|
|
- public static (List<SatInfo>, List<ErrDistanceMapLines>) Gdop2Sat1DRef(double[] cdbLonLat, double[] refLonLat, double[] mainSatEph, double[] adjaSatEph, double dtousErr = 1, double satLocErr = 10000)
|
|
|
+ private static List<MapDot> ParseResult(double[] ponits)
|
|
|
{
|
|
|
- if (string.IsNullOrWhiteSpace(exePath))
|
|
|
- throw new Exception($"请先调用SetExePath指定{exeName}进程所在路径,支持相对路径");
|
|
|
- if (!Directory.Exists(exePath))
|
|
|
- throw new Exception($"路径[{exePath}]不存在");
|
|
|
- var exeFile = Path.Combine(exePath, exeName);
|
|
|
- if (!File.Exists(exeFile))
|
|
|
- throw new Exception($"文件[{exeFile}]不存在");
|
|
|
- Process p = new Process();
|
|
|
- p.StartInfo.WorkingDirectory = exePath;
|
|
|
- p.StartInfo.FileName = exeFile;
|
|
|
- p.StartInfo.Arguments = $"69 {string.Join(" ", mainSatEph)} {string.Join(" ", adjaSatEph)} {string.Join(" ", cdbLonLat)} {string.Join(" ", refLonLat)} {dtousErr} {satLocErr}";
|
|
|
- p.StartInfo.CreateNoWindow = true;
|
|
|
- p.StartInfo.RedirectStandardError = true;
|
|
|
- p.StartInfo.RedirectStandardOutput = true;
|
|
|
- p.StartInfo.UseShellExecute = false;
|
|
|
- StringBuilder sb = new StringBuilder();
|
|
|
- p.OutputDataReceived += (sender, e) => sb.Append(e.Data);
|
|
|
- p.Start();
|
|
|
- p.BeginOutputReadLine();
|
|
|
- p.WaitForExit();//WaitForExit加了超时时间的话进程退出后不能保证异步流已经读取完成,这是.NET框架的BUG
|
|
|
- return ParseResult(2, sb.ToString());
|
|
|
- }
|
|
|
+ List<MapDot> mapDots = new List<MapDot>();
|
|
|
+ int count = 2;
|
|
|
+ for (int i = 0; i < ponits.Length / count; i++)
|
|
|
+ {
|
|
|
+ MapDot mapDot = new MapDot();
|
|
|
+ mapDot.Lat = ponits[count * i + 1];
|
|
|
+ mapDot.Lon = ponits[count * i];
|
|
|
+ mapDots.Add(mapDot);
|
|
|
+
|
|
|
+ }
|
|
|
+ return mapDots;
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// 一星两地GDOP带参
|
|
|
- /// </summary>
|
|
|
- /// <param name="cdb1LonLat">超短波阵地1天线经纬度,数组长度=2</param>
|
|
|
- /// <param name="cdb2LonLat">超短波阵地2天线经纬度,数组长度=2</param>
|
|
|
- /// <param name="refLonLat">参考站经纬度,数组长度=2</param>
|
|
|
- /// <param name="mainTle">主星双行根数</param>
|
|
|
- /// <param name="time">采集时刻</param>
|
|
|
- /// <param name="dtousErr">时差误差(单位us)</param>
|
|
|
- /// <param name="satLocErr">星历位置误差(单位米)</param>
|
|
|
- /// <returns></returns>
|
|
|
- public static (List<SatInfo>, List<ErrDistanceMapLines>) Gdop1Sat2DRef(double[] cdb1LonLat, double[] cdb2LonLat, double[] refLonLat, string mainTle, DateTime time, double dtousErr = 1, double satLocErr = 10000)
|
|
|
- {
|
|
|
- if (string.IsNullOrWhiteSpace(exePath))
|
|
|
- throw new Exception($"请先调用SetExePath指定{exeName}进程所在路径,支持相对路径");
|
|
|
- if (!Directory.Exists(exePath))
|
|
|
- throw new Exception($"路径[{exePath}]不存在");
|
|
|
- var exeFile = Path.Combine(exePath, exeName);
|
|
|
- if (!File.Exists(exeFile))
|
|
|
- throw new Exception($"文件[{exeFile}]不存在");
|
|
|
- Process p = new Process();
|
|
|
- p.StartInfo.WorkingDirectory = exePath;
|
|
|
- p.StartInfo.FileName = exeFile;
|
|
|
- p.StartInfo.Arguments = $"70 \"{mainTle}\" \"{time:yyyy-MM-dd HH:mm:ss.000000}\" {string.Join(" ", cdb1LonLat)} {string.Join(" ", cdb2LonLat)} {string.Join(" ", refLonLat)} {dtousErr} {satLocErr}";
|
|
|
- p.StartInfo.CreateNoWindow = true;
|
|
|
- p.StartInfo.RedirectStandardError = true;
|
|
|
- p.StartInfo.RedirectStandardOutput = true;
|
|
|
- p.StartInfo.UseShellExecute = false;
|
|
|
- StringBuilder sb = new StringBuilder();
|
|
|
- p.OutputDataReceived += (sender, e) => sb.Append(e.Data);
|
|
|
- p.Start();
|
|
|
- p.BeginOutputReadLine();
|
|
|
- p.WaitForExit();//WaitForExit加了超时时间的话进程退出后不能保证异步流已经读取完成,这是.NET框架的BUG
|
|
|
- return ParseResult(1, sb.ToString());
|
|
|
- }
|
|
|
- /// <summary>
|
|
|
- /// 一星两地GDOP带参
|
|
|
- /// </summary>
|
|
|
- /// <param name="cdb1LonLat">超短波阵地1天线经纬度,数组长度=2</param>
|
|
|
- /// <param name="cdb2LonLat">超短波阵地2天线经纬度,数组长度=2</param>
|
|
|
- /// <param name="refLonLat">参考站经纬度,数组长度=2</param>
|
|
|
- /// <param name="mainSatEph">主星星历xyz,数组长度=3</param>
|
|
|
- /// <param name="dtousErr">时差误差(单位us)</param>
|
|
|
- /// <param name="satLocErr">星历位置误差(单位米)</param>
|
|
|
- /// <returns></returns>
|
|
|
- public static (List<SatInfo>, List<ErrDistanceMapLines>) Gdop1Sat2DRef(double[] cdb1LonLat, double[] cdb2LonLat, double[] refLonLat, double[] mainSatEph, double dtousErr = 1, double satLocErr = 10000)
|
|
|
- {
|
|
|
- if (string.IsNullOrWhiteSpace(exePath))
|
|
|
- throw new Exception($"请先调用SetExePath指定{exeName}进程所在路径,支持相对路径");
|
|
|
- if (!Directory.Exists(exePath))
|
|
|
- throw new Exception($"路径[{exePath}]不存在");
|
|
|
- var exeFile = Path.Combine(exePath, exeName);
|
|
|
- if (!File.Exists(exeFile))
|
|
|
- throw new Exception($"文件[{exeFile}]不存在");
|
|
|
- Process p = new Process();
|
|
|
- p.StartInfo.WorkingDirectory = exePath;
|
|
|
- p.StartInfo.FileName = exeFile;
|
|
|
- p.StartInfo.Arguments = $"71 {string.Join(" ", mainSatEph)} {string.Join(" ", cdb1LonLat)} {string.Join(" ", cdb2LonLat)} {string.Join(" ", refLonLat)} {dtousErr} {satLocErr}";
|
|
|
- p.StartInfo.CreateNoWindow = true;
|
|
|
- p.StartInfo.RedirectStandardError = true;
|
|
|
- p.StartInfo.RedirectStandardOutput = true;
|
|
|
- p.StartInfo.UseShellExecute = false;
|
|
|
- StringBuilder sb = new StringBuilder();
|
|
|
- p.OutputDataReceived += (sender, e) => sb.Append(e.Data);
|
|
|
- p.Start();
|
|
|
- p.BeginOutputReadLine();
|
|
|
- p.WaitForExit();//WaitForExit加了超时时间的话进程退出后不能保证异步流已经读取完成,这是.NET框架的BUG
|
|
|
- return ParseResult(1, sb.ToString());
|
|
|
}
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// 高低轨两高一低GDOP带参
|
|
|
- /// </summary>
|
|
|
- /// <param name="refLonLat">参考站经纬度,数组长度=2</param>
|
|
|
- /// <param name="mainSatEph">主星星历xyz,数组长度=3</param>
|
|
|
- /// <param name="adjaSatEph">邻星星历xyz,数组长度=3</param>
|
|
|
- /// <param name="lowSatEph">低轨卫星星历xyz,数组长度=3</param>
|
|
|
- /// <param name="time">采集时刻</param>
|
|
|
- /// <param name="dtousErr">时差误差(单位us)</param>
|
|
|
- /// <param name="satLocErr">星历位置误差(单位米)</param>
|
|
|
- /// <returns></returns>
|
|
|
- public static (List<SatInfo>, List<ErrDistanceMapLines>) Gdop3Sat2High1LowRef(double[] refLonLat, double[] mainSatEph, double[] adjaSatEph, double[] lowSatEph, double dtousErr = 1, double satLocErr = 10000)
|
|
|
+
|
|
|
+ private static List<SatInfo> ParseResult(int satCount, double[] satllh, params string[] ephLine)
|
|
|
{
|
|
|
- if (string.IsNullOrWhiteSpace(exePath))
|
|
|
- throw new Exception($"请先调用SetExePath指定{exeName}进程所在路径,支持相对路径");
|
|
|
- if (!Directory.Exists(exePath))
|
|
|
- throw new Exception($"路径[{exePath}]不存在");
|
|
|
- var exeFile = Path.Combine(exePath, exeName);
|
|
|
- if (!File.Exists(exeFile))
|
|
|
- throw new Exception($"文件[{exeFile}]不存在");
|
|
|
- Process p = new Process();
|
|
|
- p.StartInfo.WorkingDirectory = exePath;
|
|
|
- p.StartInfo.FileName = exeFile;
|
|
|
- p.StartInfo.Arguments = $"72 {string.Join(" ", mainSatEph)} {string.Join(" ", adjaSatEph)} {string.Join(" ", lowSatEph)} {string.Join(" ", refLonLat)} {dtousErr} {satLocErr}";
|
|
|
- p.StartInfo.CreateNoWindow = true;
|
|
|
- p.StartInfo.RedirectStandardError = true;
|
|
|
- p.StartInfo.RedirectStandardOutput = true;
|
|
|
- p.StartInfo.UseShellExecute = false;
|
|
|
- StringBuilder sb = new StringBuilder();
|
|
|
- p.OutputDataReceived += (sender, e) => sb.Append(e.Data);
|
|
|
- p.Start();
|
|
|
- p.BeginOutputReadLine();
|
|
|
- p.WaitForExit();//WaitForExit加了超时时间的话进程退出后不能保证异步流已经读取完成,这是.NET框架的BUG
|
|
|
- return ParseResult(3, sb.ToString());
|
|
|
+
|
|
|
+ List<SatInfo> list = new List<SatInfo>();
|
|
|
+ int len = 3;
|
|
|
+ for (int i = 0; i < satCount; i++)
|
|
|
+ {
|
|
|
+ SatInfo satInfo = new SatInfo();
|
|
|
+ var ephstrs = ephLine[i].Split(new string[] { " ", "U" }, StringSplitOptions.RemoveEmptyEntries);
|
|
|
+ if (ephstrs.Length == 16)
|
|
|
+ {
|
|
|
+ satInfo.SatCode = Convert.ToInt32(ephstrs[1]);
|
|
|
+ }
|
|
|
+ satInfo.SatLon = Convert.ToDouble(satllh[len * i]);
|
|
|
+ satInfo.SatLat = Convert.ToDouble(satllh[len * i + 1]);
|
|
|
+ list.Add(satInfo);
|
|
|
+ }
|
|
|
+
|
|
|
+ return list;
|
|
|
}
|
|
|
+
|
|
|
private static (List<SatInfo>, List<ErrDistanceMapLines>) ParseResult(int satCount, string txt)
|
|
|
{
|
|
|
if (string.IsNullOrWhiteSpace(txt))
|