从 n 海里的角度定位坐标
Locate coordinate from angle from n nautical miles
我正在尝试从地图上查找 D 处的坐标。
从 C 到 D 的直线需要与直线 A 和 B 成 90 度。
坐标D必须与坐标C相距n海里,坐标C可以在A和B之间的任意位置。
我正在使用 C# 使用命名空间 System.Data.Spatial 来生成 DbGeometry 数据。
我正在处理的数据是这样的 133043N1443814E 到 133515N1443710E 然后顺时针在以 133416N1445256E 为中心的 15.3 海里弧上到原点
其他数据样本在 FAA 网站 http://tfr.faa.gov/save_pages/detail_8_2189.html
谢谢,
在将 sql 标记添加到您的问题之前,您需要了解所需的计算。您还没有完全准备好接受 sql 服务器帮助,您首先需要逻辑帮助,然后是数学帮助。
您已在插图中将 C 的位置标记为 1/2 方向,但是与线 AB 成 90 度的位置可能比直接在中间位置更高或更低。在您定义所有要求之后,您的问题中也没有提及它,然后转到数学帮助。
一旦你有了等式,然后显示你计划在 SQL 服务器或 C# 中使用的代码,以及你计划首先在哪里执行代码的 'heavy lifting'。然后社区可以提供帮助。
我确实认为这是一个非常有趣的问题并且会引起注意。
例如,可以按如下方式进行:
- 使用此 formula
找到点 A
和 B
之间的航向(方位角)
- 通过这个formula求出连接
A
和B
的大圆截面的中点(中点为f=0.5
)
- 固定上一步得到的点,调整第一步得到的方位角(减去pi/2模2*pi),就可以calculate需要的点D规定的距离
如果事先指定了C
点,则可以跳过第2步,直接在第3步中使用这个点,连同第1步计算出的调整航向
//Example with mutliple coordinates before creating an arc. AREA DEFINED AS 133830N1450807E TO 132836N1444449E TO 133043N1443814E TO 133515N1443710E THEN CLOCKWISE ON A 15.3 NM ARC CENTERED ON 133416N1445256E TO THE POINT OF ORIGIN
//Abbreviation
// a
// b
// m(midangle) (cx,cy,ax,ay,bx,by)
// x(lat)
// y(long)
//Xc=latitude provided in text for center point
//Yc=longitude provided in text for center point
//point is the last point
var startPointStr = generateCircleLine[generateCircleLine.Length - 1].Split(' ');
var startPoint = new TfrXY { LngX = Convert.ToDouble(startPointStr[0]), LatY = Convert.ToDouble(startPointStr[1]) };
//point before the last point
var stopPointStr = generateCircleLine[generateCircleLine.Length - 2].Split(' ');
var stopPoint = new TfrXY { LngX = Convert.ToDouble(stopPointStr[0]), LatY = Convert.ToDouble(stopPointStr[1]) };
var centerPoint = new TfrXY { LngX = Convert.ToDouble(centerPointStr[0]), LatY = Convert.ToDouble(centerPointStr[1]) };
var a = Math.Atan2(stopPoint.LatY- centerPoint.LatY, stopPoint.LngX-centerPoint.LngX);
var b = Math.Atan2(startPoint.LatY-centerPoint.LatY, startPoint.LngX-centerPoint.LngX);
var m = MidAngle(centerPoint.LngX, centerPoint.LatY, startPoint.LngX, startPoint.LatY, stopPoint.LngX, stopPoint.LatY);
var d = Math.Sqrt(
Math.Pow(Convert.ToDouble(centerPointStr[0]) - startPoint.LngX, 2) +
Math.Pow(Convert.ToDouble(centerPointStr[1]) - startPoint.LatY, 2) );
var ym = (centerPoint.LatY) +( d * Math.Sin(m));
var xm = (centerPoint.LngX) + (d * Math.Cos(m));
The latidude and longitude would be ym and xml
You will also need to use this function.
/// <summary>
/// Find mid angle
/// </summary>
/// <param name="cx">center point longitude</param>
/// <param name="cy">center point latitude</param>
/// <param name="ax">Starting point longitude </param>
/// <param name="ay">Starting point latitude</param>
/// <param name="bx">Stopping point longitude</param>
/// <param name="by">Stopping point latitude</param>
/// <returns></returns>
public static double MidAngle(double cx, double cy, double ax, double ay, double bx, double by)
{
var a = Math.Atan2(ay - cy, ax - cx);
var b = Math.Atan2(by - cy, bx - cy);
//Fixing infinite loop issue
if ((ax == cx) && (ay > cy))
a = Math.PI / 2.0;
else if ((ax == cx) && (ay <= cy))
a = -Math.PI / 2.0;
else
a = Math.Atan2(ay - cy, ax - cx);
if ((bx == cx) && (by > cy))
b = Math.PI / 2.0;
else if ((bx == cx) && (by <= cy))
b = -Math.PI / 2.0;
else
b = Math.Atan2(by - cy, bx - cx);
var delta = a - b;
while (delta < 0)
{
delta += 2 * Math.PI;
}
return a - (delta / 2);
}
我正在尝试从地图上查找 D 处的坐标。
从 C 到 D 的直线需要与直线 A 和 B 成 90 度。
坐标D必须与坐标C相距n海里,坐标C可以在A和B之间的任意位置。
我正在使用 C# 使用命名空间 System.Data.Spatial 来生成 DbGeometry 数据。
我正在处理的数据是这样的 133043N1443814E 到 133515N1443710E 然后顺时针在以 133416N1445256E 为中心的 15.3 海里弧上到原点
其他数据样本在 FAA 网站 http://tfr.faa.gov/save_pages/detail_8_2189.html
谢谢,
在将 sql 标记添加到您的问题之前,您需要了解所需的计算。您还没有完全准备好接受 sql 服务器帮助,您首先需要逻辑帮助,然后是数学帮助。
您已在插图中将 C 的位置标记为 1/2 方向,但是与线 AB 成 90 度的位置可能比直接在中间位置更高或更低。在您定义所有要求之后,您的问题中也没有提及它,然后转到数学帮助。
一旦你有了等式,然后显示你计划在 SQL 服务器或 C# 中使用的代码,以及你计划首先在哪里执行代码的 'heavy lifting'。然后社区可以提供帮助。
我确实认为这是一个非常有趣的问题并且会引起注意。
例如,可以按如下方式进行:
- 使用此 formula 找到点
- 通过这个formula求出连接
A
和B
的大圆截面的中点(中点为f=0.5
) - 固定上一步得到的点,调整第一步得到的方位角(减去pi/2模2*pi),就可以calculate需要的点D规定的距离
A
和 B
之间的航向(方位角)
如果事先指定了C
点,则可以跳过第2步,直接在第3步中使用这个点,连同第1步计算出的调整航向
//Example with mutliple coordinates before creating an arc. AREA DEFINED AS 133830N1450807E TO 132836N1444449E TO 133043N1443814E TO 133515N1443710E THEN CLOCKWISE ON A 15.3 NM ARC CENTERED ON 133416N1445256E TO THE POINT OF ORIGIN
//Abbreviation
// a
// b
// m(midangle) (cx,cy,ax,ay,bx,by)
// x(lat)
// y(long)
//Xc=latitude provided in text for center point
//Yc=longitude provided in text for center point
//point is the last point
var startPointStr = generateCircleLine[generateCircleLine.Length - 1].Split(' ');
var startPoint = new TfrXY { LngX = Convert.ToDouble(startPointStr[0]), LatY = Convert.ToDouble(startPointStr[1]) };
//point before the last point
var stopPointStr = generateCircleLine[generateCircleLine.Length - 2].Split(' ');
var stopPoint = new TfrXY { LngX = Convert.ToDouble(stopPointStr[0]), LatY = Convert.ToDouble(stopPointStr[1]) };
var centerPoint = new TfrXY { LngX = Convert.ToDouble(centerPointStr[0]), LatY = Convert.ToDouble(centerPointStr[1]) };
var a = Math.Atan2(stopPoint.LatY- centerPoint.LatY, stopPoint.LngX-centerPoint.LngX);
var b = Math.Atan2(startPoint.LatY-centerPoint.LatY, startPoint.LngX-centerPoint.LngX);
var m = MidAngle(centerPoint.LngX, centerPoint.LatY, startPoint.LngX, startPoint.LatY, stopPoint.LngX, stopPoint.LatY);
var d = Math.Sqrt(
Math.Pow(Convert.ToDouble(centerPointStr[0]) - startPoint.LngX, 2) +
Math.Pow(Convert.ToDouble(centerPointStr[1]) - startPoint.LatY, 2) );
var ym = (centerPoint.LatY) +( d * Math.Sin(m));
var xm = (centerPoint.LngX) + (d * Math.Cos(m));
The latidude and longitude would be ym and xml
You will also need to use this function.
/// <summary>
/// Find mid angle
/// </summary>
/// <param name="cx">center point longitude</param>
/// <param name="cy">center point latitude</param>
/// <param name="ax">Starting point longitude </param>
/// <param name="ay">Starting point latitude</param>
/// <param name="bx">Stopping point longitude</param>
/// <param name="by">Stopping point latitude</param>
/// <returns></returns>
public static double MidAngle(double cx, double cy, double ax, double ay, double bx, double by)
{
var a = Math.Atan2(ay - cy, ax - cx);
var b = Math.Atan2(by - cy, bx - cy);
//Fixing infinite loop issue
if ((ax == cx) && (ay > cy))
a = Math.PI / 2.0;
else if ((ax == cx) && (ay <= cy))
a = -Math.PI / 2.0;
else
a = Math.Atan2(ay - cy, ax - cx);
if ((bx == cx) && (by > cy))
b = Math.PI / 2.0;
else if ((bx == cx) && (by <= cy))
b = -Math.PI / 2.0;
else
b = Math.Atan2(by - cy, bx - cx);
var delta = a - b;
while (delta < 0)
{
delta += 2 * Math.PI;
}
return a - (delta / 2);
}