using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Emit;
using System.Runtime.InteropServices;
namespace XdCxRhDW.Api
{
public static class GdopHelper
{
static readonly DateTime dtZero = new DateTime(1970, 1, 1, 8, 0, 0, 0);
///
/// 两星一地GDOP 无参时参考位置不赋值
///
/// 主星星历 x y z vx vy vz
/// 邻星星历x y z vx vy vz
/// 超短波位置 3
/// 参考站位置 3
/// 时差误差
/// 星历误差
///
///
public static List Gdop2Sat1DByXyz(double[] mainEph, double[] adajEph, double[] cdbPos, double dtousErr, double ephLocErr, double[] refPos = null)
{
int satCount = 2;
//该值和points 一一对应
double[] level = GdopParam.误差配置.误差距离m;
double[] satllh = new double[satCount * 3];
IntPtr res = IntPtr.Zero;
int[] resCount = new int[level.Length];
if (refPos == null || refPos.Length == 0)
{
GDOPApi.Gdop2Sat1DNoRefByXyz(mainEph, adajEph, cdbPos, dtousErr, ephLocErr, level, level.Length, resCount, out res, satllh);
}
else
{
GDOPApi.Gdop2Sat1DRefByXyz(mainEph, adajEph, 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 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 errs;
}
///
/// 两星一地GDOP 无参时参考位置不赋值
///
/// 主星星历 x y z vx vy vz
/// 邻星星历x y z vx vy vz
/// 超短波位置 3
/// 参考站位置 3
/// 时差误差
/// 星历误差
///
///
public static List Gdop2Sat1DByXyzNew(double[] mainEph, double[] adajEph, double[] cdbPos, double dtousErr, double ephLocErr, double[] refPos = null)
{
int satCount = 2;
//该值和points 一一对应
double[] level = GdopParam.误差配置.误差距离m;
double[] satllh = new double[satCount * 3];
IntPtr res = IntPtr.Zero;
IntPtr lpoints = IntPtr.Zero;
int[] resCount = new int[level.Length];
if (refPos == null || refPos.Length == 0)
{
GDOPApi.Gdop2Sat1DNoRefByXyz_new(mainEph, adajEph, cdbPos, dtousErr, ephLocErr, level, level.Length, resCount, out lpoints, out res, satllh);
}
else
{
GDOPApi.Gdop2Sat1DRefByXyz_new(mainEph, adajEph, cdbPos, refPos, dtousErr, ephLocErr, level, level.Length, resCount, out lpoints, out res, satllh);
}
var errs= ToErrDistanceMapPoints(level,resCount,lpoints,res);
GDOPApi.FreeGDOPBuf(res);
GDOPApi.FreeGDOPBuf(lpoints);
return errs;
}
private static List ToErrDistanceMapPoints(double[] level,int[] resCount, IntPtr lpoints, IntPtr res)
{
int total = resCount.Sum(r => r);
int[] Points_Value = new int[total];
Marshal.Copy(lpoints, Points_Value, 0, Points_Value.Length);
int totalPoint = Points_Value.Sum(p => p);
double[] LOP_Value = new double[totalPoint * 2];
Marshal.Copy(res, LOP_Value, 0, LOP_Value.Length);
var points = ParseResult(LOP_Value);
//用于绘制的数据
List errs = new List();
int skippointcount = 0;
int skipcount = 0;
int count = 0;
for (int idx = 0; idx < level.Length; ++idx)
{
int levelcount = resCount[idx];
skipcount = idx == 0 ? 0 : skipcount + resCount[idx - 1];
for (int i = skipcount; i < levelcount + skipcount; i++)
{
int pointcount = Points_Value[i];
skippointcount = count == 0 ? 0 : skippointcount + Points_Value[i - 1];
var mapDots = points.Skip(skippointcount).Take(pointcount);
if (!mapDots.Any()) continue;
ErrDistanceMapPoints errDistanceMap = new ErrDistanceMapPoints();
errDistanceMap.ErrDistance = level[idx];
errDistanceMap.MapDots.AddRange(mapDots);
errs.Add(errDistanceMap);
count++;
}
}
return errs;
}
///
/// 一星一地GDOP
///
/// 主星星历
/// 信号时间
/// 超短波位置 3
/// 测向站位置 3
/// 时差误差
/// 测向误差
/// 星历误差
/// 参考站位置 3
///
public static List Gdop1Sat1DByXyz(double[] mainEph, 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];
IntPtr res = IntPtr.Zero;
int[] resCount = new int[level.Length];
if (refPos == null || refPos.Length == 0)
{
GDOPApi.GdopXDCXNoRefByXyz(mainEph, cdbPos, cxPos, dtousErr, doaErr, ephLocErr, level, level.Length, resCount, out res, satllh);
}
else
{
GDOPApi.GdopXDCXRefByXyz(mainEph, 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 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 errs;
}
public static List Gdop1Sat1DByXyzNew(double[] mainEph, 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];
IntPtr res = IntPtr.Zero;
IntPtr lpoints = IntPtr.Zero;
int[] resCount = new int[level.Length];
if (refPos == null || refPos.Length == 0)
{
GDOPApi.GdopXDCXNoRefByXyz_new(mainEph, cdbPos, cxPos, dtousErr, doaErr, ephLocErr, level, level.Length, resCount,out lpoints, out res, satllh);
}
else
{
GDOPApi.GdopXDCXRefByXyz_new(mainEph, cdbPos, cxPos, refPos, dtousErr, doaErr, ephLocErr, level, level.Length, resCount,out lpoints, out res, satllh);
}
var errs = ToErrDistanceMapPoints(level, resCount, lpoints, res);
GDOPApi.FreeGDOPBuf(res);
GDOPApi.FreeGDOPBuf(lpoints);
return errs;
}
public static List Gdop3SatByXyz(double[] mainEph, double[] adaj1Eph, double[] adaj2Eph,
double dtousErr, double ephLocErr, double[] refPos = null)
{
int satCount = 3;
//该值和points 一一对应
double[] level = GdopParam.误差配置.误差距离m;
double[] satllh = new double[satCount * 3];
IntPtr res = IntPtr.Zero;
int[] resCount = new int[level.Length];
if (refPos == null || refPos.Length == 0)
{
GDOPApi.Gdop3SatNoRefByXyz(mainEph, adaj1Eph, adaj2Eph, dtousErr, ephLocErr, level, level.Length, resCount, out res, satllh);
}
else
{
GDOPApi.Gdop3SatRefByXyz(mainEph, adaj1Eph, adaj2Eph, 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 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 errs;
}
public static List Gdop3SatByXyzNew(double[] mainEph, double[] adaj1Eph, double[] adaj2Eph,
double dtousErr, double ephLocErr, double[] refPos = null)
{
int satCount = 3;
//该值和points 一一对应
double[] level = GdopParam.误差配置.误差距离m;
double[] satllh = new double[satCount * 3];
IntPtr res = IntPtr.Zero;
IntPtr lpoints = IntPtr.Zero;
int[] resCount = new int[level.Length];
if (refPos == null || refPos.Length == 0)
{
GDOPApi.Gdop3SatNoRefByXyz_new(mainEph, adaj1Eph, adaj2Eph, dtousErr, ephLocErr, level, level.Length, resCount,out lpoints, out res, satllh);
}
else
{
GDOPApi.Gdop3SatRefByXyz_new(mainEph, adaj1Eph, adaj2Eph, refPos, dtousErr, ephLocErr, level, level.Length, resCount, out lpoints, out res, satllh);
}
var errs = ToErrDistanceMapPoints(level, resCount, lpoints, res);
GDOPApi.FreeGDOPBuf(res);
GDOPApi.FreeGDOPBuf(lpoints);
return errs;
}
public static List Gdop3SatDFByXyz(double[] mainEph, double[] adaj1Eph, double[] adaj2Eph,
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];
IntPtr res = IntPtr.Zero;
int[] resCount = new int[level.Length];
GDOPApi.Gdop3SatDFByXyz(mainEph, adaj1Eph, adaj2Eph, 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 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 errs;
}
public static List Gdop2SatDRefByXyz(double[] mainEph, double[] adajEph, 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];
IntPtr res = IntPtr.Zero;
int[] resCount = new int[level.Length];
GDOPApi.Gdop2SatDRefByXyz(mainEph, adajEph, 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 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 errs;
}
private static List<(double lon, double lat)> ParseResult(double[] ponits)
{
List<(double lon,double lat)> mapDots = new List<(double lon, double lat)>();
int count = 2;
for (int i = 0; i < ponits.Length / count; i++)
{
var Lon = ponits[count * i];
var Lat = ponits[count * i + 1];//0 1 2 3 4 5 6 7
mapDots.Add((Lon, Lat));
}
return mapDots;
}
public static List Gdop3SatDFByXyzNew(double[] mainEph, double[] adaj1Eph, double[] adaj2Eph,
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];
IntPtr res = IntPtr.Zero;
IntPtr lpoints = IntPtr.Zero;
int[] resCount = new int[level.Length];
GDOPApi.Gdop3SatDFByXyz_new(mainEph, adaj1Eph, adaj2Eph, refPos, fuHz1, fuHz2, dfoErr, ephLocErr, ephVErr, level, level.Length, resCount,out lpoints, out res, satllh);
var errs = ToErrDistanceMapPoints(level, resCount, lpoints, res);
GDOPApi.FreeGDOPBuf(res);
GDOPApi.FreeGDOPBuf(lpoints);
return errs;
}
public static List Gdop2SatDRefByXyzNew(double[] mainEph, double[] adajEph, 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];
IntPtr res = IntPtr.Zero;
IntPtr lpoints = IntPtr.Zero;
int[] resCount = new int[level.Length];
GDOPApi.Gdop2SatDRefByXyz_new(mainEph, adajEph, refPos, fuHz1, fuHz2, dtousErr, dfoErr, ephLocErr, ephVErr, level, level.Length, resCount, out lpoints, out res, satllh);
var errs = ToErrDistanceMapPoints(level, resCount, lpoints, res);
GDOPApi.FreeGDOPBuf(res);
GDOPApi.FreeGDOPBuf(lpoints);
return errs;
}
}
}