Цель C / iPhone, сравнивая 2 CLLocations / GPS-координаты - PullRequest
4 голосов
/ 19 марта 2010

есть приложение, которое успешно находит ваше местоположение GPS, но мне нужно иметь возможность сравнить этот GPS со списком местоположений GPS, если оба они совпадают, вы получите бонус.

Я думал, что это работает, но, похоже, нет.

У меня 'newLocation' в качестве места, где вы находитесь, я думаю, проблема в том, что мне нужно иметь возможность разделять данные long и lat для newLocation.

Пока я пробовал это:

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

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

Пример списка местоположений GPS:

location:(CLLocation*)newLocation;

CLLocationCoordinate2D bonusOne;    

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

, а затем

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];
}

это приводит к ошибке 'недопустимые операнды в двоичном == есть strut NSstring и CLlocationDegrees'

Есть мысли?

Ответы [ 2 ]

19 голосов
/ 20 марта 2010

Как правило, вы должны быть осторожны при прямом сравнении чисел с плавающей запятой. Из-за того, как они определены, внутреннее значение может не быть точно , поскольку вы инициализируете их, что означает, что они очень редко будут идентичны. Вместо этого вам следует проверить, не находится ли разница между ними ниже определенного порога, например

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

Другим вариантом может быть проверка расстояния до нужного человека путем расчета расстояния. Это также может учитывать тот факт, что координата от GPS не совсем правильная, но может отличаться до 10 метров даже при хороших условиях:

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

Клаус

0 голосов
/ 20 марта 2010

Почему вы не сравниваете bonusOne.latitude и newLocation.coordinate.latitude напрямую? Вы преобразуете число с плавающей запятой в строку, а затем сравниваете его с числом с плавающей запятой, поэтому вы получаете эту ошибку.

Кроме того, учитывая, что GPS-модуль имеет тенденцию немного прыгать, вы, вероятно, захотите либо

a: измерьте расстояние между bonusOne и newLocation.coordinate (используя теорему Пифагора для гипотенузы треугольников, нет причин для нас что-то более точное, чем в малом масштабе. Если вы чувствуете придирчивость, используйте карта набора функций измерения расстояния) и укажите его меньше определенной суммы.

b: округлите широту и долготу до определенного числа цифр, чтобы сработало, скажем, 100 футов.

Любой из них будет работать для вас лучше, чем полагаться на равные значения двух поплавков, что обычно проблематично в программном обеспечении и, в частности, является проблемой, когда измеряемое устройство имеет высокий уровень шума.

...