Calculate angle between two Latitude/Longitude points

后端 未结 17 1369
故里飘歌
故里飘歌 2020-12-07 17:51

Is there a way to calculate angle between two Latitude/Longitude points?

What I am trying to achieve is to know where the user is heading. For example, user is head

17条回答
  •  自闭症患者
    2020-12-07 18:32

    To provide heading you have to compute bearing.

    To understand bearing read this article.

    According to this article (section bearing) the formula is :

    θ = atan2( sin Δλ ⋅ cos φ2 , cos φ1 ⋅ sin φ2 − sin φ1 ⋅ cos φ2 ⋅ cos Δλ )
    where φ1, λ1 is the start point, 
          φ2, λ2 the end point,
          Δλ is the difference in longitude`
    

    Here's a sample on how to compute the angle (in degrees) between two points expressed in Lat/Lon. (done in C#)

    Let's say Point is a simple class with two double attributes X (for longitude) and Y (for latitude).

    public double ComputeBearing(Point start,Point end)
    {
         var φ1 = start.Y; //latitude 1
         var λ1 = start.X; //longitude 1
         var φ2 = end.Y; //latitude 2
         var λ2 = end.X; //longitude 2
    
         var y = Math.Sin(this.degreeToRadian(λ2 - λ1)) * Math.Cos(this.degreeToRadian(φ2));
         var x = Math.Cos(this.degreeToRadian(φ1)) * Math.Sin(this.degreeToRadian(φ2)) - Math.Sin(this.degreeToRadian(φ1)) * Math.Cos(this.degreeToRadian(φ2)) * Math.Cos(this.degreeToRadian(λ2 - λ1));
    
         var θ = Math.Atan2(y, x);
         θ = this.radianToDegree(θ);
    
         return θ;
    }
    

    Using the following methods :

    public double degreeToRadian(double angle)
    {
        return Math.PI * angle / 180.0;
    }
    
    public double radianToDegree(double angle)
    {
        return angle * (180.0 / Math.PI);
    }
    

    By using ComputeBearing you will easily get an angle expressed in degrees easily usable as heading

提交回复
热议问题