using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; namespace XdCxRhDW.App.Api.GDOP误差椭圆 { public static class GdopHelper { static readonly DateTime dtZero = new DateTime(1970, 1, 1, 8, 0, 0, 0); /// /// 两星一地GDOP 无参时参考位置不赋值 /// /// 主星星历 /// 邻星星历 /// 信号时间 /// 超短波位置 3 /// 参考站位置 3 /// 时差误差 /// 星历误差 /// public static (List, List) Gdop2Sat1D(string mainLines, string adajLines, DateTime captime, double[] cdbPos, double dtousErr, double ephLocErr, double[] refPos = null) { 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]; if (refPos == null || refPos.Length == 0) { GDOPApi.Gdop2Sat1DNoRef(mainLines, adajLines, timeSpan, cdbPos, dtousErr, ephLocErr, level, level.Length, resCount, out res, satllh); } else { GDOPApi.Gdop2Sat1DRef(mainLines, adajLines, timeSpan, cdbPos, refPos, dtousErr, ephLocErr, level, level.Length, resCount, out res, satllh); } IntPtr tmp = res; //用于绘制的数据 List points = new List(); 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); } GDOPApi.FreeGDOPBuf(res); List satInfos = ParseResult(satCount, satllh, mainLines, adajLines); List errs = new List(); for (int i = 0; i < points.Count; i++) { if (!points[i].Any()) continue; ErrDistanceMapPoints errDistanceMap = new ErrDistanceMapPoints(); errDistanceMap.ErrDistance = level[i]; errDistanceMap.MapDots.AddRange(ParseResult(points[i])); errs.Add(errDistanceMap); } return (satInfos, errs); } /// /// 一星一地GDOP /// /// 主星星历 /// 信号时间 /// 超短波位置 3 /// 测向站位置 3 /// 时差误差 /// 测向误差 /// 星历误差 /// 参考站位置 3 /// public static (List, List) Gdop1Sat1D(string mainLines, DateTime captime, double[] cdbPos, double[] cxPos, double dtousErr, double doaErr, double ephLocErr, double[] refPos = null) { int satCount = 1; //该值和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]; if (refPos == null || refPos.Length == 0) { GDOPApi.GdopXDCXNoRef(mainLines, timeSpan, cdbPos, cxPos, dtousErr, doaErr, ephLocErr, level, level.Length, resCount, out res, satllh); } else { GDOPApi.GdopXDCXRef(mainLines, timeSpan, cdbPos, cxPos, refPos, dtousErr, doaErr, ephLocErr, level, level.Length, resCount, out res, satllh); } IntPtr tmp = res; //用于绘制的数据 List points = new List(); 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); } GDOPApi.FreeGDOPBuf(res); List satInfos = ParseResult(satCount, satllh, mainLines); List errs = new List(); for (int i = 0; i < points.Count; i++) { if (!points[i].Any()) continue; ErrDistanceMapPoints errDistanceMap = new ErrDistanceMapPoints(); errDistanceMap.ErrDistance = level[i]; errDistanceMap.MapDots.AddRange(ParseResult(points[i])); errs.Add(errDistanceMap); } return (satInfos, errs); } public static (List, List) Gdop3Sat(string mainLines, string adajLines, string adajLines2, DateTime captime, double dtousErr, double ephLocErr, double[] refPos = null) { int satCount = 3; //该值和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]; if (refPos == null || refPos.Length == 0) { GDOPApi.Gdop3SatNoRef(mainLines, adajLines, adajLines2, timeSpan, dtousErr, ephLocErr, level, level.Length, resCount, out res, satllh); } else { GDOPApi.Gdop3SatRef(mainLines, adajLines, adajLines2, timeSpan, refPos, dtousErr, ephLocErr, level, level.Length, resCount, out res, satllh); } IntPtr tmp = res; //用于绘制的数据 List points = new List(); 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); } GDOPApi.FreeGDOPBuf(res); List satInfos = ParseResult(satCount, satllh, mainLines, adajLines, adajLines2); List errs = new List(); for (int i = 0; i < points.Count; i++) { if (!points[i].Any()) continue; ErrDistanceMapPoints errDistanceMap = new ErrDistanceMapPoints(); errDistanceMap.ErrDistance = level[i]; errDistanceMap.MapDots.AddRange(ParseResult(points[i])); errs.Add(errDistanceMap); } return (satInfos, errs); } public static (List, List) Gdop3SatDF(string mainLines, string adajLines, string adajLines2, DateTime captime, double fuHz1, double fuHz2, double dfoErr, double ephLocErr, double ephVErr, double[] refPos) { int satCount = 3; //该值和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]; GDOPApi.Gdop3SatDF(mainLines, adajLines, adajLines2, timeSpan, refPos,fuHz1,fuHz2,dfoErr, ephLocErr,ephVErr, level, level.Length, resCount, out res, satllh); IntPtr tmp = res; //用于绘制的数据 List points = new List(); 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); } GDOPApi.FreeGDOPBuf(res); List satInfos = ParseResult(satCount, satllh, mainLines, adajLines, adajLines2); List errs = new List(); for (int i = 0; i < points.Count; i++) { if (!points[i].Any()) continue; ErrDistanceMapPoints errDistanceMap = new ErrDistanceMapPoints(); errDistanceMap.ErrDistance = level[i]; errDistanceMap.MapDots.AddRange(ParseResult(points[i])); errs.Add(errDistanceMap); } return (satInfos, errs); } public static (List, List) Gdop2SatDRef(string mainLines, string adajLines, DateTime captime, double fuHz1, double fuHz2, double dtousErr, double dfoErr, double ephLocErr, double ephVErr, double[] refPos) { 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]; GDOPApi.Gdop2SatDRef(mainLines, adajLines, timeSpan, refPos, fuHz1, fuHz2, dtousErr, dfoErr, ephLocErr, ephVErr, level, level.Length, resCount, out res, satllh); IntPtr tmp = res; //用于绘制的数据 List points = new List(); 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); } GDOPApi.FreeGDOPBuf(res); List satInfos = ParseResult(satCount, satllh, mainLines, adajLines); List errs = new List(); for (int i = 0; i < points.Count; i++) { if (!points[i].Any()) continue; ErrDistanceMapPoints errDistanceMap = new ErrDistanceMapPoints(); errDistanceMap.ErrDistance = level[i]; errDistanceMap.MapDots.AddRange(ParseResult(points[i])); errs.Add(errDistanceMap); } return (satInfos, errs); } private static List ParseResult(double[] ponits) { List mapDots = new List(); 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; } private static List ParseResult(int satCount, double[] satllh, params string[] ephLine) { List list = new List(); 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; } } }