|
@@ -1,6 +1,7 @@
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
|
+using System.Runtime.CompilerServices;
|
|
|
using System.Runtime.InteropServices;
|
|
|
using System.Text;
|
|
|
using System.Threading.Tasks;
|
|
@@ -80,7 +81,7 @@ namespace XdCxRhDW.Api
|
|
|
/// <returns></returns>
|
|
|
public static double[] X1D1_Pos(CgRes cgRes, StationRes sRes, CxRes cxRes, bool CalcConfidence = false)
|
|
|
{
|
|
|
- if (cgRes.DtoCdb.Value == 0) return new double[7] { 999, 999, 0, 999, 999, 0, -1};
|
|
|
+ if (cgRes.DtoCdb.Value == 0) return new double[7] { 999, 999, 0, 999, 999, 0, -1 };
|
|
|
double[] mainSat = new double[3] { cgRes.MainX.Value, cgRes.MainY.Value, cgRes.MainZ.Value };
|
|
|
double[] satStation = new double[3] { sRes.SatTxLon, sRes.SatTxLat, 0 };
|
|
|
double[] cdbStation = new double[3] { sRes.CdbTxLon.Value, sRes.CdbTxLat.Value, 0 };
|
|
@@ -134,7 +135,7 @@ namespace XdCxRhDW.Api
|
|
|
{
|
|
|
if (cgRes.Dto1.Value == 0 || cgRes.DtoCdb.Value == 0)
|
|
|
{
|
|
|
- return new double[7] { 999, 999, 0, 999, 999, 0, -1};
|
|
|
+ return new double[7] { 999, 999, 0, 999, 999, 0, -1 };
|
|
|
}
|
|
|
double[] mainSat = new double[3] { cgRes.MainX.Value, cgRes.MainY.Value, cgRes.MainZ.Value };
|
|
|
double[] adjaSat = new double[3] { cgRes.Adja1X.Value, cgRes.Adja1Y.Value, cgRes.Adja1Z.Value };
|
|
@@ -159,7 +160,7 @@ namespace XdCxRhDW.Api
|
|
|
{
|
|
|
if (cgRes.Dto1.Value == 0 || cgRes.Dto2.Value == 0)
|
|
|
{
|
|
|
- return new double[7] { 999, 999, 0, 999, 999, 0, -1};
|
|
|
+ return new double[7] { 999, 999, 0, 999, 999, 0, -1 };
|
|
|
}
|
|
|
double[] mainSat = new double[3] { cgRes.MainX.Value, cgRes.MainY.Value, cgRes.MainZ.Value };
|
|
|
double[] adja1Sat = new double[3] { cgRes.Adja1X.Value, cgRes.Adja1Y.Value, cgRes.Adja1Z.Value };
|
|
@@ -188,7 +189,7 @@ namespace XdCxRhDW.Api
|
|
|
{
|
|
|
if (cgRes.Dto1.Value == 0 || cgRes.DtoCdb.Value == 0)
|
|
|
{
|
|
|
- return new double[7] { 999, 999, 0, 999, 999, 0, -1};
|
|
|
+ return new double[7] { 999, 999, 0, 999, 999, 0, -1 };
|
|
|
}
|
|
|
double[] mainSat = new double[3] { cgRes.MainX.Value, cgRes.MainY.Value, cgRes.MainZ.Value };
|
|
|
double[] adjaSat = new double[3] { cgRes.Adja1X.Value, cgRes.Adja1Y.Value, cgRes.Adja1Z.Value };
|
|
@@ -204,7 +205,7 @@ namespace XdCxRhDW.Api
|
|
|
X2D1_Pos20240305_Core(mainSat, adjaSat, cdbStation, satStation, satStation, satStation, satStation, satStation, refStation, zone, dto1, dtoCdb, ybDto1, ybDto2, res);
|
|
|
ConvertToGeoPoint(res);
|
|
|
var posRes = ConvertToGeoPoint(res);//精确搜索值
|
|
|
- if (CalcConfidence&& IsGeoPoint2(posRes))
|
|
|
+ if (CalcConfidence && IsGeoPoint2(posRes))
|
|
|
{
|
|
|
var posResGz = X2D1_GzPos(cgRes, sRes);
|
|
|
if (IsGeoPoint2(posResGz))
|
|
@@ -255,7 +256,7 @@ namespace XdCxRhDW.Api
|
|
|
{
|
|
|
if (cgRes.Dto1.Value == 0 || cgRes.DtoCdb.Value == 0)
|
|
|
{
|
|
|
- return new double[7] { 999, 999, 0, 999, 999, 0, -1};
|
|
|
+ return new double[7] { 999, 999, 0, 999, 999, 0, -1 };
|
|
|
}
|
|
|
double[] mainSat = new double[3] { cgRes.MainX.Value, cgRes.MainY.Value, cgRes.MainZ.Value };
|
|
|
double[] adjaSat = new double[3] { cgRes.Adja1X.Value, cgRes.Adja1Y.Value, cgRes.Adja1Z.Value };
|
|
@@ -304,6 +305,123 @@ namespace XdCxRhDW.Api
|
|
|
return posRes;
|
|
|
}
|
|
|
|
|
|
+ public static double[] X2D1_PosNoRef_ZL(double[] posRes, CgRes cgRes, StationRes sRes)
|
|
|
+ {
|
|
|
+ if (cgRes.Dto1.Value == 0 || cgRes.DtoCdb.Value == 0)
|
|
|
+ {
|
|
|
+ return new double[7] { 999, 999, 0, 999, 999, 0, -1 };
|
|
|
+ }
|
|
|
+ double startLon = (int)sRes.CdbTxLon.Value - 20;
|
|
|
+ double endLon = (int)sRes.CdbTxLon.Value + 20;
|
|
|
+ double startLat = (int)sRes.CdbTxLat.Value - 20;
|
|
|
+ double endLat = (int)sRes.CdbTxLat.Value + 20;
|
|
|
+ List<(double, double, double, double)> list = new List<(double, double, double, double)>();
|
|
|
+ var recXYZ = PhysicsHelper.GeoToEcef((sRes.SatTxLon, sRes.SatTxLat, 0));
|
|
|
+ var cdbXYZ = PhysicsHelper.GeoToEcef((sRes.CdbTxLon.Value, sRes.CdbTxLat.Value, 0));
|
|
|
+ for (double lon = startLon; lon < endLon; lon += 0.0001)
|
|
|
+ {
|
|
|
+ int flag = 0;
|
|
|
+ for (double lat = startLat; lat < endLat; lat += 0.0001)
|
|
|
+ {
|
|
|
+ var posXYZ = PhysicsHelper.GeoToEcef((lon, lat, 0));
|
|
|
+
|
|
|
+ //目标-主星-接收站的时间(us)
|
|
|
+ var dt1 = PhysicsHelper.Dto(posXYZ, (cgRes.MainX.Value, cgRes.MainY.Value, cgRes.MainZ.Value), recXYZ) * 1e6;
|
|
|
+
|
|
|
+ //目标-超短站的时间(us)
|
|
|
+ var dt3 = PhysicsHelper.Dto(posXYZ, cdbXYZ) * 1e6;
|
|
|
+ var dto2 = Math.Abs(dt1 - dt3 - cgRes.DtoCdb.Value);
|
|
|
+ if (dto2 > 100)
|
|
|
+ {
|
|
|
+ lat += 1;
|
|
|
+ if (flag < 1)
|
|
|
+ flag = 1;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ else if (dto2 > 50)
|
|
|
+ {
|
|
|
+ lat += 0.5;
|
|
|
+ if (flag < 2)
|
|
|
+ flag = 2;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ else if (dto2 > 20)
|
|
|
+ {
|
|
|
+ lat += 0.2;
|
|
|
+ if (flag < 3)
|
|
|
+ flag = 3;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ else if (dto2 > 5)
|
|
|
+ {
|
|
|
+ lat += 0.1;
|
|
|
+ if (flag < 4)
|
|
|
+ flag = 4;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ else if (dto2 > 2)
|
|
|
+ {
|
|
|
+ lat += 0.02;
|
|
|
+ if (flag < 5)
|
|
|
+ flag = 5;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //目标-邻星-接收站的时间(us)
|
|
|
+ var dt2 = PhysicsHelper.Dto(posXYZ, (cgRes.Adja1X.Value, cgRes.Adja1Y.Value, cgRes.Adja1Z.Value), recXYZ) * 1e6;
|
|
|
+ var dto1 = Math.Abs(dt1 - dt2 - cgRes.Dto1.Value);
|
|
|
+ //if (dto1 > 100)
|
|
|
+ //{
|
|
|
+ // lat += 1;
|
|
|
+ // if (flag < 1)
|
|
|
+ // flag = 1;
|
|
|
+ // continue;
|
|
|
+ //}
|
|
|
+ //else if (dto1 > 50)
|
|
|
+ //{
|
|
|
+ // lat += 0.5;
|
|
|
+ // if (flag < 2)
|
|
|
+ // flag = 2;
|
|
|
+ // continue;
|
|
|
+ //}
|
|
|
+ //else if (dto1 > 20)
|
|
|
+ //{
|
|
|
+ // lat += 0.2;
|
|
|
+ // if (flag < 3)
|
|
|
+ // flag = 3;
|
|
|
+ // continue;
|
|
|
+ //}
|
|
|
+ //else if (dto1 > 5)
|
|
|
+ //{
|
|
|
+ // lat += 0.1;
|
|
|
+ // if (flag < 4)
|
|
|
+ // flag = 4;
|
|
|
+ // continue;
|
|
|
+ //}
|
|
|
+ //else if (dto1 > 2)
|
|
|
+ //{
|
|
|
+ // lat += 0.02;
|
|
|
+ // if (flag < 5)
|
|
|
+ // flag = 5;
|
|
|
+ // continue;
|
|
|
+ //}
|
|
|
+ list.Add((lon, lat, dto1, dto2));
|
|
|
+ }
|
|
|
+ if (flag == 1)
|
|
|
+ lon += 1;
|
|
|
+ else if (flag == 2)
|
|
|
+ lon += 0.5;
|
|
|
+ else if (flag == 3)
|
|
|
+ lon += 0.2;
|
|
|
+ else if (flag == 4)
|
|
|
+ lon += 0.1;
|
|
|
+ else if (flag == 5)
|
|
|
+ lon += 0.02;
|
|
|
+ }
|
|
|
+
|
|
|
+ var val = list.OrderBy(p => p.Item3 + p.Item4).First();
|
|
|
+ return new double[7] { val.Item1, val.Item2, 0, 999, 999, 0, -1 };
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 融合定位带参,返回经度、纬度、高度、镜像点、置信度,数组长度为7
|
|
|
/// </summary>
|
|
@@ -385,9 +503,9 @@ namespace XdCxRhDW.Api
|
|
|
{
|
|
|
if (cgRes.Dto1.Value == 0 || cgRes.Dto2.Value == 0)
|
|
|
{
|
|
|
- return new double[7] { 999, 999, 0, 999, 999, 0, -1};
|
|
|
+ return new double[7] { 999, 999, 0, 999, 999, 0, -1 };
|
|
|
}
|
|
|
- if (cgRes.Dto1.Value == 0 || cgRes.Dto2.Value == 0) return new double[7] { 999, 999, 0, 999, 999, 0, -1};
|
|
|
+ if (cgRes.Dto1.Value == 0 || cgRes.Dto2.Value == 0) return new double[7] { 999, 999, 0, 999, 999, 0, -1 };
|
|
|
double[] mainSat = new double[3] { cgRes.MainX.Value, cgRes.MainY.Value, cgRes.MainZ.Value };
|
|
|
double[] adjaSat1 = new double[3] { cgRes.Adja1X.Value, cgRes.Adja1Y.Value, cgRes.Adja1Z.Value };
|
|
|
double[] adjaSat2 = new double[3] { cgRes.Adja2X.Value, cgRes.Adja2Y.Value, cgRes.Adja2Z.Value };
|
|
@@ -441,7 +559,7 @@ namespace XdCxRhDW.Api
|
|
|
else
|
|
|
{
|
|
|
posRes[6] = 0;
|
|
|
- }
|
|
|
+ }
|
|
|
}
|
|
|
return posRes;
|
|
|
}
|
|
@@ -457,7 +575,7 @@ namespace XdCxRhDW.Api
|
|
|
{
|
|
|
if (cgRes.Dto1.Value == 0 || cgRes.Dto2.Value == 0)
|
|
|
{
|
|
|
- return new double[7] { 999, 999, 0, 999, 999, 0, -1};
|
|
|
+ return new double[7] { 999, 999, 0, 999, 999, 0, -1 };
|
|
|
}
|
|
|
double[] mainSat = new double[3] { cgRes.MainX.Value, cgRes.MainY.Value, cgRes.MainZ.Value };
|
|
|
double[] adjaSat1 = new double[3] { cgRes.Adja1X.Value, cgRes.Adja1Y.Value, cgRes.Adja1Z.Value };
|
|
@@ -522,7 +640,7 @@ namespace XdCxRhDW.Api
|
|
|
/// <returns></returns>
|
|
|
public static double[] X3_PosTwoDfo(CgRes cgRes, StationRes sRes, bool CalcConfidence = false)
|
|
|
{
|
|
|
- if (cgRes.Dfo1.Value == 0 || cgRes.Dfo2.Value == 0) return new double[7] { 999, 999, 0, 999, 999, 0, -1};
|
|
|
+ if (cgRes.Dfo1.Value == 0 || cgRes.Dfo2.Value == 0) return new double[7] { 999, 999, 0, 999, 999, 0, -1 };
|
|
|
double[] mainSat = new double[6] { cgRes.MainX.Value, cgRes.MainY.Value, cgRes.MainZ.Value, cgRes.MainVx.Value, cgRes.MainVy.Value, cgRes.MainVz.Value };
|
|
|
double[] adjaSat1 = new double[6] { cgRes.Adja1X.Value, cgRes.Adja1Y.Value, cgRes.Adja1Z.Value, cgRes.Adja1Vx.Value, cgRes.Adja1Vy.Value, cgRes.Adja1Vz.Value };
|
|
|
double[] adjaSat2 = new double[6] { cgRes.Adja2X.Value, cgRes.Adja2Y.Value, cgRes.Adja2Z.Value, cgRes.Adja2Vx.Value, cgRes.Adja2Vy.Value, cgRes.Adja2Vz.Value };
|
|
@@ -596,7 +714,7 @@ namespace XdCxRhDW.Api
|
|
|
/// <returns></returns>
|
|
|
public static double[] X2_PosDtoDfo(CgRes cgRes, StationRes sRes, bool CalcConfidence = false)
|
|
|
{
|
|
|
- if (cgRes.Dto1.Value == 0) return new double[7] { 999, 999, 0, 999, 999, 0, -1};
|
|
|
+ if (cgRes.Dto1.Value == 0) return new double[7] { 999, 999, 0, 999, 999, 0, -1 };
|
|
|
double[] mainSat = new double[6] { cgRes.MainX.Value, cgRes.MainY.Value, cgRes.MainZ.Value, cgRes.MainVx.Value, cgRes.MainVy.Value, cgRes.MainVz.Value };
|
|
|
double[] adjaSat = new double[6] { cgRes.Adja1X.Value, cgRes.Adja1Y.Value, cgRes.Adja1Z.Value, cgRes.Adja1Vx.Value, cgRes.Adja1Vy.Value, cgRes.Adja1Vz.Value };
|
|
|
double[] satStation = new double[3] { sRes.SatTxLon, sRes.SatTxLat, 0 };
|