using DevExpress.Charts.Native; using DevExpress.Internal.WinApi.Windows.UI.Notifications; using DevExpress.XtraPrinting; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using XdCxRhDW.App.DTO; using static DevExpress.XtraCharts.GLGraphics.Platform.EGL; using static System.Windows.Forms.VisualStyles.VisualStyleElement.TaskbarClock; namespace XzXdDw.App.Api.星地GDOP误差椭圆 { /// /// Gdop误差分布计算帮助类.该类调用了GdopCore.exe进程 /// 每种GDOP算法提供了两个接口,这两种接口是完全等价的,一种传入双行根,一种直接传入卫星状态x、y、z等 /// public static class GdopHelper { private static string exePath = "Api\\星地GDOP误差椭圆\\GDOP"; private const string exeName = "GdopCore.exe"; /// /// 三星双时差GDOP误差分布带参 /// /// 参考站经纬度,数组长度=2 /// 主星双行根数 /// 邻1星双行根数 /// 邻2星双行根数 /// 采集时刻 /// 时差误差(单位us) /// 星历位置误差(单位米) /// public static (List, List) 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()); } /// /// 三星双时差GDOP误差分布带参 /// /// 参考站经纬度,数组长度=2 /// 主星xyz星历,数组长度=3 /// 邻1星xyz星历,数组长度=3 /// 邻2星xyz星历,数组长度=3 /// 时差误差(单位us) /// 星历位置误差(单位米) /// /// public static (List, List) 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()); } /// /// 三星双时差GDOP误差分布无参 /// /// 接收站经纬度,数组长度=2 /// 主星双行根数 /// 邻1星双行根数 /// 邻2星双行根数 /// 采集时刻 /// 时差误差(单位us) /// 星历位置误差(单位米) /// public static (List, List) 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()); } /// /// 三星双时差GDOP误差分布无参 /// /// 接收站经纬度,数组长度=2 /// 主星xyz星历,数组长度=3 /// 邻1星xyz星历,数组长度=3 /// 邻2星xyz星历,数组长度=3 /// 时差误差(单位us) /// 星历位置误差(单位米) /// /// public static (List, List) 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()); } /// /// 双星时频差GDOP误差分布带参 /// /// 目标上行频点MHz /// 参考上行频点MHz /// 主星转发器本振MHz /// 邻星转发器本振MHz /// 接收站经纬度,数组长度=2 /// 参考站经纬度,数组长度=2 /// 主星双行根数 /// 邻星双行根数 /// 采集时刻 /// 时差误差(单位us) /// 频差误差(单位Hz) /// 星历位置误差(单位米) /// public static (List, List) 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()); } /// /// 双星时频差GDOP误差分布带参 /// /// 目标上行频点MHz /// 参考上行频点MHz /// 主星转发器本振MHz /// 邻星转发器本振MHz /// 接收站经纬度,数组长度=2 /// 参考站经纬度,数组长度=2 /// 主星星历xyz vx vy vz,数组长度=6 /// 邻星星历xyz vx vy vz,数组长度=6 /// 时差误差(单位us) /// 频差误差(单位Hz) /// 星历位置误差(单位米) /// public static (List, List) 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()); } /// /// 双星时频差GDOP误差分布无参 /// /// 目标上行频点MHz /// 参考上行频点MHz /// 主星转发器本振MHz /// 邻星转发器本振MHz /// 接收站经纬度,数组长度=2 /// 参考站经纬度,数组长度=2 /// 主星双行根数 /// 邻星双行根数 /// 采集时刻 /// 时差误差(单位us) /// 频差误差(单位Hz) /// 星历位置误差(单位米) /// public static (List, List) 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()); } /// /// 双星时频差GDOP误差分布无参 /// /// 目标上行频点MHz /// 参考上行频点MHz /// 主星转发器本振MHz /// 邻星转发器本振MHz /// 接收站经纬度,数组长度=2 /// 参考站经纬度,数组长度=2 /// 主星星历xyz vx vy vz,数组长度=6 /// 邻星星历xyz vx vy vz,数组长度=6 /// 时差误差(单位us) /// 频差误差(单位Hz) /// 星历位置误差(单位米) /// public static (List, List) 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()); } /// /// 两星一地GDOP带参 /// /// 超短波天线经纬度,数组长度=2 /// 参考站经纬度,数组长度=2 /// 主星双行根数 /// 邻星双行根数 /// 采集时刻 /// 时差误差(单位us) /// 星历位置误差(单位米) /// public static (List, List) 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()); } /// /// 低轨两星GDOP /// /// 参考站位置 长度2 /// 主星星历双行根 /// 邻星星历双行根 /// 采集时刻 /// 时差误差(us) /// 频差误差(Hz) /// 星历位置误差(m) /// 星历速度误差(m/s) /// 主星上行频点 /// 邻星上行频点 /// /// public static (List, List) 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}进程所在路径,支持相对路径"); 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 = $"73 \"{mainTle}\" \"{adjaTle}\" \"{time:yyyy-MM-dd HH:mm:ss.000000}\" {string.Join(" ", refLonLat)} {dtousErr} {dfoHzErr} {ephLocErr} {ephVLocErr} {fuHz1} {fuHz2}"; 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()); } /// /// 单星GDOP /// /// 第一刻时刻星历双行根 /// 第二刻时刻星历双行根 /// 第三刻时刻星历双行根> /// 采集时刻 /// 频差误差(Hz) /// 星历位置误差(m /// 星历速度误差(m/s) /// 卫星上行频点(Hz) /// /// public static (List, List) GdopSingleSatDRef(string mainTle, DateTime time1, DateTime time2, DateTime time3, double dfoHzErr, double ephLocErr, double ephVLocErr, double fuHz) { 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 = $"74 \"{mainTle}\" \"{time1:yyyy-MM-dd HH:mm:ss.000000}\" \"{time2:yyyy-MM-dd HH:mm:ss.000000}\" \"{time3:yyyy-MM-dd HH:mm:ss.000000}\" {dfoHzErr} {ephLocErr} {ephVLocErr} {fuHz}"; 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()); } /// /// 两星一地GDOP带参 /// /// 超短波天线经纬度,数组长度=2 /// 参考站经纬度,数组长度=2 /// 主星星历xyz,数组长度=3 /// 邻星星历xyz,数组长度=3 /// 时差误差(单位us) /// 星历位置误差(单位米) /// public static (List, List) Gdop2Sat1DRef(double[] cdbLonLat, double[] refLonLat, double[] mainSatEph, double[] adjaSatEph, 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 = $"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()); } /// /// 一星两地GDOP带参 /// /// 超短波阵地1天线经纬度,数组长度=2 /// 超短波阵地2天线经纬度,数组长度=2 /// 参考站经纬度,数组长度=2 /// 主星双行根数 /// 采集时刻 /// 时差误差(单位us) /// 星历位置误差(单位米) /// public static (List, List) 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()); } /// /// 一星两地GDOP带参 /// /// 超短波阵地1天线经纬度,数组长度=2 /// 超短波阵地2天线经纬度,数组长度=2 /// 参考站经纬度,数组长度=2 /// 主星星历xyz,数组长度=3 /// 时差误差(单位us) /// 星历位置误差(单位米) /// public static (List, List) 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()); } /// /// 高低轨两高一低GDOP带参 /// /// 参考站经纬度,数组长度=2 /// 主星星历xyz,数组长度=3 /// 邻星星历xyz,数组长度=3 /// 低轨卫星星历xyz,数组长度=3 /// 采集时刻 /// 时差误差(单位us) /// 星历位置误差(单位米) /// public static (List, List) Gdop3Sat2High1LowRef(double[] refLonLat, double[] mainSatEph, double[] adjaSatEph, double[] lowSatEph, 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 = $"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()); } private static (List, List) ParseResult(int satCount, string txt) { if (string.IsNullOrWhiteSpace(txt)) { throw new Exception("GDOP计算出现未知错误!"); } if (txt.StartsWith("1 ")) { throw new Exception(txt.Remove(0, 2)); } var arr = txt.Split(' '); List list = new List(); for (int i = 0; i < satCount; i++) { SatInfo satInfo = new SatInfo(); var satCode = Convert.ToInt32(arr[3 * i + 1]); if (satCode > 0) satInfo.SatCode = satCode; satInfo.SatLon = Convert.ToDouble(arr[3 * i + 2]); satInfo.SatLat = Convert.ToDouble(arr[3 * i + 3]); list.Add(satInfo); } var jsonStr = arr[1 + satCount * 3]; var res = JsonConvert.DeserializeObject>(jsonStr); return (list, res); } } }