From http://www.movable-type.co.uk/scripts/latlong.html

Bearing

In general, your current heading will vary as you follow a great circle path (orthodrome); the final heading will differ from the initial heading by varying degrees according to distance and latitude (if you were to go from say 35°N,45°E (Baghdad) to 35°N,135°E (Osaka), you would start on a heading of 60° and end up on a heading of 120°!).

This formula is for the initial bearing (sometimes referred to as forward azimuth) which if followed in a straight line along a great-circle arc will take you from the start point to the end point:

Formula: ? = atan2( sin(?long).cos(lat2),

cos(lat1).sin(lat2) ? sin(lat1).cos(lat2).cos(?long) )

JavaScript:

var y = Math.sin(dLon) * Math.cos(lat2);

var x = Math.cos(lat1)*Math.sin(lat2) -

Math.sin(lat1)*Math.cos(lat2)*Math.cos(dLon);

var brng = Math.atan2(y, x).toDeg();

Excel: =ATAN2(COS(lat1)*SIN(lat2)-SIN(lat1)*COS(lat2)*COS(lon2-lon1),

SIN(lon2-lon1)*COS(lat2))

* Note that Excel reverses the arguments to ATAN2 - see notes below

Since atan2 returns values in the range -? ... +? (that is, -180° ... +180°), to normalise the result to a compass bearing (in the range 0° ... 360°, with -ve values transformed into the range 180° ... 360°), convert to degrees and then use (?+360) % 360, where % is modulo.