Calculate Distance Between Two Latitude-longitude Points? (Haversine Formula)


Answer :

This link might be helpful to you, as it details the use of the Haversine formula to calculate the distance.

Excerpt:

This script [in Javascript] calculates great-circle distances between the two points – that is, the shortest distance over the earth’s surface – using the ‘Haversine’ formula.

function getDistanceFromLatLonInKm(lat1,lon1,lat2,lon2) {   var R = 6371; // Radius of the earth in km   var dLat = deg2rad(lat2-lat1);  // deg2rad below   var dLon = deg2rad(lon2-lon1);    var a =      Math.sin(dLat/2) * Math.sin(dLat/2) +     Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *      Math.sin(dLon/2) * Math.sin(dLon/2)     ;    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));    var d = R * c; // Distance in km   return d; }  function deg2rad(deg) {   return deg * (Math.PI/180) } 

I needed to calculate a lot of distances between the points for my project, so I went ahead and tried to optimize the code, I have found here. On average in different browsers my new implementation runs 2 times faster than the most upvoted answer.

function distance(lat1, lon1, lat2, lon2) {   var p = 0.017453292519943295;    // Math.PI / 180   var c = Math.cos;   var a = 0.5 - c((lat2 - lat1) * p)/2 +            c(lat1 * p) * c(lat2 * p) *            (1 - c((lon2 - lon1) * p))/2;    return 12742 * Math.asin(Math.sqrt(a)); // 2 * R; R = 6371 km } 

You can play with my jsPerf and see the results here.

Recently I needed to do the same in python, so here is a python implementation:

from math import cos, asin, sqrt, pi  def distance(lat1, lon1, lat2, lon2):     p = pi/180     a = 0.5 - cos((lat2-lat1)*p)/2 + cos(lat1*p) * cos(lat2*p) * (1-cos((lon2-lon1)*p))/2     return 12742 * asin(sqrt(a)) #2*R*asin... 

And for the sake of completeness: Haversine on wiki.


Here is a C# Implementation:

static class DistanceAlgorithm {     const double PIx = 3.141592653589793;     const double RADIUS = 6378.16;      /// <summary>     /// Convert degrees to Radians     /// </summary>     /// <param name="x">Degrees</param>     /// <returns>The equivalent in radians</returns>     public static double Radians(double x)     {         return x * PIx / 180;     }      /// <summary>     /// Calculate the distance between two places.     /// </summary>     /// <param name="lon1"></param>     /// <param name="lat1"></param>     /// <param name="lon2"></param>     /// <param name="lat2"></param>     /// <returns></returns>     public static double DistanceBetweenPlaces(         double lon1,         double lat1,         double lon2,         double lat2)     {         double dlon = Radians(lon2 - lon1);         double dlat = Radians(lat2 - lat1);          double a = (Math.Sin(dlat / 2) * Math.Sin(dlat / 2)) + Math.Cos(Radians(lat1)) * Math.Cos(Radians(lat2)) * (Math.Sin(dlon / 2) * Math.Sin(dlon / 2));         double angle = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));         return angle * RADIUS;     }  } 

Comments

Popular posts from this blog

Are Regular VACUUM ANALYZE Still Recommended Under 9.1?

Can Feynman Diagrams Be Used To Represent Any Perturbation Theory?