Objective C / iPhone comparing 2 CLLocations /GPS coordinates

Kiksy picture Kiksy · Mar 19, 2010 · Viewed 9.5k times · Source

have an app that finds your GPS location successfully, but I need to be able to compare that GPS with a list of GPS locations, if both are the same , then you get a bonus.

I thought I had it working, but it seems not.

I have 'newLocation' as the location where you are, I think the problem is that I need to be able to seperate the long and lat data of newLocation.

So far ive tried this:

NSString *latitudeVar = [[NSString alloc] initWithFormat:@"%g°", newLocation.coordinate.latitude];

NSString *longitudeVar = [[NSString alloc] initWithFormat:@"%g°", newLocation.coordinate.longitude];

An example of the list of GPS locations:

location:(CLLocation*)newLocation;

CLLocationCoordinate2D bonusOne;    

bonusOne.latitude = 37.331689;
bonusOne.longitude = -122.030731;

and then

if (latitudeVar == bonusOne.latitude && longitudeVar == bonusOne.longitude) {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"infinite loop firday" message:@"infloop" delegate:nil cancelButtonTitle:@"Stinky" otherButtonTitles:nil ];    

    [alert show];
    [alert release];
}

this comes up with an error 'invalid operands to binary == have strut NSstring and CLlocationDegrees'

Any thoughts?

Answer

Claus Broch picture Claus Broch · Mar 19, 2010

Generally you should be careful with comparing floating point numbers directly. Because of the way they are defined, the internal value may not be exactly as you initialize them meaning that they will very seldom be identical. Instead you should check to see if the difference between them are below a certain threshold, for instance

if(fabs(latitude1 - latitude2) <= 0.000001)
...

Another option could be to check how far the person is from the desired location by calculating the distance. This could also take into account the fact that the coordinate from the GPS is not exactly correct, but might differ up to like 10 meters even under good conditions:

CLLocation *loc1 = [[CLLocation alloc] initWithLatitude:lat1 longitude:lon1];
double distance = [loc1 getDistanceFrom:position2];
if(distance <= 10)
...

Claus