ErrEllipseHepler.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Runtime.InteropServices;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace Leo2SatTaskServer54
  8. {
  9. public static class ErrEllipseHepler
  10. {
  11. private const string ErrellipDll = @"AddIns\误差椭圆\DLL_GDOP_Analysis0415";
  12. /// <summary>
  13. /// 两星一地误差椭圆
  14. /// </summary>
  15. /// <param name="main_eph">主星位置 长度6</param>
  16. /// <param name="neigh_eph">邻星位置 长度6</param>
  17. /// <param name="cdbAnt">超短波 长度3</param>
  18. /// <param name="refStation">参考站 长度3</param>
  19. /// <param name="Select_Point">定位点 长度3</param>
  20. /// <param name="dto_err">时差误差(s)</param>
  21. /// <param name="eph_err"></param>
  22. /// <param name="Pe">0.5</param>
  23. /// <param name="LOP_Len"></param>
  24. /// <returns></returns>
  25. [DllImport(ErrellipDll, EntryPoint = "Error_Ellipse_2X1D", CallingConvention = CallingConvention.Cdecl)]
  26. public extern static IntPtr Error_Ellipse_2X1D(double[] main_eph, double[] neigh_eph, double[] cdbAnt, double[] refStation, double[] Select_Point, double dto_err,
  27. double eph_err, double Pe, ref int LOP_Len);
  28. /// <summary>
  29. /// 获取误差椭圆的长轴(m)、短轴(m)、倾角(°)
  30. /// </summary>
  31. /// <param name="posLon"></param>
  32. /// <param name="posLat"></param>
  33. /// <param name="mainEph"></param>
  34. /// <param name="adajEph"></param>
  35. /// <param name="cdbPos"></param>
  36. /// <param name="RefGeod"></param>
  37. /// <param name="DtoErrus"></param>
  38. /// <param name="EphErrm"></param>
  39. /// <returns></returns>
  40. public static double[] ErrorEllipse2X1D(double posLon, double posLat, double[] mainEph, double[] adajEph, double[] cdbPos, double[] RefGeod, double DtoErrus, double EphErrm)
  41. {
  42. IEnumerable<double> res = new List<double>();
  43. int LOP_Len = 0;
  44. /// <summary>
  45. /// 概率 默认0.5
  46. /// </summary>
  47. double Pe = 0.5;
  48. IntPtr LOP_ValuePtr =Error_Ellipse_2X1D(
  49. mainEph,
  50. adajEph,
  51. cdbPos,
  52. RefGeod,
  53. new double[3] { posLon, posLat, 0 },
  54. DtoErrus * 1e-6,
  55. EphErrm,//单位m
  56. Pe, ref LOP_Len);
  57. double[] LOP_Value = new double[LOP_Len];
  58. if (LOP_Len > 0)
  59. {
  60. Marshal.Copy(LOP_ValuePtr, LOP_Value, 0, LOP_Value.Length);
  61. int lastcount = LOP_Len - 3;
  62. res = LOP_Value.Skip(lastcount).Take(3);
  63. }
  64. return res.ToArray();
  65. }
  66. }
  67. }