Haversine formula to find distance between two points on a sphere
The Haversine formula calculates the shortest distance between two points on a sphere using their latitudes and longitudes measured along the surface. It is important for use in navigation. The haversine can be expressed in trignometric function as:
The haversine of the central angle (which is d/r) is calculated by the following formula:
where r is the radius of earth(6371 km), d is the distance between two points, is latitude of the two points and
is longitude of the two points respectively.
Solving d by applying the inverse haversine or by using the inverse sine function, we get:
or
The distance between Big Ben in London (51.5007° N, 0.1246° W) and The Statue of Liberty in
New York (40.6892° N, 74.0445° W) is 5574.8 km. This is not the exact measurement because the
formula assumes that the Earth is a perfect sphere when in fact it is an oblate spheroid.
Below is the implementation of the above formulae:
C++
// C++ program for the haversine formula // C++ program for the // haversine formula #include <iostream> #include <cmath> 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
<?php // PHP program for the // haversine formula function haversine( $lat1 , $lon1 , $lat2 , $lon2 ) { // distance between latitudes // and longitudes $dLat = ( $lat2 - $lat1 ) * M_PI / 180.0; $dLon = ( $lon2 - $lon1 ) * M_PI / 180.0; // convert to radians $lat1 = ( $lat1 ) * M_PI / 180.0; $lat2 = ( $lat2 ) * M_PI / 180.0; // apply formulae $a = pow(sin( $dLat / 2), 2) + pow(sin( $dLon / 2), 2) * cos ( $lat1 ) * cos ( $lat2 ); $rad = 6371; $c = 2 * asin(sqrt( $a )); return $rad * $c ; } // Driver code $lat1 = 51.5007; $lon1 = 0.1246; $lat2 = 40.6892; $lon2 = 74.0445; echo haversine( $lat1 , $lon1 , $lat2 , $lon2 ) . " K.M." ; // This code is contributed // by Akanksha Rai(Abby_akku) ?> |
5574.840456848555 K.M.
Recommended Posts:
- Find points at a given distance on a line of given slope
- Ways to choose three points with distance between the most distant points <= L
- Hammered distance between N points in a 2-D plane
- Program for distance between two points on earth
- Program to calculate distance between two points
- Program to calculate distance between two points in 3 D
- Check whether it is possible to join two points given on circle such that distance between them is k
- Legendre's formula (Given p and n, find the largest x such that p^x divides n!)
- Find K Closest Points to the Origin
- Find Corners of Rectangle using mid points
- Minimum number of points to be removed to get remaining points on one side of axis
- Steps required to visit M points in order on a circular ring of N points
- Count of obtuse angles in a circle with 'k' equidistant points between 2 given points
- Find whether only two parallel lines contain all coordinates points or not
- Program to find line passing through 2 Points
If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.