using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
namespace XdCxRhDW.Core.Api
{
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++)
{
MapSatInfo satInfo = new MapSatInfo();
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;
}
}
}