123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618 |
- 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误差椭圆
- {
- /// <summary>
- /// Gdop误差分布计算帮助类.该类调用了GdopCore.exe进程
- /// 每种GDOP算法提供了两个接口,这两种接口是完全等价的,一种传入双行根,一种直接传入卫星状态x、y、z等
- /// </summary>
- public static class GdopHelper
- {
- 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());
- }
- /// <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>
- /// <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());
- }
- /// <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());
- }
- /// <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>
- /// <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());
- }
- /// <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());
- }
- /// <summary>
- /// 低轨两星GDOP
- /// </summary>
- /// <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="ephLocErr">星历位置误差(m)</param>
- /// <param name="ephVLocErr">星历速度误差(m/s)</param>
- /// <param name="fu1">主星上行频点</param>
- /// <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)
- {
- 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());
- }
- /// <summary>
- /// 单星GDOP
- /// </summary>
- /// <param name="mainTle">第一刻时刻星历双行根</param>
- /// <param name="adjaTle1">第二刻时刻星历双行根</param>
- /// <param name="adjaTle2">第三刻时刻星历双行根></param>
- /// <param name="time">采集时刻</param>
- /// <param name="dfoHzErr">频差误差(Hz)</param>
- /// <param name="ephLocErr">星历位置误差(m</param>
- /// <param name="ephVLocErr">星历速度误差(m/s)</param>
- /// <param name="fuHz">卫星上行频点(Hz)</param>
- /// <returns></returns>
- /// <exception cref="Exception"></exception>
- public static (List<SatInfo>, List<ErrDistanceMapLines>) 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());
- }
- /// <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)
- {
- 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());
- }
- /// <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)
- {
- 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<SatInfo>, List<ErrDistanceMapLines>) 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<SatInfo> list = new List<SatInfo>();
- 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<List<ErrDistanceMapLines>>(jsonStr);
- return (list, res);
- }
- }
- }
|