2010-05-27 14 views
0

Voici ma situation. Pour une raison quelconque, mes coordonnées d'annotation qui sont enregistrées dans les données de base ne semblent pas correspondre aux coordonnées que je peux récupérer à partir de l'emplacement des broches sur la carte.iPhone Mapkit: Incompatibilité des coordonnées d'annotation lors de l'enregistrement dans les données de base

Donc, j'enregistrer mes données dans les données de base en utilisant quelque chose comme:.

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

Je suis assez positif qui est le format pour enregistrer le long et lat Mais, la question apparaît quand je compare la coordonnée que j'ai dans les données de base avec la coordonnée de la broche abandonnée. J'utilise la méthode et le journal pour voir ce que l'emplacement de la broche est à:

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

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

Cela me donne quelque chose comme:

38,119432, -122,225647

Mais, en même temps, je je suis vérifier ce qui est enregistré dans les données de base pour que la broche, et j'ai:

38,11943249695161, -122,2256469726562

D'où vient cette différence? Pourquoi a-t-on été raccourci? C'est un réel problème, car lorsque j'essaie de supprimer des annotations, les coordonnées ne correspondent pas et l'annotation n'est pas supprimée.

Ai-je manqué quelque chose ici?

Répondre

2

Vous devez d'abord vous assurer que vous utilisez double types (64 bits) tout au long de votre flux de données. Si les données sont temporairement converties en float (32 bits), vous perdrez de la précision. Si vous stockez dans les données de base avec une plist pour back-end, vous pouvez en fait le convertir temporairement en une autre représentation de données telles que la chaîne de texte.

Deuxièmement, vous devez faire attention en comparant les nombres à virgule flottante en général. Au lieu de comparer les valeurs, vous devez tenir compte de quelques différences minuscules en fonction de la précision souhaitée, par ex.

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

Espérons que cela aide.

+0

Ok, il semble que je garde le nombre en double tout le temps. Le nombre lui-même ne change pas, il est simplement raccourci. –

+0

Cela peut être un problème avec votre schéma de données de base ne stockant pas en tant que 64 bits à virgule flottante, mais 32 bits. –

+0

Mais je les sauvegarde en double, pas en nombre entier 32 ou 64. –