📜  Haversine公式,用于查找球体上两点之间的距离

📅  最后修改于: 2021-05-06 19:52:09             🧑  作者: Mango

Haversine公式使用沿曲面测量的纬度和经度来计算球体上两个点之间的最短距离。这对于导航很重要。半正矢可以trignometric函数来表示:
haversine(\theta)=sin^2\Big(\frac{\theta}{2}\Big)

中心角的haversine(d / r)通过以下公式计算:

\largehaversine\Big(\frac{d}{r}\Big)=haversine(\Phi_2-\Phi_1)+ cos(\Phi_1)cos(\Phi_2)haversine(\lambda_2-\lambda_1)
其中r是地球半径(6371 km),d是两点之间的距离, \phi_1, \phi_2是这两点的纬度, \lambda_1, \lambda_2是两个点的经度。

通过应用反正弦或使用反正弦函数来求解d,我们得到:

d = r hav^{-1}(h) = 2r sin^{-1}(\sqrt{h})

或者

d = 2r sin^{-1}\bigg(\sqrt{sin^2\Big(\frac{\Phi_2-\Phi_1}{2}\Big)+cos(\Phi_1)cos(\Phi_2)sin^2\Big(\frac{\lambda_2-\lambda_1}{2}\Big)}\ \bigg)

伦敦大笨钟(51.5007°N,0.1246°W)到伦敦自由女神像之间的距离
纽约(40.6892°N,74.0445°W)是5574.8公里。这不是精确的度量,因为
公式假设地球是一个完美的球体,而实际上它是一个扁球形。

下面是上述公式的实现:

C++
// C++ program for the haversine formula
// C++ program for the
// haversine formula
#include 
#include 
using namespace std;
  
static double haversine(double lat1, double lon1,
                        double lat2, double lon2)
    {
        // distance between latitudes
        // and longitudes
        double dLat = (lat2 - lat1) *
                      M_PI / 180.0;
        double dLon = (lon2 - lon1) * 
                      M_PI / 180.0;
  
        // convert to radians
        lat1 = (lat1) * M_PI / 180.0;
        lat2 = (lat2) * M_PI / 180.0;
  
        // apply formulae
        double a = pow(sin(dLat / 2), 2) + 
                   pow(sin(dLon / 2), 2) * 
                   cos(lat1) * cos(lat2);
        double rad = 6371;
        double c = 2 * asin(sqrt(a));
        return rad * c;
    }
  
// Driver code
int main()
{
    double lat1 = 51.5007;
    double lon1 = 0.1246;
    double lat2 = 40.6892;
    double lon2 = 74.0445;
      
    cout << haversine(lat1, lon1,
                      lat2, lon2) << " K.M.";
    return 0;
}
  
// This code is contributed
// by Mahadev.


Java
// Java program for the haversine formula
public class Haversine {
  
    static double haversine(double lat1, double lon1,
                            double lat2, double lon2)
    {
        // distance between latitudes and longitudes
        double dLat = Math.toRadians(lat2 - lat1);
        double dLon = Math.toRadians(lon2 - lon1);
  
        // convert to radians
        lat1 = Math.toRadians(lat1);
        lat2 = Math.toRadians(lat2);
  
        // apply formulae
        double a = Math.pow(Math.sin(dLat / 2), 2) + 
                   Math.pow(Math.sin(dLon / 2), 2) * 
                   Math.cos(lat1) * 
                   Math.cos(lat2);
        double rad = 6371;
        double c = 2 * Math.asin(Math.sqrt(a));
        return rad * c;
    }
  
    // Driver Code
    public static void main(String[] args)
    {
        double lat1 = 51.5007;
        double lon1 = 0.1246;
        double lat2 = 40.6892;
        double lon2 = 74.0445;
        System.out.println(haversine(lat1, lon1, lat2, lon2) + " K.M.");
    }
}


Python 3
# Python 3 program for the 
# haversine formula
import math
  
# Python 3 program for the
# haversine formula
def haversine(lat1, lon1, lat2, lon2):
      
    # distance between latitudes
    # and longitudes
    dLat = (lat2 - lat1) * math.pi / 180.0
    dLon = (lon2 - lon1) * math.pi / 180.0
  
    # convert to radians
    lat1 = (lat1) * math.pi / 180.0
    lat2 = (lat2) * math.pi / 180.0
  
    # apply formulae
    a = (pow(math.sin(dLat / 2), 2) + 
         pow(math.sin(dLon / 2), 2) * 
             math.cos(lat1) * math.cos(lat2));
    rad = 6371
    c = 2 * math.asin(math.sqrt(a))
    return rad * c
  
# Driver code
if __name__ == "__main__":
    lat1 = 51.5007
    lon1 = 0.1246
    lat2 = 40.6892
    lon2 = 74.0445
      
    print(haversine(lat1, lon1,lat2, lon2), "K.M.")
  
# This code is contributed 
# by ChitraNayal


C#
// C# program for the haversine formula
using System;
class GFG
{
  
static double haversine(double lat1, double lon1,
                        double lat2, double lon2)
{
    // distance between latitudes and longitudes
    double dLat = (Math.PI / 180) * (lat2 - lat1);
    double dLon = (Math.PI / 180) * (lon2 - lon1);
  
    // convert to radians
    lat1 = (Math.PI / 180) * (lat1);
    lat2 = (Math.PI / 180) * (lat2);
  
    // apply formulae
    double a = Math.Pow(Math.Sin(dLat / 2), 2) + 
               Math.Pow(Math.Sin(dLon / 2), 2) * 
               Math.Cos(lat1) * Math.Cos(lat2);
    double rad = 6371;
    double c = 2 * Math.Asin(Math.Sqrt(a));
    return rad * c;
}
  
// Driver Code
public static void Main()
{
    double lat1 = 51.5007;
    double lon1 = 0.1246;
    double lat2 = 40.6892;
    double lon2 = 74.0445;
    Console.WriteLine(haversine(lat1, lon1, 
                                lat2, lon2) + " K.M.");
}
}
  
// This code is contributed 
// by Akanksha Rai(Abby_akku)


PHP


输出:
5574.840456848555 K.M.