2009-09-19 9 views
8

J'essaie d'obtenir la latitude et la longitude actuelles des utilisateurs avec cette méthode viewDidLoad. La carte résultante est correctement indiquant l'emplacement actuel mais le NSLog montre toujours:Coordonnées de l'emplacement actuel de l'utilisateur iPhone indiquant (0,0)

2009-09-19 16:45:29.765 Mapper[671:207] user latitude = 0.000000 
2009-09-19 16:45:29.772 Mapper[671:207] user longitude = 0.000000 

Quelqu'un sait ce que je suis absent ici? Merci d'avance pour votre aide!

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [mapView setMapType:MKMapTypeStandard]; 
    [mapView setZoomEnabled:YES]; 
    [mapView setScrollEnabled:YES]; 
    [mapView setShowsUserLocation:YES]; 

    CLLocation *userLoc = mapView.userLocation.location; 
    CLLocationCoordinate2D userCoordinate = userLoc.coordinate; 

    NSLog(@"user latitude = %f",userCoordinate.latitude); 
    NSLog(@"user longitude = %f",userCoordinate.longitude); 
} 

Répondre

9

La carte n'essaiera pas d'obtenir l'emplacement des utilisateurs jusqu'à ce qu'il soit réellement affiché, autant que je sache. Un bon test de cela est, quand obtenez-vous la boîte de dialogue vous demandant si c'est OK pour l'application pour obtenir l'emplacement des utilisateurs? Dans mon expérience, cela a toujours été le cas seulement après que la carte a été montrée à l'écran. La meilleure façon d'aborder ce problème si vous devez disposer d'un emplacement au démarrage consiste à implémenter le code classique du gestionnaire d'emplacement principal et à obtenir l'emplacement initialement. Vous pouvez arrêter de recevoir des mises à jour dès que la carte est relevée et obtenir d'autres changements (mais si vous avez besoin de mises à jour constantes, il vaut mieux garder les mises à jour standard du Core Location. emplacement "activé dans la carte utilisation ultérieure de Core Location par votre application est essentiellement gratuit puisque le GPS sera allumé tout le temps de toute façon

2

A partir du document sur CLLocation, si la précision horizontale ou précision verticale est négative, cela signifie qu'il ne peut pas trouver une valeur. Je pense que c'est ce qui se passe ici. Gardez à l'esprit que si vous regardez seulement une fois, cela peut vous donner un dernier emplacement approximatif connu avant d'améliorer le résultat de la précision.

Précision horizontale La latitude de coordonner et longitude identifient le centre du cercle et cette valeur indique le rayon de ce cercle. Une valeur négative indique que la latitude et la longitude de la coordonnée ne sont pas valides.

+0

donc quelle est la façon d'obtenir les coordonnées de l'emplacement actuel? – ennuikiller

+0

Si vous voulez juste trouver l'emplacement actuel, vous n'avez pas du tout besoin d'utiliser l'API Maps. Vous pouvez interroger Core Location directement. http://developer.apple.com/mac/library/documentation/CoreLocation/Reference/CLLocationManager_Class/CLLocationManager/CLLocationManager.html – AlBlue

1

Vous devez obtenir la coordonnée de CoreLocation au lieu de MapKit MapView affichera l'emplacement de l'utilisateur Avant que l'emplacement ne soit déterminé, la latitude et la longitude sont toutes les deux réglées sur 0. 3

Vous devez créer une instance CLLocationManager, définir un délégué et vous en serez averti lorsque l'emplacement sera déterminé

4

Si vous essayez d'obtenir des coordonnées d'utilisateur dans la méthode viewDidLoad(), il donnera toujours 0,0 résultat, car il n'est pas encore initialisé.

Vous devriez jeter un oeil à "Où suis-je" exemple de code du site Apple. Il explique ce dont vous avez besoin. Vous devez utiliser la classe CLLocationManager. Vous aurez également besoin de la méthode

*-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation* 

Cette méthode sera appelée automatiquement chaque fois que l'emplacement de l'utilisateur est mis à jour. Si vous utilisez un simulateur, cette méthode ne sera appelée qu'une seule fois et elle renverra certaines coordonnées par défaut.

Espérons que ça aide.

-1

Ajouter à votre section viewDidLoad

mapView.showsUserLocation = YES; 
+1

cela n'a aucune importance. – Hammer

1

Comme dit Kendall, le MKMapView n'a pas de emplacement de l'utilisateur jusqu'à la fin du chargement, et la méthode viewDidLoad est généralement trop tôt pour le demander. Une méthode plus simple que l'utilisation de CoreLocation consiste à implémenter la méthode MKMapViewDelegate -(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation. Il vous donnera l'emplacement de l'utilisateur dès qu'il se trouve, sans avoir à faire face à un CLLocationManager.

+0

celui-ci ressemble à l'ok le plus simple et testé. – Hammer

0

Essayez ceci dans

CLLocation *userLoc = mapView.userLocation.location; 
CLLocationCoordinate2D userCoordinate = userLoc.coordinate; 

NSLog(@"user latitude = %f",userCoordinate.latitude); 
NSLog(@"user longitude = %f",userCoordinate.longitude); 

ViewdidAppear: ou appelez effectuer seletor après un délai