I'm trying to use the Haversine Distance Formula (as found here: http://www.movable-type.co.uk/scripts/latlong.html) but I can't get it to work, please see the following code
function test() {
var lat2 = 42.741;
var lon2 = -71.3161;
var lat1 = 42.806911;
var lon1 = -71.290611;
var R = 6371; // km
//has a problem with the .toRad() method below.
var dLat = (lat2-lat1).toRad();
var dLon = (lon2-lon1).toRad();
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) *
Math.sin(dLon/2) * Math.sin(dLon/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;
alert(d);
}
And the error is:
Uncaught TypeError: Object -0.06591099999999983 has no method 'toRad'
Which I understand to be because it needs to do the following:
Number.prototype.toRad = function() {
return this * Math.PI / 180;
}
But when I put this below the function, it still comes back with the same error message. How do I make it use the helper method? Or is there an alternative way to code this to get it to work? Thanks!
This code is working:
const d = haversineDistanceKM(42.806911, -71.290611, 42.741, -71.3161);
alert(d);
function haversineDistanceKM(lat1Deg, lon1Deg, lat2Deg, lon2Deg) {
function toRad(degree) {
return degree * Math.PI / 180;
}
const lat1 = toRad(lat1Deg);
const lon1 = toRad(lon1Deg);
const lat2 = toRad(lat2Deg);
const lon2 = toRad(lon2Deg);
const { sin, cos, sqrt, atan2 } = Math;
const R = 6371; // earth radius in km
const dLat = lat2 - lat1;
const dLon = lon2 - lon1;
const a = sin(dLat / 2) * sin(dLat / 2)
+ cos(lat1) * cos(lat2)
* sin(dLon / 2) * sin(dLon / 2);
const c = 2 * atan2(sqrt(a), sqrt(1 - a));
const d = R * c;
return d; // distance in km
}
Notice how I defined x1 and x2. Play with it at: https://tinker.io/3f794