有没有人有一种算法来确定从一个纬度/经度到另一个纬度的方向(伪代码):
CalculateHeading( lat1, lon1, lat2, long2 ) returns string heading
其中航向是例如 NW、SW、E 等。
基本上,我在地图上有两个点,考虑到东 50 英里和北 1 英里只是东而不是东北,我想大致了解方向。
有没有人有一种算法来确定从一个纬度/经度到另一个纬度的方向(伪代码):
CalculateHeading( lat1, lon1, lat2, long2 ) returns string heading
其中航向是例如 NW、SW、E 等。
基本上,我在地图上有两个点,考虑到东 50 英里和北 1 英里只是东而不是东北,我想大致了解方向。
该站点具有基本算法:
// in javascript, not hard to translate...
var y = Math.sin(dLon) * Math.cos(lat2);
var x = Math.cos(lat1)*Math.sin(lat2) -
Math.sin(lat1)*Math.cos(lat2)*Math.cos(dLon);
var brng = Math.atan2(y, x).toDeg();
更新:请参阅此处了解完整的算法映射数学和 Javascript
这会给你一个介于 0 到 360 之间的数字,然后只需进行简单的查找即可:
var bearings = ["NE", "E", "SE", "S", "SW", "W", "NW", "N"];
var index = brng - 22.5;
if (index < 0)
index += 360;
index = parseInt(index / 45);
return(bearings[index]);
重要的是要注意,当您在地球上移动时,您的方位实际上会发生变化。上面的算法显示了您的初始方位,但是如果您长途旅行,当您到达目的地时,您的方位会显着不同(如果您只是短距离行驶 [< 几百公里] 那么它可能会赢变化不足以引起关注)。
你还记得你的三角函数吗?即索哈托亚:
在伪代码中:
function getDir(lat1, long1, lat2, long2) {
margin = π/90; // 2 degree tolerance for cardinal directions
o = lat1 - lat2;
a = long1 - long2;
angle = atan2(o,a);
if (angle > -margin && angle < margin):
return "E";
elseif (angle > π/2 - margin && angle < π/2 + margin):
return "N";
elseif (angle > π - margin && angle < -π + margin):
return "W";
elseif (angle > -π/2 - margin && angle < -π/2 + margin):
return "S";
}
if (angle > 0 && angle < π/2) {
return "NE";
} elseif (angle > π/2 && angle < π) {
return "NW";
} elseif (angle > -π/2 && angle < 0) {
return "SE";
} else {
return "SW";
}
}
编辑 1: 正如 Pete 和 Dean 所指出的,这没有考虑到地球的曲率。为了更准确地计算远离赤道的点,您需要使用球面三角形公式,如 Dean's answer 中使用的那样。
编辑2:
另一个更正;正如 Pete 所指出的,arctan()
没有给出正确的角度,因为 -1/-1 和 1/1 是相同的(-1/1 和 1/-1 也是如此)。arctan2(y, x)
是一个两个参数的变体arctan()
,旨在弥补这一点。arctan()
范围为 (-π, π],对于 为正,对于 为y >= 0
负y < 0
。
转换为数字角度并使用结果查找文本。例如,-22.5..+22.5 = N. +22.5..67.5 = NE、67.5..112.5 = E 等。当然,这是假设您只使用 N、NE、E、SE、S、SW , W, NW - 如果您决定(例如)使用旧的“指南针的 32 点”,则每个文本字符串显然代表一个较小的范围。