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]));