3

有没有人有一种算法来确定从一个纬度/经度到另一个纬度的方向(伪代码):

CalculateHeading( lat1, lon1, lat2, long2 ) returns string heading

其中航向是例如 NW、SW、E 等。

基本上,我在地图上有两个点,考虑到东 50 英里和北 1 英里只是东而不是东北,我想大致了解方向。

4

3 回答 3

20

该站点具有基本算法:

// 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]);

重要的是要注意,当您在地球上移动时,您的方位实际上会发生变化。上面的算法显示了您的初始方位,但是如果您长途旅行,当您到达目的地时,您的方位会显着不同(如果您只是短距离行驶 [< 几百公里] 那么它可能会赢变化不足以引起关注)。

于 2010-07-09T04:56:34.270 回答
2

你还记得你的三角函数吗?即索哈托亚:

  • SOH : Sin(θ) = 斜边的对边
  • CAH : Cos(θ) = 在斜边上相邻
  • TOA : Tan(θ) = 对边超过相邻

在伪代码中:

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 >= 0y < 0

于 2010-07-09T04:51:37.553 回答
1

转换为数字角度并使用结果查找文本。例如,-22.5..+22.5 = N. +22.5..67.5 = NE、67.5..112.5 = E 等。当然,这是假设您只使用 N、NE、E、SE、S、SW , W, NW - 如果您决定(例如)使用旧的“指南针的 32 点”,则每个文本字符串显然代表一个较小的范围。

于 2010-07-09T04:51:52.487 回答