Polar distance and bearing

by Adam Granger

JavaScript

function newPointFromRangeBearing(p1, d, brg) {

    var R = 6371000; // metres
    var lon1 = p1[0].toRadians();
    var lat1 = p1[1].toRadians();

    var lat2 = Math.asin(Math.sin(lat1) * Math.cos(d / R) + Math.cos(lat1) * Math.sin(d / R) * Math.cos(brng));
    var lon2 = lon1 + Math.atan2(Math.sin(brng) * Math.sin(d / R) * Math.cos(lat1),
    Math.cos(d / R) - Math.sin(lat1) * Math.sin(lat2));
    return [lon2, lat2];
}

function polarDistanceAndBearing(p1, p2) {


    var R = 6371000; // metres
    var lon1 = p1[0].toRadians();
    var lat1 = p1[1].toRadians();
    var lon2 = p2[0].toRadians();
    var lat2 = p2[1].toRadians();

    var dlat = (lat2 - lat1).toRadians();
    var dlon = (lon2 - lon1).toRadians();

    var y = Math.sin(lon2 - lon1) * Math.cos(lat2);
    var x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1);
    var brng = Math.atan2(y, x).toDegrees();

    var a = Math.sin(dlat / 2) * Math.sin(dlat / 2) + Math.cos(lat1) * Math.cos(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;

    return [d, brng];
}

console.log(polarDistanceAndBearing([52, -2], [53, -1]));