Latitude and Longitude

Soldato
Joined
5 May 2004
Posts
4,465
Location
Northern Ireland
Any know how to work out a 0.25 mile radius from a given Latitude/Longitude ?

E.g Lat 54.513907 long-6.048489 I would like to work out a 0.25mile radius around this point.

I know there is the Haversine formula but isn't that the distance between to points?

Any help is most greatful.

Blackvault
 
What do you mean by "work out"? Get a map and draw a 0.25 mile circle around the point???

HAHA, sorry I should have explained that it's for a project that I'm developing (not school/uni/work) and want to alert someone when they get in range of a given GPS point.

Blackvault
 
then you just want to be calculating their current linear distance from the point and when it is less than 0.25 it will alert.
 
then you just want to be calculating their current linear distance from the point and when it is less than 0.25 it will alert.

Oh right so Havsine comes into play then? So point A - point B = distance
if distance is less than 0.25 then sound my alert.

I was more under the impression that I needed to define a circle around my given point and work off that but I'll give it a go.

Regards

Blackvault
 
Oh right so Havsine comes into play then? So point A - point B = distance
if distance is less than 0.25 then sound my alert.

I was more under the impression that I needed to define a circle around my given point and work off that but I'll give it a go.

You have your fixed-point location [x ,y]
also your current position [a, b]

The distance between the two is sqrt( (a-x)^2 + (b-y)^2 ).

If this distance is less than your 0.25 miles, then you are within range and your alert is activated. Just compute the separation from the fixed location at any point.
 
Oh right so Havsine comes into play then? So point A - point B = distance
if distance is less than 0.25 then sound my alert.

I was more under the impression that I needed to define a circle around my given point and work off that but I'll give it a go.

Regards

Blackvault
How were you planning on representing this circle? :confused:
in data terms a circle is just a set distance from a point, so to know whether something is inside or outside of the circle the only way is to compare the distance to the circle radius.
 
You have your fixed-point location [x ,y]
also your current position [a, b]

The distance between the two is sqrt( (a-x)^2 + (b-y)^2 ).

If this distance is less than your 0.25 miles, then you are within range and your alert is activated. Just compute the separation from the fixed location at any point.

Epic mate that should do me! I'll give it a go at lunch time when I'm on a break.

Thanks

Blackvault
 
You may find the computeDistanceAndBearing method definition in the Android Location class useful. See http://android.git.kernel.org/?p=pl...=location/java/android/location/Location.java.

Code:
 private static void computeDistanceAndBearing(double lat1, double lon1,
        double lat2, double lon2, float[] results) {
        // Based on http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf
        // using the "Inverse Formula" (section 4)

        int MAXITERS = 20;
        // Convert lat/long to radians
        lat1 *= Math.PI / 180.0;
        lat2 *= Math.PI / 180.0;
        lon1 *= Math.PI / 180.0;
        lon2 *= Math.PI / 180.0;

        double a = 6378137.0; // WGS84 major axis
        double b = 6356752.3142; // WGS84 semi-major axis
        double f = (a - b) / a;
        double aSqMinusBSqOverBSq = (a * a - b * b) / (b * b);

        double L = lon2 - lon1;
        double A = 0.0;
        double U1 = Math.atan((1.0 - f) * Math.tan(lat1));
        double U2 = Math.atan((1.0 - f) * Math.tan(lat2));

        double cosU1 = Math.cos(U1);
        double cosU2 = Math.cos(U2);
        double sinU1 = Math.sin(U1);
        double sinU2 = Math.sin(U2);
        double cosU1cosU2 = cosU1 * cosU2;
        double sinU1sinU2 = sinU1 * sinU2;

        double sigma = 0.0;
        double deltaSigma = 0.0;
        double cosSqAlpha = 0.0;
        double cos2SM = 0.0;
        double cosSigma = 0.0;
        double sinSigma = 0.0;
        double cosLambda = 0.0;
        double sinLambda = 0.0;

        double lambda = L; // initial guess
        for (int iter = 0; iter < MAXITERS; iter++) {
            double lambdaOrig = lambda;
            cosLambda = Math.cos(lambda);
            sinLambda = Math.sin(lambda);
            double t1 = cosU2 * sinLambda;
            double t2 = cosU1 * sinU2 - sinU1 * cosU2 * cosLambda;
            double sinSqSigma = t1 * t1 + t2 * t2; // (14)
            sinSigma = Math.sqrt(sinSqSigma);
            cosSigma = sinU1sinU2 + cosU1cosU2 * cosLambda; // (15)
            sigma = Math.atan2(sinSigma, cosSigma); // (16)
            double sinAlpha = (sinSigma == 0) ? 0.0 :
                cosU1cosU2 * sinLambda / sinSigma; // (17)
            cosSqAlpha = 1.0 - sinAlpha * sinAlpha;
            cos2SM = (cosSqAlpha == 0) ? 0.0 :
                cosSigma - 2.0 * sinU1sinU2 / cosSqAlpha; // (18)

            double uSquared = cosSqAlpha * aSqMinusBSqOverBSq; // defn
            A = 1 + (uSquared / 16384.0) * // (3)
                (4096.0 + uSquared *
                 (-768 + uSquared * (320.0 - 175.0 * uSquared)));
            double B = (uSquared / 1024.0) * // (4)
                (256.0 + uSquared *
                 (-128.0 + uSquared * (74.0 - 47.0 * uSquared)));
            double C = (f / 16.0) *
                cosSqAlpha *
                (4.0 + f * (4.0 - 3.0 * cosSqAlpha)); // (10)
            double cos2SMSq = cos2SM * cos2SM;
            deltaSigma = B * sinSigma * // (6)
                (cos2SM + (B / 4.0) *
                 (cosSigma * (-1.0 + 2.0 * cos2SMSq) -
                  (B / 6.0) * cos2SM *
                  (-3.0 + 4.0 * sinSigma * sinSigma) *
                  (-3.0 + 4.0 * cos2SMSq)));

            lambda = L +
                (1.0 - C) * f * sinAlpha *
                (sigma + C * sinSigma *
                 (cos2SM + C * cosSigma *
                  (-1.0 + 2.0 * cos2SM * cos2SM))); // (11)

            double delta = (lambda - lambdaOrig) / lambda;
            if (Math.abs(delta) < 1.0e-12) {
                break;
            }
        }

        float distance = (float) (b * A * (sigma - deltaSigma));
        results[0] = distance;
        if (results.length > 1) {
            float initialBearing = (float) Math.atan2(cosU2 * sinLambda,
                cosU1 * sinU2 - sinU1 * cosU2 * cosLambda);
            initialBearing *= 180.0 / Math.PI;
            results[1] = initialBearing;
            if (results.length > 2) {
                float finalBearing = (float) Math.atan2(cosU1 * sinLambda,
                    -sinU1 * cosU2 + cosU1 * sinU2 * cosLambda);
                finalBearing *= 180.0 / Math.PI;
                results[2] = finalBearing;
            }
        }
    }
 
Back
Top Bottom