How do I calculate the Azimuth (angle to north) between two WGS84 coordinates

后端 未结 6 2121
被撕碎了的回忆
被撕碎了的回忆 2020-12-25 09:52

I have got two WGS84 coordinates, latitude and longitude in degrees. These points are rather close together, e.g. only one metre apart.

Is there an easy way to calcu

相关标签:
6条回答
  • 2020-12-25 10:06

    Has anyone tested this? It does not return the correct answers

    This function assumes that you're on a flat surface. With the small distances that you've mentioned this is all fine, but if you're going to be calculating the heading between cities all over the world you might want to look into something that takes the shape of the earth in count;

    Your flat earth has little to do with this. The error, as you call it, is because you are calculating an initial azimuth from a point. Unless you are heading straight to a pole, you relationship to the pole will change with distance. Regardless, the above program does not return correct results.

    0 讨论(0)
  • 2020-12-25 10:17

    This would work only for small differences. Otherwise you can't just "latitudinalDifference / longitudinalDifference".

    0 讨论(0)
  • 2020-12-25 10:20

    Here is the C# solution. Tested for 0, 45, 90, 135, 180, 225, 270 and 315 angles.

    Edit I replaced my previous ugly solution, by the C# translation of Wouter's solution:

    public double GetAzimuth(LatLng destination)
    {
        var longitudinalDifference = destination.Lng - this.Lng;
        var latitudinalDifference = destination.Lat - this.Lat;
        var azimuth = (Math.PI * .5d) - Math.Atan(latitudinalDifference / longitudinalDifference);
        if (longitudinalDifference > 0) return azimuth;
        else if (longitudinalDifference < 0) return azimuth + Math.PI;
        else if (latitudinalDifference < 0) return Math.PI;
        return 0d;
    }
    
    public double GetDegreesAzimuth(LatLng destination)
    {
        return RadiansToDegreesConversionFactor * GetAzimuth(destination);
    }
    
    0 讨论(0)
  • 2020-12-25 10:20

    I found this link

    http://williams.best.vwh.net/avform.htm

    given in the answer to

    Lat/Lon + Distance + Heading --> Lat/Lon

    This looks promising, especially the flat earth approximation given near the end.

    0 讨论(0)
  • 2020-12-25 10:21

    I would recommend implementing a correction factor based on the longitude. I implemented a simular routine once to return all geocoded records within x miles of a specific spot and ran into simular issues. Unfortunately I don't have the code anymore, and can't seem to recall how I got to the correction number but you are on the right track.

    0 讨论(0)
  • 2020-12-25 10:22

    The formulas that you refer to in the text are to calculate the great circle distance between 2 points. Here's how I calculate the angle between points:

    uses Math, ...;
    ...
    
    const
      cNO_ANGLE=-999;
    
    ...
    
    function getAngleBetweenPoints(X1,Y1,X2,Y2:double):double;
    var
      dx,dy:double;
    begin
      dx := X2 - X1;
      dy := Y2 - Y1;
    
      if (dx > 0) then  result := (Pi*0.5) - ArcTan(dy/dx)   else
      if (dx < 0) then  result := (Pi*1.5) - ArcTan(dy/dx)   else
      if (dy > 0) then  result := 0                          else
      if (dy < 0) then  result := Pi                         else
                        result := cNO_ANGLE; // the 2 points are equal
    
      result := RadToDeg(result);
    end;
    
    • Remember to handle the situation where 2 points are equal (check if the result equals cNO_ANGLE, or modify the function to throw an exception);

    • This function assumes that you're on a flat surface. With the small distances that you've mentioned this is all fine, but if you're going to be calculating the heading between cities all over the world you might want to look into something that takes the shape of the earth in count;

    • It's best to provide this function with coordinates that are already mapped to a flat surface. You could feed WGS84 Latitude directly into Y (and lon into X) to get a rough approximation though.

    0 讨论(0)
提交回复
热议问题