Calculate distance between pins on a map using Javascript
Updated by Tom Wells on
Calculating the distance between pins or markers on a map? It sounds complicated, right? Well, it is. But, thankfully, there is a well-known and tested formula for calculating this called the haversine formula. This formula uses latitudes and longitudes to determine the distance between two points on a sphere (in our case, the Earth!) using trigonometry. In this tutorial, we'll see how we can apply this formula using javascript in a performant way.
There is a small caveat in this case. The Earth is not a perfect sphere (it is, in fact, an oblate spheroid) so the formula is using the mean radius.
The function
The distanceBetween
function below implements the haversine formula in a single function:
const distanceBetween = (lat1, long1, lat2, long2) => {
// Earth's radius in metres (mean radius = 6,371km)
const radius = 6371e3
// Angles need to be radians to pass trig functions!
const lat1Radian = (lat1 * Math.PI) / 180
const lat2Radian = (lat2 * Math.PI) / 180
const latDelta = ((lat2 - lat1) * Math.PI) / 180
const longDelta = ((long2 - long1) * Math.PI) / 180
// The square of half the chord length between the points
const a =
Math.sin(latDelta / 2) * Math.sin(latDelta / 2) +
Math.cos(lat1Radian) *
Math.cos(lat2Radian) *
Math.sin(longDelta / 2) *
Math.sin(longDelta / 2)
// Angular distance in radians
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
// Distance is the radius * angular distance
const distance = radius * c
return distance
}
The above function accepts two sets of latitudes and longitudes and calculates the distance between them in metres. To change the unit of distance, simply change the radius
value. For example, kilometres would be 6371
.
How it works
At this point, the internals of the function likely looks a bit like witchcraft. But, the function can be broken down fairly easily:
- The value of
radius
is the mean radius of the Earth in the distance unit of choice (in this case, metres). - The second variables "block" calculates the radian values of the latitudes along with the deltas of the latitudes and longitudes.
- The
a
variable is the square of half the chord length between the points. The "chord length" is a line segment connecting any two points on the circumference of a circle. To get this value, we use some trigonometry functions. - The
c
variable is the angular distance in radians. - Finally, the radius is multiplied by the angular distance in radians to return the distance in the distance unit of choice.
I realise there is some advanced mathematics (or at least, advanced to me!) involved, but it's merely a case of breaking down the haversine formula into workable chunks in javascript. Any formula can be converted using the built-in Javascript Math functions with relative ease, and the functions themselves provide reliable performance and precision.
Wrapping up
That about covers the haversine formula and how to implement it in Javascript. Feel free to copy the function into your own code, it works well with both Google Maps and Mapbox, allowing you to display the distance between two markers.
I hope you found this useful and if you have any questions, don't hesitate to contact me on Twitter.