计算两个纬度/经度点之间的角度

pra*_*ian 28 math google-maps

有没有办法计算两个纬度/经度点之间的角度?

我想要实现的是知道用户前进的方向.例如,用户正在前往北,南,......东南等.

但我只有两点(Lng/Ltd)

谢谢

Nay*_*pte 41

使用 referance计算角度:

private double angleFromCoordinate(double lat1, double long1, double lat2,
        double long2) {

    double dLon = (long2 - long1);

    double y = Math.sin(dLon) * Math.cos(lat2);
    double x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1)
            * Math.cos(lat2) * Math.cos(dLon);

    double brng = Math.atan2(y, x);

    brng = Math.toDegrees(brng);
    brng = (brng + 360) % 360;
    brng = 360 - brng; // count degrees counter-clockwise - remove to make clockwise

    return brng;
}
Run Code Online (Sandbox Code Playgroud)

  • 由于纬度和经度通常以度数表示,因此在使用此功能之前不要忘记将它们转换为弧度. (9认同)
  • 适合我,没有brng = 360 - brng; (6认同)
  • 这个网站来检查你的答案:https://www.igismap.com/map-tool/bearing-angle (3认同)

Дар*_*йко 21

你可以使用谷歌地图computeHeading:

var point1 = new google.maps.LatLng(lat1, lng1);
var point2 = new google.maps.LatLng(lat2, lng2);
var heading = google.maps.geometry.spherical.computeHeading(point1,point2);
Run Code Online (Sandbox Code Playgroud)

  • 使用谷歌地图进行简单的三角函数似乎有点大材小用。 (4认同)

Dot*_*tPi 10

计算两点之间角度(方位)的通用公式如下:

? = atan2(sin(?long)*cos(lat2), cos(lat1)*sin(lat2) ? sin(lat1)*cos(lat2)*cos(?long))
Run Code Online (Sandbox Code Playgroud)

请注意,在使用此公式之前,角度(θ)应转换为弧度,Δlong= long2 - long1.

atan2是几乎所有编程语言中常见的函数(主要在Math包/库中).通常还有用于度和弧度之间转换的函数(也在Math包/库中).

请记住,atan2返回-π... +π范围内的值,要将结果转换为罗盘方位,需要将θ乘以180 /π然后使用(θ+ 360)%360,其中%是模数除法操作返回除法的其余部分.

以下链接是涉及纬度和经度的公式的良好资源.他们还提供其公式的Javascript实现.实际上,这个答案是基于这个页面的信息:

http://www.yourhomenow.com/house/haversine.html

  • 截至 2019 年 12 日,链接已失效 (2认同)

Ren*_*cha 6

在 Javascript 中,我创建了一个函数名称angleFromCoordinate,其中我传递了两个 lat/lng。此函数将返回两个纬度/经度之间的天使

function angleFromCoordinate(lat1,lon1,lat2,lon2) {
    var p1 = {
        x: lat1,
        y: lon1
    };

    var p2 = {
        x: lat2,
        y: lon2
    };
    // angle in radians
    var angleRadians = Math.atan2(p2.y - p1.y, p2.x - p1.x);
    // angle in degrees
    var angleDeg = Math.atan2(p2.y - p1.y, p2.x - p1.x) * 180 / Math.PI;
    console.log(angleDeg);
    return angleDeg;
}
Run Code Online (Sandbox Code Playgroud)

工作代码片段

function angleFromCoordinate(lat1,lon1,lat2,lon2) {
    var p1 = {
        x: lat1,
        y: lon1
    };

    var p2 = {
        x: lat2,
        y: lon2
    };
    // angle in radians
    var angleRadians = Math.atan2(p2.y - p1.y, p2.x - p1.x);
    // angle in degrees
    var angleDeg = Math.atan2(p2.y - p1.y, p2.x - p1.x) * 180 / Math.PI;
    console.log(angleDeg);
    return angleDeg;
}
Run Code Online (Sandbox Code Playgroud)
function angleFromCoordinate(lat1,lon1,lat2,lon2) {
    var p1 = {
        x: lat1,
        y: lon1
    };

    var p2 = {
        x: lat2,
        y: lon2
    };
    // angle in radians
    var angleRadians = Math.atan2(p2.y - p1.y, p2.x - p1.x);
    // angle in degrees
    var angleDeg = Math.atan2(p2.y - p1.y, p2.x - p1.x) * 180 / Math.PI;

    document.getElementById('rotation').innerHTML ="Rotation : "+ angleDeg;
    return angleDeg;
    
}
     angleFromCoordinate(37.330604,-122.028947,37.3322109,-122.0329665);
Run Code Online (Sandbox Code Playgroud)


nbe*_*hat 5

基于Nayanesh Gupte的答案,这是一个Python实现,用于在需要时如何计算由其经度和纬度定义的两个点之间的角度:

def angleFromCoordinate(lat1, long1, lat2, long2):
    dLon = (long2 - long1)

    y = math.sin(dLon) * math.cos(lat2)
    x = math.cos(lat1) * math.sin(lat2) - math.sin(lat1) * math.cos(lat2) * math.cos(dLon)

    brng = math.atan2(y, x)

    brng = math.degrees(brng)
    brng = (brng + 360) % 360
    brng = 360 - brng # count degrees clockwise - remove to make counter-clockwise

    return brng
Run Code Online (Sandbox Code Playgroud)

0度角表示朝北。


Hig*_*ark 1

我想你想要大圆方位的计算。

  • @praethorian:我想你想要大圆轴承的计算。 (5认同)