Search code examples
gpslatitude-longitude

Calculate distance in (x, y) between two GPS-Points


I'm looking for a smooth way to calculate the distance between two GPS Points, so I get the result like: "You have to go x meters up and y meters to the left - so I can work with a 2d-coordinate system, where I have my position as (0,0) and the other positions is showing the distance in (x, y) in meters from my position.

My idea was to calculate the distance between the points using the haversine formula. (This returns my hypotenuse)

In addition to that, I'm calculating the bearing between this two points. This is my alpha.

With this two values, I wanted to use basic trigonometry functions to resolve my problem.

So I tried to calculate:catheti_1 = sin(alpha) * hypotenuse, catheti_2 = cos(alpha) * hypotenuse.

Maybe I'm doing something wrong, but my results are useless at the moment.

So my question is: How can I calculate the distance in x and y direction between two GPS points?

I'm calculating alpha in the following procedure:

public static double bearingTo(GPSBean point1, GPSBean point2) {
    double lat1 = Math.toRadians(point1.latitude);
    double lat2 = Math.toRadians(point2.latitude);
    double lon1 = Math.toRadians(point1.longitude);
    double lon2 = Math.toRadians(point2.longitude);

    double deltaLong = lon2 - lon1;

    double y = Math.sin(deltaLong) * Math.cos(lat2);
    double x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1)
            * Math.cos(lat2) * Math.cos(deltaLong);
    double bearing = Math.atan2(y, x);

    return (Math.toDegrees(bearing) + 360) % 360;
}

Solution

  • I just implemented your code, using approximate coordinates of NYC and Boston as reference points, and implementing the Haversine formula as found at http://www.movable-type.co.uk/scripts/latlong.html (which you didn't show):

    long1 = -71.02; lat1 = 42.33;
    long2 = -73.94; lat2 = 40.66;
    
    lat1 *=pi/180;
    lat2 *=pi/180;
    long1*=pi/180;
    long2*=pi/180;
    
    dlong = (long2 - long1);
    dlat  = (lat2 - lat1);
    
    // Haversine formula:
    R = 6371;
    a = sin(dlat/2)*sin(dlat/2) + cos(lat1)*cos(lat2)*sin(dlong/2)*sin(dlong/2)
    c = 2 * atan2( sqrt(a), sqrt(1-a) );
    d = R * c;
    

    When I run this code, I get d = 306, which agrees with the answer from the above site.

    For the bearing I get 52 deg - again, close to what the site gave.

    Without seeing the rest of your code it's hard to know why your answer is different.

    Note: when the two points are close together, you could make all kinds of approximations, but this code should still work - the formula has good numerical stability because it's using the sin of the difference between longitudes, latitudes (rather than the difference of the sin).

    Addendum:

    Using your code for x, y (in your question), I get sensible values for the distance - agreeing with the "proper" answer to within 120 m (which isn't bad since one is a straight line approximation and the other follows the curvature of the earth). So I think your code is basically OK now you fixed the typo.