PosApi.cs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  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. using DevExpress.XtraBars.Docking2010.Views.Widget;
  8. using XzXdDw.App.Model;
  9. using static System.Windows.Forms.VisualStyles.VisualStyleElement.TextBox;
  10. using static DevExpress.XtraPrinting.Native.ExportOptionsPropertiesNames;
  11. namespace XzXdDw.App.Api
  12. {
  13. public static class PosApi
  14. {
  15. #region cpp dll Interop
  16. //两星一地定位
  17. private const string X2D1 = @"AddIns\DLL_SC_2X1D_DW.dll";
  18. [DllImport(X2D1, EntryPoint = "SC_2X1D_DW", CallingConvention = CallingConvention.Cdecl)]//两星一地
  19. private extern static void X2D1_POS_Core(double[] mainSat, double[] adjaSat, double[] cdbStation, double[] satStation1, double[] satStation2, double[] satStation3, double[] satStation4,
  20. double[] satStation5, double[] refStation, double[] zone, double tarSxDto, double tarXdDto, double samp_main_dto, double samp_neigh_dto, double[] res);
  21. private const string gzdw = @"Api\低轨时频差线及定位\DLL_XDXZ.dll";
  22. /// <summary>
  23. /// 地轨双星dw
  24. /// </summary>
  25. /// <param name="main_sat"></param>
  26. /// <param name="neigh_sat"></param>
  27. /// <param name="Ref_Station_LLH"></param>
  28. /// <param name="Zone"></param>
  29. /// <param name="target_dto"></param>
  30. /// <param name="target_dfo"></param>
  31. /// <param name="ref_dto"></param>
  32. /// <param name="ref_dfo"></param>
  33. /// <param name="fu1"></param>
  34. /// <param name="fu2"></param>
  35. /// <param name="target_llh"></param>
  36. [DllImport(gzdw, EntryPoint = "TwoStar_DTFO_DW", CallingConvention = CallingConvention.Cdecl)]
  37. public extern static void TwoStar_DTFO_DW(double[] main_sat, double[] neigh_sat, double[] Ref_Station_LLH
  38. , double[] Zone, double target_dto, double target_dfo,
  39. double ref_dto, double ref_dfo, double fu1, double fu2, double[] target_llh);
  40. /// <summary>
  41. /// 单星dw
  42. /// </summary>
  43. /// <param name="main_sat">第一时刻星历 长度6</param>
  44. /// <param name="neigh_sat1">第二时刻星历 长度6</param>
  45. /// <param name="neigh_sat2">第三时刻星历 长度6</param>
  46. /// <param name="Zone"></param>
  47. /// <param name="target_dfo1">频差1(Hz)</param>
  48. /// <param name="target_dfo2">频差2(Hz)</param>
  49. /// <param name="fu">上行频点(Hz)</param>
  50. /// <param name="target_llh"></param>
  51. [DllImport(gzdw, EntryPoint = "SingleStar_DFO_DW", CallingConvention = CallingConvention.Cdecl)]//两星一地
  52. public extern static void SingleStar_DFO_DW(double[] main_sat, double[] neigh_sat1, double[] neigh_sat2
  53. , double[] Zone, double target_dfo1, double target_dfo2, double fu, double[] target_llh);
  54. /// <summary>
  55. /// 底轨双星时差线
  56. /// </summary>
  57. /// <param name="main_sat_pos">主星星历 长度6</param>
  58. /// <param name="neigh_sat_pos">邻星星历 长度6</param>
  59. /// <param name="ref_pos">参考站位置</param>
  60. /// <param name="Zone">-85, 85, -180, 180</param>
  61. /// <param name="target_dto">目标时差(s)</param>
  62. /// <param name="ref_dto">参考时差(s)</param>
  63. /// <param name="LOP_Value"></param>
  64. /// <param name="LOP_Len"></param>
  65. [DllImport(gzdw, EntryPoint = "TwoStar_SCX", CallingConvention = CallingConvention.Cdecl)]//两星一地
  66. public extern static void TwoStar_SCX(double[] main_sat_pos, double[] neigh_sat_pos, double[] ref_pos, double[] Zone,
  67. double target_dto, double ref_dto, out IntPtr LOP_Value, ref int LOP_Len);
  68. /// <summary>
  69. /// 地轨双星频差线
  70. /// </summary>
  71. /// <param name="main_sat"></param>
  72. /// <param name="neigh_sat"></param>
  73. /// <param name="ref_pos"></param>
  74. /// <param name="Zone"></param>
  75. /// <param name="target_dfo">目标频差(Hz)</param>
  76. /// <param name="ref_dfo">参考频差(Hz)</param>
  77. /// <param name="fu1">上行频点1(Hz)</param>
  78. /// <param name="fu2">上行频点2(Hz)</param>
  79. /// <param name="LOP_Value"></param>
  80. /// <param name="LOP_Len"></param>
  81. [DllImport(gzdw, EntryPoint = "TwoStar_PCX", CallingConvention = CallingConvention.Cdecl)]//两星一地
  82. public extern static void TwoStar_PCX(double[] main_sat, double[] neigh_sat, double[] ref_pos,
  83. double[] Zone, double target_dfo, double ref_dfo, double fu1, double fu2, out IntPtr LOP_Value, ref int LOP_Len);
  84. /// <summary>
  85. /// 单星频差线
  86. /// </summary>
  87. /// <param name="main_sat"></param>
  88. /// <param name="neigh_sat"></param>
  89. /// <param name="Zone"></param>
  90. /// <param name="target_dfo"></param>
  91. /// <param name="fu"></param>
  92. /// <param name="LOP_Value"></param>
  93. /// <param name="LOP_Len"></param>
  94. [DllImport(gzdw, EntryPoint = "SingleStar_PCX", CallingConvention = CallingConvention.Cdecl)]//两星一地
  95. public extern static void SingleStar_PCX(double[] main_sat, double[] neigh_sat
  96. , double[] Zone, double target_dfo, double fu,out IntPtr LOP_Value,ref int LOP_Len);
  97. private const string XdtsDll = @"Api\时差线\Positioning.dll";
  98. /// <summary>
  99. ///
  100. /// </summary>
  101. /// <param name="main_sat_pos"></param>
  102. /// <param name="neigh_sat_pos"></param>
  103. /// <param name="rec1_pos"></param>
  104. /// <param name="rec2_pos"></param>
  105. /// <param name="ref_pos"></param>
  106. /// <param name="Zone"></param>
  107. /// <param name="target_dto">目标时差 (s)</param>
  108. /// <param name="ref_dto">参考时差 (s)</param>
  109. /// <param name="LOP_Value"></param>
  110. /// <param name="LOP_Len"></param>
  111. [DllImport(XdtsDll, EntryPoint = "CurveByTwoTDOA", CallingConvention = CallingConvention.Cdecl)]//两星一地
  112. public extern static void CurveByTwoTDOA(double[] main_sat_pos, double[] neigh_sat_pos, double[] rec1_pos, double[] rec2_pos, double[] ref_pos, double[] Zone,
  113. double target_dto, double ref_dto, out IntPtr LOP_Value, ref int LOP_Len);
  114. #endregion
  115. /// <summary>
  116. /// 两星一地,返回经度纬度高度及镜像点,数组长度为6
  117. /// </summary>
  118. /// <param name="cgRes"></param>
  119. /// <returns></returns>
  120. public static double[] X2D1_POS(CgRes cgRes, List<TxInfo> listTx)
  121. {
  122. var satTx = listTx.Find(p => p.TxType == EnumTxType.MainSat);
  123. var cdbTx = listTx.Find(p => p.TxType == EnumTxType.Cdb);
  124. var refTx = listTx.Find(p => p.TxType == EnumTxType.Ref);
  125. double[] mainSat = new double[3] { cgRes.MainX, cgRes.MainY, cgRes.MainZ };
  126. double[] adjaSat = new double[3] { cgRes.AdjaX, cgRes.AdjaY, cgRes.AdjaZ };
  127. double[] satStation = new double[3] { satTx.Lon, satTx.Lat, 0 };
  128. double[] cdbStation = new double[3] { cdbTx.Lon, cdbTx.Lat, 0 };
  129. double[] refStation = new double[3] { refTx.Lon, refTx.Lat, 0 };
  130. double[] zone = new double[] { -85, 85, -180, 180 }; //定位区域
  131. double[] res = new double[6];
  132. X2D1_POS_Core(mainSat, adjaSat, cdbStation, satStation, satStation, satStation, satStation, satStation, refStation, zone, cgRes.DtoSx / 1e6, cgRes.DtoCdb / 1e6, cgRes.YbMain / 1e6, cgRes.YbAdja / 1e6, res);
  133. return res;
  134. }
  135. public static double[] X2D1_POS(CgRes cgRes, TxInfo satTx, TxInfo cdbTx, TxInfo refTx)
  136. {
  137. double[] mainSat = new double[3] { cgRes.MainX, cgRes.MainY, cgRes.MainZ };
  138. double[] adjaSat = new double[3] { cgRes.AdjaX, cgRes.AdjaY, cgRes.AdjaZ };
  139. double[] satStation = new double[3] { satTx.Lon, satTx.Lat, 0 };
  140. double[] cdbStation = new double[3] { cdbTx.Lon, cdbTx.Lat, 0 };
  141. double[] refStation = new double[3] { refTx.Lon, refTx.Lat, 0 };
  142. double[] zone = new double[] { -85, 85, -180, 180 }; //定位区域
  143. double[] res = new double[6];
  144. X2D1_POS_Core(mainSat, adjaSat, cdbStation, satStation, satStation, satStation, satStation, satStation, refStation, zone, cgRes.DtoSx / 1e6, cgRes.DtoCdb / 1e6, cgRes.YbMain / 1e6, cgRes.YbAdja / 1e6, res);
  145. return res;
  146. }
  147. public static double[] X1_POS(CgRes cg,CgRes cg1,double upfreqHz)
  148. {
  149. double[] mainSat = new double[6] { cg.MainX, cg.MainY, cg.MainZ,cg .MainVX,cg.MainVY,cg.MainVZ};
  150. double[] adjaSat1 = new double[6] { cg.AdjaX, cg.AdjaY, cg.AdjaZ, cg.AdjaVX, cg.AdjaVY, cg.AdjaVZ };
  151. double[] adjaSat2 = new double[6] { cg1.AdjaX, cg1.AdjaY, cg1.AdjaZ, cg1.AdjaVX, cg1.AdjaVY, cg1.AdjaVZ };
  152. double[] zone = new double[] { -85, 85, -180, 180 }; //定位区域
  153. double[] res = new double[6];
  154. SingleStar_DFO_DW(mainSat, adjaSat1, adjaSat2, zone, cg.DfoSx,cg1.DfoSx, upfreqHz, res);
  155. return res;
  156. }
  157. public static double[] X2_POS(CgRes cg, TxInfo refTx, double upfreqHz1,double upfreqHz2)
  158. {
  159. double[] refStation = new double[3] { refTx.Lon, refTx.Lat, 0 };
  160. double[] mainSat = new double[6] { cg.MainX, cg.MainY, cg.MainZ, cg.MainVX, cg.MainVY, cg.MainVZ };
  161. double[] adjaSat1 = new double[6] { cg.AdjaX, cg.AdjaY, cg.AdjaZ, cg.AdjaVX, cg.AdjaVY, cg.AdjaVZ };
  162. double[] zone = new double[] { -85, 85, -180, 180 }; //定位区域
  163. double[] res = new double[6];
  164. TwoStar_DTFO_DW(mainSat, adjaSat1,refStation, zone,cg.DtoSx, cg.DfoSx, cg.DtoCdb, cg.DfoCdb, upfreqHz1, upfreqHz2, res);
  165. return res;
  166. }
  167. public static bool IsGeoPoint(double[] res)
  168. {
  169. return res[0] >= -180 && res[0] <= 180 && res[1] >= -90 && res[1] <= 90;
  170. }
  171. }
  172. }