代码之家  ›  专栏  ›  技术社区  ›  Keith Adler

确定从一个纬度/经度到另一个纬度/经度的罗盘方向

  •  0
  • Keith Adler  · 技术社区  · 14 年前

    是否有人有确定从一个lat/lon到另一个lat/lon方向的算法(伪代码):

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

    航向为西北、西南、东等。

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

    3 回复  |  直到 13 年前
        1
  •  17
  •   Community CDub    7 年前

    This site 具有基本算法:

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

    更新:请参阅此处了解完整的算法 Mapping Math and 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]);
    

    重要的是要注意,当你绕着地球移动时,你的方位确实会改变。上面的算法告诉你 最初的 方位,但是如果你在长途旅行,到达目的地时你的方位会有很大的不同(如果你只是在短途旅行[几百公里],那么它可能不会改变到值得关注的程度)。

        2
  •  2
  •   Lèse majesté    14 年前

    你还记得三角函数吗?即SoCaCtotoa:

    • 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: 正如皮特和迪安指出的,这并没有考虑到地球的曲率。为了更精确地计算远离赤道的点,您需要使用 spherical triangle formulas 在迪恩的回答中使用。

    编辑2: 另一个修正;正如皮特指出的, arctan() 不能给出正确的角度,因为-1/-1和1/1是相同的(如-1/1和1/-1)。 arctan2(y, x) 是的双参数变体 弧() 这是为了弥补这一点。 弧() 范围为(-207_,_],正 y >= 0 和否定的 y < 0 .

        3
  •  0
  •   Jerry Coffin    14 年前

    转换为数值角度并使用结果查找文本。例如,-22.5..+22.5=n..+22.5..67.5=n e,67.5..112.5=e,等等。当然,这是假设您只使用n、n e、e、s e、s、s w、w、n w——如果您决定(例如)使用旧的“罗盘32点”,那么每个文本字符串显然代表一个较小的范围。