javascripthaversine

Using the Haversine Formula in Javascript


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!


Solution

  • 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