iPhone Mapkit: аннотации координат несоответствий при сохранении в основных данных - PullRequest
0 голосов
/ 27 мая 2010

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

Итак, я сохраняю свои данные в основных данных, используя что-то вроде:

[ride setLatitude:[NSNumber numberWithDouble:newRidePlacemark.coordinate.latitude]];
[ride setLongitude:[NSNumber numberWithDouble:newRidePlacemark.coordinate.longitude]];

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

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control

NSLog(@"%f, %f", view.annotation.coordinate.latitude, view.annotation.coordinate.longitude);

Это дает мне что-то вроде:

38.119432, -122.225647

Но в то же время я проверяю, что сохраняется в основных данных для этого вывода, и у меня есть:

38.11943249695161, -122.2256469726562

Откуда эта разница? Почему один был сокращен? Это реальная проблема, потому что когда я пытаюсь удалить аннотации, координаты не совпадают, и аннотация не удаляется.

Я что-то здесь упустил?

1 Ответ

2 голосов
/ 27 мая 2010

Во-первых, вы должны убедиться, что вы используете double типы (64-битные) на протяжении всего потока данных. Если данные временно преобразуются в float (32 бита), вы теряете точность. Если вы храните в базовых данных с помощью plist для внутреннего интерфейса, вы можете временно преобразовать его в какое-то другое представление данных, например текстовую строку.

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

if(fabs(num1 - num2) <= 0.000001) {
// numbers are considered equal
}

Надеюсь, это поможет.

...