Get lat/long given current point, distance and bearing

While searching the web, I've encountered the following formulas for calculating the destination point P2's location given the source point P1 = (lat1,long1), the distance from it & the bearing:

lat2 = math.asin( math.sin(lat1)*math.cos(d/R) +
math.cos(lat1)*math.sin(d/R)*math.cos(brng))

lon2 = lon1 + math.atan2(math.sin(brng)*math.sin(d/R)*math.cos(lat1),
math.cos(d/R)-math.sin(lat1)*math.sin(lat2))

Where P2=(lat2,lon2).

I was trying to develop the math behind it but could not really get it right

Can someone please show me how to develop the lat2 & lon2 mathematically?

• So you want to know the theory behind the equations? Perhaps see Rapp's Geometric Geodesy Part I and Part II. If that's what you are looking for, let me know so I can turn this into an answer. – mkennedy Feb 19 at 23:31
• Thank you very much mkennedy, for the links, but Gabriel De Luca's answer solved my problem. – Jo muller Feb 22 at 6:48

This is not a map of the Earth. This is a map of a spheric world, whose Radius = 1 (dimensionless).

In this map, a spheric triangle was drawn.
The vertices of the triangle are:

N North pole.
1 Start point of a travel.
2 End point of a travel.

The travel was started with initial azimuth alpha_1, and traveled a distance s.

The distance, on the unit sphere, is equivalent to the angle covered by the arc traveled, in radians.
If you want to perform your calculations over a sphere of radius R, and travel a distance d, you need to transform:
s = d / R.

lambdaare longitudes, in radians.
phi are latitudes, in radians.

One side of the triangle measures s, and the other two measure the respective collatitudes of the vertices (PI() / 2 - phi).

lambda_1, phi_1, alpha_1 and s are given.

• First, calculate phi_2.

From the Spherical Law of Cosines, we know that:

COS(PI()/2-phi_2 ) = COS(PI()/2-phi_1) * COS(s) + SIN(PI()/2-phi_1) * SIN(s) * COS(alpha_1)

But, whether we remember the trigonometric identity for the cosine of a subtraction, or remember that the sine is the same function as the cosine, out of phase PI()/2:

COS(PI()/2-phi_2) = SIN(phi_2) and COS(PI()/2-phi_1) = SIN(phi_1)

Therefore:

SIN(phi_2) = SIN(phi_1) * COS(s) + COS(phi_1) * SIN(s) * COS(alpha_1)

• Then, calculate lambda_2

The angle at N is lambda_2 - lambda_1, delta_lambda from now.

Write the cosine law for the s side of the triangle.

COS(s) = COS(PI()/2-phi_1) * COS(PI()/2-phi_2) + SIN(PI()/2-phi_1) * SIN(PI()/2-phi_2) * COS(delta_lambda)

Or better:

COS(s) = SIN(phi_1) * SIN(phi_2) + COS(phi_1) * COS(phi_2) * COS(delta_lambda)

Therefore:

COS(delta_lambda) = (COS(s) - SIN(phi_1) * SIN(phi_2)) / (COS(phi_1) * COS(phi2))

Now, write the Spherical Law of Sines that describes the relationship between delta_lambda and s, in terms of the relation between alpha _1 and PI()/2-phi_2:

SIN(delta_lambda) / SIN(s) = SIN(alpha_1) / SIN(PI()/2-phi_2)

Therefore:

SIN(delta_lambda) = SIN(alpha) * SIN(s) / COS(phi_2)

Now, the tangent of delta_lambda:

TAN(delta_lambda) = SIN(delta_lambda) / COS(delta_lambda)

Simplifying on-the-fly:

TAN(delta_lambda) = SIN(alpha_1) * SIN(s) * COS(phi_1) / (COS(s) - SIN(phi_1) * SIN(phi_2))

Finally, write lambda_2 in terms of delta_lambda and lambda_1:

lambda_2 = lambda_1 + delta_lambda

Therefore:

lambda_2 = lambda_1 + ATAN(SIN(alpha_1) * SIN(s) * COS(phi_1) / (COS(s) - SIN(phi_1) * SIN(phi_2)))

Note the ambiguity that the arctangent function returns the same result for opposing arguments, so it must be decided whether to add (or subtract) PI() to its result, based on the quadrant in which the argument is. This ambiguity is solved by the ATAN2 function.

• Got it, thank you very much Gabriel De Luca for the very elaborated explanation. there is one tiny mistake to fix in your explanation: The last term in the phi_2 calculation should be: SIN(phi_2) = SIN(phi_1) * COS(s) + COS(phi_1) * SIN(s) * COS(alpha_1). again thanks a lot. – Jo muller Feb 22 at 6:41
• Edited. You are welcome! – Gabriel De Luca Feb 22 at 14:32