views:

6459

answers:

9

Duplicate:

I need to calculate the distance between two points given by two coordinates. The project I am working on is a Java-project, so Java-code will be great, but pseudo-code can also be given, then I can implement it myself :)

As you probably know, there are three ways to represent coordinates:

  • Degrees:Minutes:Seconds (49°30'00"N, 123°30'00"W)
  • Degrees:Decimal Minutes (49°30.0', -123°30.0'), (49d30.0m,-123d30.0')
  • Decimal Degrees (49.5000°,-123.5000°), generally with 4-6 decimal numbers.

It's the third way my coordinates are given in, so the code for this values will be preferred :)

A: 

Take a look at this latitude/longitude distance calculator. It has a link to relevant source code (including an explanation) and a link to the math behind the calculation.

It's actually pretty interesting.

lc
A: 

This site shows you the formula which is the part I assume you are having trouble with? You might want to specify if you want a straight line from point A to point B (through Earth) or if you want the distance as presented on the site. I'm sorry I don't exactly recall their names. However, the code seems relatively straightforward.

nevets1219
A: 

I used the code from this site successfully:

I had to make some calculations on the answers to make it into european meters, but that was pretty straight forward :)

Espenhh
+5  A: 

Based on another question on stackoverflow, I got this code.. This calculates the result in meters, not in miles :)

 public static float distFrom(float lat1, float lng1, float lat2, float lng2) {
    double earthRadius = 3958.75;
    double dLat = Math.toRadians(lat2-lat1);
    double dLng = Math.toRadians(lng2-lng1);
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
               Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
               Math.sin(dLng/2) * Math.sin(dLng/2);
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    double dist = earthRadius * c;

    int meterConversion = 1609;

    return new Float(dist * meterConversion).floatValue();
    }
Espenhh
Why convert to Float and then back to float?
Steve Kuo
`return (float) (dist * meterConversion)`
mobrule
A: 

Take a look at GeoTools' org.geotools.referencing.GeodeticCalculator. Set the starting and ending position then get call getOrthodromicDistance() which returns the orthodromic (great circle) distance.

Steve Kuo
A: 

If you understand mathematical formulas then this page should be more than enough to calculate distance between two points in any programming language. http://en.wikipedia.org/wiki/Geographical_distance

jan
A: 

hi..

ive got a similar problem.. infact its the opposite..i have calculated a distance in meters along the ground. The origin of the distance is known in terms of decimal degrees.. now i need to know the lat . long at the other end..

should i simply multiply the meter value with 0.00005 to convert into decimal degree or is ther a better way?

im also working in java!

A: 

In C++ it is done like this:

#define LOCAL_PI 3.1415926535897932385 

double ToRadians(double degrees) 
{
  double radians = degrees * LOCAL_PI / 180;
  return radians;
}

double DirectDistance(double lat1, double lng1, double lat2, double lng2) 
{
  double earthRadius = 3958.75;
  double dLat = ToRadians(lat2-lat1);
  double dLng = ToRadians(lng2-lng1);
  double a = sin(dLat/2) * sin(dLat/2) + 
             cos(ToRadians(lat1)) * cos(ToRadians(lat2)) * 
             sin(dLng/2) * sin(dLng/2);
  double c = 2 * atan2(sqrt(a), sqrt(1-a));
  double dist = earthRadius * c;
  double meterConversion = 1609.00;
  return dist * meterConversion;
}
jessn