using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
namespace XdCxRhDW.App.Api.GDOP误差椭圆
{
public static class GdopHelper
{
private const string GDOPDll = @"Api\GDOP误差椭圆\GDOP\GDOP_Draw.dll";
static readonly DateTime dtZero = new DateTime(1970, 1, 1, 8, 0, 0, 0);
///
[DllImport(GDOPDll, CallingConvention = CallingConvention.Cdecl)]
public static extern int Gdop2Sat1DRef(string mainLines, string adajLines, Int64 captime, double[] cdbPos
, double[] refPos, double dtousErr, double ephLocErr
, double[] level, int levlen, int[] resCount, out IntPtr res, double[] satllh);
[DllImport(GDOPDll, CallingConvention = CallingConvention.Cdecl)]
public static extern void FreeGDOPBuf(IntPtr val);
public static (List, List) Gdop2Sat1DRef(string mainLines, string adajLines, DateTime captime, double[] cdbPos, double[] refPos, double dtousErr, double ephLocErr)
{
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];
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);
}
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;
}
}
}