|
@@ -15,7 +15,7 @@ namespace XdCxRhDW.Api
|
|
|
public static class PosApi
|
|
|
{
|
|
|
//置信度统计次数
|
|
|
- private static int confidenceCount = 100;
|
|
|
+ private static int confidenceCount = 10000;
|
|
|
|
|
|
//置信度有效距离(m)
|
|
|
private static int confidenceDistance = 10000;
|
|
@@ -125,7 +125,7 @@ namespace XdCxRhDW.Api
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
- /// 两星一地解析定位(精度差速度快,主要用于置信度分析等需要多次调用的情况)
|
|
|
+ /// 两星一地带参解析定位(精度差速度快,主要用于置信度分析等需要多次调用的情况)
|
|
|
/// </summary>
|
|
|
/// <param name="cgRes"></param>
|
|
|
/// <param name="sRes"></param>
|
|
@@ -149,6 +149,33 @@ namespace XdCxRhDW.Api
|
|
|
DW_Analysis(mainSat, adjaSat, cdbStation, refStation, dto1, -dtoCdb, ybDto, -ybDto1, posRes, 1);
|
|
|
return posRes;
|
|
|
}
|
|
|
+ /// <summary>
|
|
|
+ /// 三星双时差带参解析定位(精度差速度快,主要用于置信度分析等需要多次调用的情况)
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="cgRes"></param>
|
|
|
+ /// <param name="sRes"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public static double[] X3Dto_GzPos(CgRes cgRes, StationRes sRes)
|
|
|
+ {
|
|
|
+ if (cgRes.Dto1.Value == 0 || cgRes.Dto2.Value == 0)
|
|
|
+ {
|
|
|
+ return new double[7] { 999, 999, 0, 999, 999, 0, 100 };
|
|
|
+ }
|
|
|
+ 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 };
|
|
|
+ double[] adja2Sat = new double[3] { cgRes.Adja2X.Value, cgRes.Adja2Y.Value, cgRes.Adja2Z.Value };
|
|
|
+ double[] refStation = new double[3] { sRes.RefLon.Value, sRes.RefLat.Value, 0 };
|
|
|
+ double dto1 = cgRes.Dto1.Value / 1e6;
|
|
|
+ double dto2 = cgRes.Dto2.Value / 1e6;
|
|
|
+ double ybDto1 = cgRes.YbMainDto.Value / 1e6;
|
|
|
+ double ybDto2 = cgRes.YbAdja1Dto.Value / 1e6;
|
|
|
+ double ybDto3 = cgRes.YbAdja2Dto.Value / 1e6;
|
|
|
+ double refDto1 = ybDto1 - ybDto2;
|
|
|
+ double refDto2 = ybDto1 - ybDto3;
|
|
|
+ double[] posRes = new double[3];
|
|
|
+ DW_Analysis(mainSat, adja1Sat, adja2Sat, refStation, dto1, dto2, refDto1, refDto2, posRes, 0);
|
|
|
+ return posRes;
|
|
|
+ }
|
|
|
|
|
|
/// <summary>
|
|
|
/// 两星一地带参,返回经度、纬度、高度、镜像点、置信度,数组长度为7
|
|
@@ -177,36 +204,42 @@ 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);//精确搜索值
|
|
|
-
|
|
|
- var posResGz = X2D1_GzPos(cgRes, sRes);
|
|
|
- if (IsGeoPoint2(posRes) && IsGeoPoint2(posResGz))
|
|
|
+ if (CalcConfidence&& IsGeoPoint2(posRes))
|
|
|
{
|
|
|
- int succeedCount = 0;
|
|
|
- var cgResNew = cgRes.Clone();
|
|
|
- for (int i = 0; i < confidenceCount; i++)
|
|
|
+ var posResGz = X2D1_GzPos(cgRes, sRes);
|
|
|
+ if (IsGeoPoint2(posResGz))
|
|
|
{
|
|
|
- cgResNew.MainX = cgRes.MainX + RandomHelper.Normal(0, 200);
|
|
|
- cgResNew.MainY = cgRes.MainY + RandomHelper.Normal(0, 200);
|
|
|
- cgResNew.MainZ = cgRes.MainZ + RandomHelper.Normal(0, 200);
|
|
|
- cgResNew.Adja1X = cgRes.Adja1X + RandomHelper.Normal(0, 200);
|
|
|
- cgResNew.Adja1Y = cgRes.Adja1Y + RandomHelper.Normal(0, 200);
|
|
|
- cgResNew.Adja1Z = cgRes.Adja1Z + RandomHelper.Normal(0, 200);
|
|
|
- cgResNew.Dto1 = (cgRes.Dto1 * 1e6 + RandomHelper.Normal(0, 1)) / 1e6;
|
|
|
- cgResNew.DtoCdb = (cgRes.DtoCdb * 1e6 + RandomHelper.Normal(0, 1)) / 1e6;
|
|
|
- cgResNew.YbMainDto = (cgRes.YbMainDto * 1e6 + RandomHelper.Normal(0, 1)) / 1e6;
|
|
|
- cgResNew.YbAdja1Dto = (cgRes.YbAdja1Dto * 1e6 + RandomHelper.Normal(0, 1)) / 1e6;
|
|
|
- res = X2D1_GzPos(cgResNew, sRes);
|
|
|
- var posResNew = ConvertToGeoPoint(res);
|
|
|
- if (IsGeoPoint2(posResNew))
|
|
|
+ int succeedCount = 0;
|
|
|
+ var cgResNew = cgRes.Clone();
|
|
|
+ for (int i = 0; i < confidenceCount; i++)
|
|
|
{
|
|
|
- var distance = PhysicsHelper.DistanceGeo((posResGz[0], posResGz[1], 0), (posResNew[0], posResNew[1], 0));
|
|
|
- if (distance <= confidenceDistance)
|
|
|
+ cgResNew.MainX = cgRes.MainX + RandomHelper.Normal(0, 500);
|
|
|
+ cgResNew.MainY = cgRes.MainY + RandomHelper.Normal(0, 500);
|
|
|
+ cgResNew.MainZ = cgRes.MainZ + RandomHelper.Normal(0, 500);
|
|
|
+ cgResNew.Adja1X = cgRes.Adja1X + RandomHelper.Normal(0, 500);
|
|
|
+ cgResNew.Adja1Y = cgRes.Adja1Y + RandomHelper.Normal(0, 500);
|
|
|
+ cgResNew.Adja1Z = cgRes.Adja1Z + RandomHelper.Normal(0, 500);
|
|
|
+ cgResNew.Dto1 = (cgRes.Dto1 * 1e6 + RandomHelper.Normal(0, 4)) / 1e6;
|
|
|
+ cgResNew.DtoCdb = (cgRes.DtoCdb * 1e6 + RandomHelper.Normal(0, 4)) / 1e6;
|
|
|
+ cgResNew.YbMainDto = (cgRes.YbMainDto * 1e6 + RandomHelper.Normal(0, 4)) / 1e6;
|
|
|
+ cgResNew.YbAdja1Dto = (cgRes.YbAdja1Dto * 1e6 + RandomHelper.Normal(0, 4)) / 1e6;
|
|
|
+ res = X2D1_GzPos(cgResNew, sRes);
|
|
|
+ var posResNew = ConvertToGeoPoint(res);
|
|
|
+ if (IsGeoPoint2(posResNew))
|
|
|
{
|
|
|
- succeedCount++;
|
|
|
+ var distance = PhysicsHelper.DistanceGeo((posResGz[0], posResGz[1], 0), (posResNew[0], posResNew[1], 0));
|
|
|
+ if (distance <= confidenceDistance)
|
|
|
+ {
|
|
|
+ succeedCount++;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+ posRes[6] = (int)(succeedCount / (double)confidenceCount * 100);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ posRes[6] = 0;
|
|
|
}
|
|
|
- posRes[6] = (int)(succeedCount / (double)confidenceCount * 100);
|
|
|
}
|
|
|
return posRes;
|
|
|
}
|
|
@@ -368,49 +401,47 @@ namespace XdCxRhDW.Api
|
|
|
double[] res = new double[6];
|
|
|
X3_Pos20240305_Core(mainSat, adjaSat1, adjaSat2, satStation, satStation, satStation, satStation,
|
|
|
satStation, satStation, refStation, zone, tarDto1, tarDto2, refDto1, refDto2, res);
|
|
|
- ConvertToGeoPoint(res);
|
|
|
- var posRes = ConvertToGeoPoint(res);
|
|
|
+ var posRes = ConvertToGeoPoint(res);//精确搜索值
|
|
|
if (CalcConfidence && IsGeoPoint2(posRes))
|
|
|
{
|
|
|
- int succeedCount = 0;
|
|
|
- for (int i = 0; i < confidenceCount; i++)
|
|
|
+ var posResGz = X3Dto_GzPos(cgRes, sRes);
|
|
|
+ if (IsGeoPoint2(posResGz))
|
|
|
{
|
|
|
- var mainSatNew = new double[3]
|
|
|
- {
|
|
|
- cgRes.MainX.Value+RandomHelper.Normal(0,200),
|
|
|
- cgRes.MainY.Value+RandomHelper.Normal(0,200),
|
|
|
- cgRes.MainZ.Value+RandomHelper.Normal(0,200)
|
|
|
-
|
|
|
- };
|
|
|
- var adjaSat1New = new double[3]
|
|
|
- {
|
|
|
- cgRes.Adja1X.Value+RandomHelper.Normal(0,200),
|
|
|
- cgRes.Adja1Y.Value+RandomHelper.Normal(0,200),
|
|
|
- cgRes.Adja1Z.Value+RandomHelper.Normal(0,200)
|
|
|
- };
|
|
|
- var adjaSat2New = new double[3]
|
|
|
+ int succeedCount = 0;
|
|
|
+ var cgResNew = cgRes.Clone();
|
|
|
+ for (int i = 0; i < confidenceCount; i++)
|
|
|
{
|
|
|
- cgRes.Adja2X.Value+RandomHelper.Normal(0,200),
|
|
|
- cgRes.Adja2Y.Value+RandomHelper.Normal(0,200),
|
|
|
- cgRes.Adja2Z.Value+RandomHelper.Normal(0,200)
|
|
|
- };
|
|
|
- var tarDto1New = (tarDto1 * 1e6 + RandomHelper.Normal(0, 1)) / 1e6;
|
|
|
- var tarDto2New = (tarDto2 * 1e6 + RandomHelper.Normal(0, 1)) / 1e6;
|
|
|
- var refDto1New = (refDto1 * 1e6 + RandomHelper.Normal(0, 1)) / 1e6;
|
|
|
- var refDto2New = (refDto2 * 1e6 + RandomHelper.Normal(0, 1)) / 1e6;
|
|
|
-
|
|
|
- X3_Pos20240305_Core(mainSatNew, adjaSat1New, adjaSat2New, satStation, satStation, satStation, satStation, satStation, satStation, refStation, zone, tarDto1New, tarDto2New, refDto1New, refDto2New, res);
|
|
|
- var posResNew = ConvertToGeoPoint(res);
|
|
|
- if (IsGeoPoint2(posResNew))
|
|
|
- {
|
|
|
- var distance = PhysicsHelper.DistanceGeo((posRes[0], posRes[1], 0), (posResNew[0], posResNew[1], 0));
|
|
|
- if (distance <= confidenceDistance)
|
|
|
+ cgResNew.MainX = cgRes.MainX + RandomHelper.Normal(0, 500);
|
|
|
+ cgResNew.MainY = cgRes.MainY + RandomHelper.Normal(0, 500);
|
|
|
+ cgResNew.MainZ = cgRes.MainZ + RandomHelper.Normal(0, 500);
|
|
|
+ cgResNew.Adja1X = cgRes.Adja1X + RandomHelper.Normal(0, 500);
|
|
|
+ cgResNew.Adja1Y = cgRes.Adja1Y + RandomHelper.Normal(0, 500);
|
|
|
+ cgResNew.Adja1Z = cgRes.Adja1Z + RandomHelper.Normal(0, 500);
|
|
|
+ cgResNew.Adja2X = cgRes.Adja2X + RandomHelper.Normal(0, 500);
|
|
|
+ cgResNew.Adja2Y = cgRes.Adja2Y + RandomHelper.Normal(0, 500);
|
|
|
+ cgResNew.Adja2Z = cgRes.Adja2Z + RandomHelper.Normal(0, 500);
|
|
|
+ cgResNew.Dto1 = (cgRes.Dto1 * 1e6 + RandomHelper.Normal(0, 4)) / 1e6;
|
|
|
+ cgResNew.Dto2 = (cgRes.Dto2 * 1e6 + RandomHelper.Normal(0, 4)) / 1e6;
|
|
|
+ cgResNew.YbMainDto = (cgRes.YbMainDto * 1e6 + RandomHelper.Normal(0, 4)) / 1e6;
|
|
|
+ cgResNew.YbAdja1Dto = (cgRes.YbAdja1Dto * 1e6 + RandomHelper.Normal(0, 4)) / 1e6;
|
|
|
+ cgResNew.YbAdja2Dto = (cgRes.YbAdja2Dto * 1e6 + RandomHelper.Normal(0, 4)) / 1e6;
|
|
|
+ res = X3Dto_GzPos(cgResNew, sRes);
|
|
|
+ var posResNew = ConvertToGeoPoint(res);
|
|
|
+ if (IsGeoPoint2(posResNew))
|
|
|
{
|
|
|
- succeedCount++;
|
|
|
+ var distance = PhysicsHelper.DistanceGeo((posResGz[0], posResGz[1], 0), (posResNew[0], posResNew[1], 0));
|
|
|
+ if (distance <= confidenceDistance)
|
|
|
+ {
|
|
|
+ succeedCount++;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+ posRes[6] = (int)(succeedCount / (double)confidenceCount * 100);
|
|
|
}
|
|
|
- posRes[6] = (int)(succeedCount / (double)confidenceCount * 100);
|
|
|
+ else
|
|
|
+ {
|
|
|
+ posRes[6] = 0;
|
|
|
+ }
|
|
|
}
|
|
|
return posRes;
|
|
|
}
|
|
@@ -627,7 +658,7 @@ namespace XdCxRhDW.Api
|
|
|
{
|
|
|
if (res == null || res.Length == 0)
|
|
|
{
|
|
|
- return new double[7] { 999, 999, 0, 999, 999, 0, 100 };
|
|
|
+ return new double[7] { 999, 999, 0, 999, 999, 0, -1 };
|
|
|
}
|
|
|
else if (res.Length != 3 && res.Length != 6)
|
|
|
{
|
|
@@ -637,7 +668,7 @@ namespace XdCxRhDW.Api
|
|
|
var list = res.Select(p => Math.Round(p, 4)).ToArray();
|
|
|
if (list.Length == 3)
|
|
|
{
|
|
|
- list = list.Concat(new double[4] { 999, 999, 0, 100 }).ToArray();
|
|
|
+ list = list.Concat(new double[4] { 999, 999, 0, -1 }).ToArray();
|
|
|
}
|
|
|
list[2] = list[5] = 0;//高度
|
|
|
|
|
@@ -668,7 +699,7 @@ namespace XdCxRhDW.Api
|
|
|
if (list.Length == 6)
|
|
|
{
|
|
|
var listNew = list.ToList();
|
|
|
- listNew.Add(100);
|
|
|
+ listNew.Add(-1);
|
|
|
list = listNew.ToArray();
|
|
|
}
|
|
|
return list;
|