Objective C / iPhone, сравнивающий 2 местоположения / координаты GPS

StackOverflow https://stackoverflow.com/questions/2480081

Вопрос

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

Я думал, у меня это получилось, но, похоже, это не так.

У меня есть 'newLocation' в качестве местоположения, где вы находитесь, я думаю, проблема в том, что мне нужно иметь возможность разделять длинные и широтные данные 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];
}

это приводит к ошибке "недопустимые операнды для binary == имеют strut NSString и CLlocationDegrees"

Есть какие-нибудь мысли?

Это было полезно?

Решение

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

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

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

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

Клаус

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top