Bearing Between Two Points
Date: 12/19/2001 at 20:32:39 From: Doug Subject: Latitude/Longitude calculations I have found numerous solutions for finding the distance between two Lat/Long points on the earth (including the Haversine Formula), but I can't seem to find a reference that shows how to also calculate the direction between those points. At first blush it seemed easy but there appears to be something I'm missing. Is there an easy way to calculate the "heading" (relative to North = 0)between two coordinates? Thanks. Doug
Date: 12/20/2001 at 16:37:08 From: Doctor Rick Subject: Re: Latitude/Longitude calculations Hi, Doug. My favorite web reference for navigational formulas is this: Aviation Formulary V1.33, by Ed Williams http://williams.best.vwh.net/avform.htm The algorithm it gives for bearing (or course) between two points is this: tc1=mod(atan2(sin(lon2-lon1)*cos(lat2), cos(lat1)*sin(lat2)-sin(lat1)*cos(lat2)*cos(lon2-lon1)), 2*pi) The formula gives the *initial* heading for a great-circle route from point A to point B. The heading will change in the course of the trip. The quantities in the formula have these meanings: lon1 = longitude of point A lat1 = latitude of point A lon2 = longitude of point B lat2 = latitude of point B tc1 = direction of point B from point A (angle east of north) pi = 3.141596... NOTE: The introduction to the Aviation Formulary page says this: "For the convenience of North Americans I will take North latitudes and West longitudes as positive and South and East negative. The longitude is the opposite of the usual mathematical convention." The algorithm as I show it above has been modified to use the usual convention that east longitudes are positive. In the formula, atan2(y,x) is the arctangent, or inverse tangent, of y/x, with the additional feature of deciding which quadrant the angle belongs in, based on the signs of x and y. This is common in computer programming languages. Also, mod(a,2*pi) is the remainder you get when you divide a by 2*pi; that is, subtract the largest multiple of 2*pi less than a from a, and that's the answer. I'll restate the algorithm in a form that makes the quadrant decision explicit (and also covers the cases for dlat and dlon equal to zero), in case you don't have access to an atan2 function. dlat = lat2 - lat1 dlon = lon2 - lon1 y = sin(lon2-lon1)*cos(lat2) x = cos(lat1)*sin(lat2)-sin(lat1)*cos(lat2)*cos(lon2-lon1) if y > 0 then if x > 0 then tc1 = arctan(y/x) if x < 0 then tc1 = 180 - arctan(-y/x) if x = 0 then tc1 = 90 if y < 0 then if x > 0 then tc1 = -arctan(-y/x) if x < 0 then tc1 = arctan(y/x)-180 if x = 0 then tc1 = 270 if y = 0 then if x > 0 then tc1 = 0 if x < 0 then tc1 = 180 if x = 0 then [the 2 points are the same] Thanks to Kalpana who wrote in and helped me correct the original version of this algorithm. - Doctor Rick, The Math Forum http://mathforum.org/dr.math/
Date: 12/20/2001 at 22:47:05 From: Doug Subject: Latitude/Longitude calculations Thanks very much Dr. Rick. I will try the code you've suggested and let you know the result. For your information, it's to be used to calculate current speed and direction from an Acoustic Doppler Current Profiler. Normally the instrument utilizes the ship's gyro to determine direction, but it failed, and I need to use GPS positions at 2-minute intervals to determine the ship's direction. The current speed and direction relative to the ship can then be rotated to real- world coordinates... Doug
Date: 06/15/2002 at 12:18:04 From: Hurle Subject: Your formula for bearing I know how to derive the formula sin(lat2) - sin(lat1)*cos(d) Bearing = acos ---------------------------- sin(d) * cos(lat1) But how did you derive the alternative formula (which does not require the pre-computation of the distance, d) that appears in your archive? Thank you. Hurle of Phoenix (actually "Surprise") Arizona
Date: 06/19/2002 at 08:45:23 From: Doctor Rick Subject: Re: Your formula for bearing Hi, Hurle. I've wanted to get a derivation of the bearing formula into the Archives, but until now our correspondents have been content to get the formula without knowing why it works. Thanks for asking, and motivating me to do the work! Let's define three unit vectors, each in the direction of the line from the center of the earth to a point on the surface: N in the direction of the north pole, A in the direction of the initial point, and B in the direction of the final point on the course. Then the bearing we seek is the angle between the plane containing N and A, and the plane containing A and B. Thus it equals the angle between vectors perpendicular to these planes, namely, NxA and BxA. Let point A have latitude lat1 and longitude 0 (we can rotate our coordinate system so this is true), and let point B have latitude lat2 and longitude dlon (the difference between the actual longitudes of A and B). Then we can calculate NxA and BxA: N = (0, 0, 1) A = (cos(lat1), 0, sin(lat1)) B = (cos(lat2)*cos(dlon), cos(lat2)*sin(dlon), sin(lat2)) NxA = (0, cos(lat1), 0) BxA = (sin(lat1)*cos(lat2)*sin(dlon), cos(lat1)*sin(lat2)-sin(lat1)*cos(lat2)*cos(dlon), -cos(lat1)*cos(lat2)*sin(dlon)) The usual way to find the angle would be to take the dot product of these vectors, divide by the product of the magnitudes of the vectors, and take the arccosine. But that would be quite a mess. Instead we can take advantage of the fact that NxA is parallel to the y axis. The tangent of the angle between BxA and the y axis is the component of BxA in the x-z plane (the square root of the sum of the squares of the x and z components) divided by the y component: tan(theta) = sqrt((sin(lat1)*cos(lat2)*sin(dlon))^2 + (-cos(lat1)*cos(lat2)*sin(dlon))^2) / (cos(lat1)*sin(lat2)-sin(lat1)*cos(lat2)*cos(dlon)) The numerator simplifies to sqrt(cos(lat2)^2 * sin(dlon)^2) * sqrt(sin(lat1)^2 + cos(lat1)^2) = cos(lat2)*sin(dlon) Thus tan(theta) = cos(lat2)*sin(dlon) / (cos(lat1)*sin(lat2)-sin(lat1)*cos(lat2)*cos(dlon)) That's the formula. If we take the arctan of both sides, we get a value in the range from -pi/2 to pi/2 radians. The problem is, this doesn't distinguish between opposite directions, NE vs. SW for instance. But the function atan2(y,x) returns the arctan of y/x with adjustments for the signs of x and y so that the angle returned is the angle of the cartesian point (x,y) in polar coordinates -- just what we need here. The only problem is that it returns a value in the range (-pi, pi]. The function mod(..., 2*pi) moves negative angles up to the range (pi, 2*pi). To get a final answer in degrees (0 to 360), you must multiply by 180/pi. - Doctor Rick, The Math Forum http://mathforum.org/dr.math/
Date: 06/19/2002 at 19:32:37 From: Hurle Subject: Your formula for bearing Thank you very much. I have not found this derivation anywhere else -- you are a wizard, I don't care what the other Math Doctors say about you! Why is this used over the simpler version?
Date: 06/19/2002 at 20:44:33 From: Doctor Rick Subject: Re: Your formula for bearing Hi, Hurle. I believe you're referring to the first version given here: Aviation Formulary V1.33, by Ed Williams http://williams.best.vwh.net/avform.htm#Crs That version is only simpler if you don't count the calculations you had to do to find the distance between the points, which that version uses. Thus that version is better if you need to find the distance as well as the bearing, but if you only needed the bearing, then the formula I derived would be simpler. - Doctor Rick, The Math Forum http://mathforum.org/dr.math/
Date: 06/20/2002 at 09:25:01 From: Hurle Subject: Thank you (Your formula for bearing) You're right. Thanks once again. Hurle
Date: 01/31/2006 at 13:52:18 From: Bruce Subject: spherical trigonometrical bearings for a dumb pilot! Hello! I am a rather unlearned (when compared to others on this site) pilot from South Africa. I am trying to write an Excel sheet that calculates great circle distances and bearings in the context of a logcard. The distance part I got right (as backed up by my helicopter's GPS system), while bearings I just cannot hack. As I am in the Southern and Eastern Hemisphere, that might be causing the problem. Also, I don't know what distance to insert in the formulas (i.e. nm, degrees, etc) and whether to use degrees or radians. I keep getting answers like 708 or 1.257777 which don't equate to bearings. Please help me with an idiot-proof formula, if possible relating to Excel, that I can try out. Thank you in advance!!!
Date: 01/31/2006 at 20:04:12 From: Doctor Rick Subject: Re: spherical trigonometrical bearings for a dumb pilot! Hi, Bruce. The main formula discussed on this page does not require input of the distance between points. (There is a link to a different formula, that does require that input, near the bottom of the page.) tc1 = mod(atan2(sin(lon2-lon1)*cos(lat2), cos(lat1)*sin(lat2)-sin(lat1)*cos(lat2)*cos(lon2-lon1)), 2*pi) A spreadsheet version of this formula is: BearingRad: =MOD(ATAN2(COS(LatA)*SIN(LatB)-SIN(LatA)*COS(LatB) *COS(LongB-LongA), SIN(LongB-LongA)*COS(LatB)), 2*PI()) where I have defined cells containing formulas as follows: LatA: =lat1*pi()/180 LongA: =lon1*pi()/180 LatB: =lat2*pi()/180 LongB: =lon2*pi()/180 and lat1, lon2, lat2, and lon2 are cells containing the coordinates in decimal degrees. It appears that your coordinates are in degrees and decimal minutes, so you'll need to convert them to decimal degrees using formulas like this one: lat1: =lat1deg+lat1min/60*SIGN(lat1deg) The BearingRad formula above gives the bearing in radians. You'll need to convert that to degrees east of north with a formula like this: Bearing: =BearingRad*180/PI() I took these formulas from my own spreadsheet for calculating bearings. If this isn't enough to straighten out your problems, let me know what you do and what you get, so I can check it out. - Doctor Rick, The Math Forum http://mathforum.org/dr.math/
Date: 02/05/2006 at 10:38:17 From: Bruce Subject: Thank you (spherical trigonometrical bearings for a dumb pilot!) Thank you so much Doctor Rick! You are a legend - you really put it so well and in terms that I, the maths wannabe, could understand. Keep up the good work and know you have a loyal fan from the southern hemisphere!!! Bruce
Date: 04/25/2016 at 09:14:26 From: Pedro Subject: Bearing Between Two Points Good morning, Doctor Rick! My name is Pedro Reis. I am a student of 9 semester Eng. Automation and Control. I'm developing a project that aims two antennas in a microwave link, for which I need to know the angle to the North between these points. I would like to use the formula already described above. However, I could not visualize the trigonometry used in the algorithm -- specifically, the definitions y = sin(lon2 - lon1) * cos(Lat2) x = cos(lat1) * sin(lat2) - sin(lat1) * cos(Lat2) * cos(lon2 - lon1) Could you send me a picture or drawing of this trigonometry, or a diagram showing the various vectors mentioned? Thanks for your attention, Pedro Reis
Date: 04/27/2016 at 14:33:40 From: Doctor Rick Subject: Bearing Between Two Points Here is a diagram: This shows a unit sphere. The heavy black circle is the equator; vector N is perpendicular to that (pointing to the north pole). Vectors A and B point toward the points A and B on the earth's surface. A blue arc is drawn between A and B along a great circle. The bearing from A to B is the angle at A between the red arc (north) and the blue arc. Vector NxA is the red vector pointing right; it is perpendicular to the great circle through A and N. Vector BxA is the blue vector pointing down and to the right; it is perpendicular to the great circle through A and B. The angle between NxA and BxA is thus the same as the angle we seek (the bearing from A to B). The rest of the work shown in my derivation of the bearing formula is how to find the tangent of the angle between NxA and BxA, in terms of the vector components of BxA.
Date: 04/29/2016 at 07:21:51 From: Pedro Subject: Thank you (Bearing Between Two Points) Doctor Rick, good morning! Thank you for diagram. It was of great value. I will tell everyone I know about this forum. Gratefully, Pedro Reis
Search the Dr. Math Library:
Ask Dr. MathTM
© 1994- The Math Forum at NCTM. All rights reserved.