123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- using System;
- using System.Collections.Generic;
- using System.Configuration;
- using System.Linq;
- using System.Runtime.InteropServices;
- using System.Security.Policy;
- using System.Text;
- using System.Threading.Tasks;
- using XdCxRhDW.Entity;
- namespace XdCxRhDW.Api
- {
- public static class LeoPosApi
- {
- //低轨道单星和双星定位
- private const string leoPos = @"AddIns\低轨\DLL_XDXZ.dll";
- private static double[] zone = new double[] { -85, 85, -180, 180 }; //定位区域
- /// <summary>
- /// 地轨双星dw
- /// </summary>
- /// <param name="main_sat"></param>
- /// <param name="neigh_sat"></param>
- /// <param name="Ref_Station_LLH"></param>
- /// <param name="Zone"></param>
- /// <param name="target_dto"></param>
- /// <param name="target_dfo"></param>
- /// <param name="ref_dto"></param>
- /// <param name="ref_dfo"></param>
- /// <param name="fu1"></param>
- /// <param name="fu2"></param>
- /// <param name="target_llh"></param>
- [DllImport(leoPos, EntryPoint = "TwoStar_DTFO_DW", CallingConvention = CallingConvention.Cdecl)]
- public extern static void TwoStar_DTFO_DW(double[] main_sat, double[] neigh_sat, double[] Ref_Station_LLH
- , double[] Zone, double target_dto, double target_dfo,
- double ref_dto, double ref_dfo, double fu1, double fu2, double[] target_llh);
- /// <summary>
- /// 单星dw
- /// </summary>
- /// <param name="main_sat">第一时刻星历 长度6</param>
- /// <param name="neigh_sat1">第二时刻星历 长度6</param>
- /// <param name="neigh_sat2">第三时刻星历 长度6</param>
- /// <param name="Zone"></param>
- /// <param name="target_dfo1">频差1(Hz)</param>
- /// <param name="target_dfo2">频差2(Hz)</param>
- /// <param name="fu">上行频点(Hz)</param>
- /// <param name="target_llh"></param>
- [DllImport(leoPos, EntryPoint = "SingleStar_DFO_DW", CallingConvention = CallingConvention.Cdecl)]
- public extern static void SingleStar_DFO_DW(double[] main_sat, double[] neigh_sat1, double[] neigh_sat2
- , double[] Zone, double target_dfo1, double target_dfo2, double fu, double[] target_llh);
- /// <summary>
- /// 低轨双星时差线
- /// </summary>
- /// <param name="main_sat_pos">主星星历 长度6</param>
- /// <param name="neigh_sat_pos">邻星星历 长度6</param>
- /// <param name="ref_pos">参考站位置</param>
- /// <param name="Zone">-85, 85, -180, 180</param>
- /// <param name="target_dto">目标时差(s)</param>
- /// <param name="ref_dto">参考时差(s)</param>
- /// <param name="LOP_Value"></param>
- /// <param name="LOP_Len"></param>
- [DllImport(leoPos, EntryPoint = "TwoStar_SCX", CallingConvention = CallingConvention.Cdecl)]
- public extern static void TwoStar_SCX(double[] main_sat_pos, double[] neigh_sat_pos, double[] ref_pos, double[] Zone,
- double target_dto, double ref_dto, out IntPtr LOP_Value, ref int LOP_Len);
- /// <summary>
- /// 低轨双星频差线
- /// </summary>
- /// <param name="main_sat"></param>
- /// <param name="neigh_sat"></param>
- /// <param name="ref_pos"></param>
- /// <param name="Zone"></param>
- /// <param name="target_dfo">目标频差(Hz)</param>
- /// <param name="ref_dfo">参考频差(Hz)</param>
- /// <param name="fu1">上行频点1(Hz)</param>
- /// <param name="fu2">上行频点2(Hz)</param>
- /// <param name="LOP_Value"></param>
- /// <param name="LOP_Len"></param>
- [DllImport(leoPos, EntryPoint = "TwoStar_PCX", CallingConvention = CallingConvention.Cdecl)]
- public extern static void TwoStar_PCX(double[] main_sat, double[] neigh_sat, double[] ref_pos,
- double[] Zone, double target_dfo, double ref_dfo, double fu1, double fu2, out IntPtr LOP_Value, ref int LOP_Len);
- /// <summary>
- /// 单星频差线
- /// </summary>
- /// <param name="main_sat"></param>
- /// <param name="neigh_sat"></param>
- /// <param name="Zone"></param>
- /// <param name="target_dfo"></param>
- /// <param name="fu"></param>
- /// <param name="LOP_Value"></param>
- /// <param name="LOP_Len"></param>
- [DllImport(leoPos, EntryPoint = "SingleStar_PCX", CallingConvention = CallingConvention.Cdecl)]
- public extern static void SingleStar_PCX(double[] main_sat, double[] neigh_sat
- , double[] Zone, double target_dfo, double fu, out IntPtr LOP_Value, ref int LOP_Len);
- public static double[] X1_POS(CgRes cg, double upfreqHz)
- {
- double[] mainSat = new double[6] { cg.MainX.Value, cg.MainY.Value, cg.MainZ.Value, cg.MainVx.Value, cg.MainVy.Value, cg.MainVz.Value };
- double[] adjaSat1 = new double[6] { cg.Adja1X.Value, cg.Adja1Y.Value, cg.Adja1Z.Value, cg.Adja1Vx.Value, cg.Adja1Vy.Value, cg.Adja1Vz.Value };
- double[] adjaSat2 = new double[6] { cg.Adja2X.Value, cg.Adja2Y.Value, cg.Adja2Z.Value, cg.Adja2Vx.Value, cg.Adja2Vy.Value, cg.Adja2Vz.Value };
- double[] zone = new double[] { -85, 85, -180, 180 }; //定位区域
- double[] res = new double[6];
- SingleStar_DFO_DW(mainSat, adjaSat1, adjaSat2, zone, cg.Dfo1.Value, cg.Dfo2.Value, upfreqHz, res);
-
- return res;
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="cg"></param>
- /// <param name="refTx"></param>
- /// <param name="upfreqHz1">目标上行频点</param>
- /// <param name="upfreqHz2">参考上行频点</param>
- /// <returns></returns>
- public static double[] X2_POS(CgRes cg, StationRes sRes, double upfreqHz1, double upfreqHz2)
- {
- double[] refStation = new double[3] { sRes.RefLon.Value, sRes.RefLat.Value, 0 };
- double[] mainSat = new double[6] { cg.MainX.Value, cg.MainY.Value, cg.MainZ.Value, cg.MainVx.Value, cg.MainVy.Value, cg.MainVz.Value };
- double[] adjaSat1 = new double[6] { cg.Adja1X.Value, cg.Adja1Y.Value, cg.Adja1Z.Value, cg.Adja1Vx.Value, cg.Adja1Vy.Value, cg.Adja1Vz.Value };
- double[] zone = new double[] { -85, 85, -180, 180 }; //定位区域
- double[] res = new double[6];
- var refDto = (cg.YbMainDto.Value - cg.YbAdja1Dto.Value) / 1e6;
- var refDfo = cg.YbMainDfo.Value - cg.YbAdja1Dfo.Value;
- TwoStar_DTFO_DW(mainSat, adjaSat1, refStation, zone, cg.Dto1.Value / 1e6, cg.Dfo1.Value, refDto, refDfo, upfreqHz1, upfreqHz2, res);
-
- return res;
- }
- public static IEnumerable<(double lon, double lat)> DtoLineLeoX2(DtoLineTwoStartOption opt)
- {
- List<DtoLinePoint> list = new List<DtoLinePoint>();
- IntPtr LOP_ValuePtr;
- int LOP_Len = 0;
- TwoStar_SCX(
- opt.MsEph,
- opt.NsEph,
- opt.RefGeod,
- zone,
- opt.TargetDto * 1e-6,
- opt.RefDto * 1e-6, out LOP_ValuePtr, ref LOP_Len);
- double[] LOP_Value = new double[LOP_Len * 3];
- if (LOP_Len > 0)
- {
- Marshal.Copy(LOP_ValuePtr, LOP_Value, 0, LOP_Value.Length);
- list = OutputHelper.WriteDtoLine(LOP_Value, LOP_Len);
- }
- var Lines = list.Select(p => (p.Lon, p.Lat));
- return Lines;
- }
- public static IEnumerable<(double lon, double lat)> DfoLineLeo2(LeoDfoLineTwo opt)
- {
- IntPtr LOP_ValuePtr;
- int LOP_Len = 0;
- TwoStar_PCX(
- opt.MsEph,
- opt.NsEph,
- opt.RefGeod,
- zone,
- opt.TargetDfo,
- opt.RefDfo,
- opt.fu1,
- opt.fu2, out LOP_ValuePtr, ref LOP_Len);
- return ParseResult(LOP_ValuePtr, LOP_Len);
- }
- public static IEnumerable<(double lon, double lat)> DfoLineLeoX1(double[] main_sat, double[] neigh_sat, double target_dfo, double fu)
- {
- IntPtr LOP_ValuePtr;
- int LOP_Len = 0;
- SingleStar_PCX(main_sat, neigh_sat
- , zone, target_dfo, fu, out LOP_ValuePtr, ref LOP_Len);
- return ParseResult(LOP_ValuePtr, LOP_Len);
- }
- private static IEnumerable<(double lon, double lat)> ParseResult(IntPtr LOP_ValuePtr, int LOP_Len)
- {
- List<DtoLinePoint> list = new List<DtoLinePoint>();
- double[] LOP_Value = new double[LOP_Len * 3];
- if (LOP_Len > 0)
- {
- Marshal.Copy(LOP_ValuePtr, LOP_Value, 0, LOP_Value.Length);
- for (int idx = 0; idx < LOP_Len; ++idx)
- {
- if (LOP_Value[3 * idx + 1] != -1)
- {
- list.Add(new DtoLinePoint()
- {
- Lon = LOP_Value[3 * idx + 1],
- Lat = LOP_Value[3 * idx]
- });
- }
- }
- for (int idx = 0; idx < LOP_Len; ++idx)
- {
- if (LOP_Value[3 * idx + 2] != -1)
- {
- list.Add(new DtoLinePoint()
- {
- Lon = LOP_Value[3 * idx + 2],
- Lat = LOP_Value[3 * idx]
- });
- }
- }
- }
- var Lines = list.Select(p => (p.Lon, p.Lat));
- return Lines;
- }
- }
- }
|