17

So: I have the following function, adapted from a formula found online, which takes two lat/lon coordinates and finds the distance between them in miles (along a spherical Earth):

public static double distance (double lat1, double lon1, double lat2, double lon2) {
        double theta = toRadians(lon1-lon2);
        lat1 = toRadians(lat1);
        lon1 = toRadians(lon1);
        lat2 = toRadians(lat2);
        lon2 = toRadians(lon2);

        double dist = sin(lat1)*sin(lat2) + cos(lat1)*cos(lat2)*cos(theta);
        dist = toDegrees(acos(dist)) * 60 * 1.1515 * 1.609344 * 1000;

        return dist;
    }

As far as I can tell this works just fine.

What I need is a second function which, using the exact same model of the Earth's geometry, takes a single lat/lon pair [A], a heading, and a distance, and outputs a new lat/lon pair [B] such that if you started at point [A], and traveled the given distance at the given heading, you'd wind up at point [B].

This is where the fact that my geometry skills have left me entirely comes into play :)

Any help would be much appreciated!

Thanks, -Dan

DanM
  • 6,727
  • 11
  • 48
  • 83
  • Dan, Can you please post what you got for the Solution? I am in need and wondered if you actually got the answer? – SpoiledTechie.com Oct 08 '10 at 19:21
  • See the accepted answer. I ended up going with that formula, and it works well; I highly recommend looking at The Aviation Formulary site that the answerer mentions, it was very helpful for me. – DanM Oct 25 '10 at 15:35

1 Answers1

15

I get most of those types of formulas from The Aviation Formulary.

The formula he gives is:

Lat/lon given radial and distance

A point {lat,lon} is a distance d out on the tc radial from point 1 if:

 lat=asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc))
 IF (cos(lat)=0)
    lon=lon1      // endpoint a pole
 ELSE
    lon=mod(lon1-asin(sin(tc)*sin(d)/cos(lat))+pi,2*pi)-pi
 ENDIF 

This algorithm is limited to distances such that dlon < pi/2, i.e those that extend around less than one quarter of the circumference of the earth in longitude. A completely general, but more complicated algorithm is necessary if greater distances are allowed:

    lat =asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc))
     dlon=atan2(sin(tc)*sin(d)*cos(lat1),cos(d)-sin(lat1)*sin(lat))
     lon=mod( lon1-dlon +pi,2*pi )-pi

Note that he's using "tc" to stand for true course (in radians clockwise from North) and the distances he gives are in radians of arc along the surface of the earth. This is explained (along with formulas to convert back and forth from nautical miles) in the first section of the Formulary. Also, check out the "Implementation Notes" and "Worked Examples" on that page.

Pang
  • 8,605
  • 144
  • 77
  • 113
Paul Tomblin
  • 167,274
  • 56
  • 305
  • 392
  • [preparing to lay bare my ignorance of all things geospatial] What exactly does "out on the tc radial" mean? If I went "out on the 90 degree radial", does that mean that I travel East? – DanM Dec 18 '08 at 16:20
  • Yes. Sorry, much of the terminology on the page is aviation related. You should read the first part of the page where he explains that the angles and distances are in radians, too. – Paul Tomblin Dec 18 '08 at 16:25
  • 1
    "tc" stands for "true course". Also check out that page's "worked examples" and "implementation notes". – Paul Tomblin Dec 18 '08 at 16:27
  • Dan, did you get a function for the second thing? I am in desperate need for one! – Lee Armstrong Sep 03 '09 at 20:09
  • What is `d` measured in? According to the page it looks like it's measured in radians, but how does that make sense? What would you use if you wanted a distance in meters? – devios1 May 27 '15 at 18:11
  • Nevermind I found http://stackoverflow.com/questions/25138862/converting-earth-kilometers-to-radians-in-php which makes it easy. :) – devios1 May 27 '15 at 18:14