Calculate angle between two Latitude/Longitude points

后端 未结 17 1373
故里飘歌
故里飘歌 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:38

    For those who use C/C++, below is the tested code:

    static const auto PI = 3.14159265358979323846, diameterOfEarthMeters = 6371.0 * 2 * 1000;
    
    double degreeToRadian (double degree) { return (degree * PI / 180); };
    double radianToDegree (double radian) { return (radian * 180 / PI); };
    
    double CoordinatesToAngle (const double latitude1,
                               const double longitude1,
                               const double latitude2,
                               const double longitude2)
    {
      const auto longitudeDifferenceRadians = degreeToRadian(longitude2 - longitude1);
      auto latitude1Radian = degreeToRadian(latitude1),
           latitude2Radian = degreeToRadian(latitude2);
    
      const auto x = std::cos(latitude1Radian) * std::sin(latitude2Radian) -
                     std::sin(latitude1Radian) * std::cos(latitude2Radian) *
                     std::cos(longitudeDifferenceRadians);
      const auto y = std::sin(longitudeDifferenceRadians) * std::cos(latitude2Radian);
    
      return radianToDegree(std::atan2(y, x));
    }
    
    double CoordinatesToMeters (const double latitude1,
                                const double longitude1,
                                const double latitude2,
                                const double longitude2)
    {
      auto latitude1Radian = degreeToRadian(latitude1),
           longitude1Radian = degreeToRadian(longitude1),
           latitude2Radian = degreeToRadian(latitude2),
           longitude2Radian = degreeToRadian(longitude2);
      auto x = std::sin((latitude2Radian - latitude1Radian) / 2),
           y = std::sin((longitude2Radian - longitude1Radian) / 2);
    
      return diameterOfEarthMeters *
             std::asin(std::sqrt((x * x) +
                                 (std::cos(latitude1Radian) * std::cos(latitude2Radian) * y * y)));
    }
    

提交回复
热议问题