iPhone текущие координаты местоположения пользователя показаны как (0,0) - PullRequest
8 голосов
/ 20 сентября 2009

Я пытаюсь получить текущую широту и долготу пользователей с помощью этого метода viewDidLoad. Полученная карта правильно указывает текущее местоположение, однако NSLog постоянно показывает:

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

Кто-нибудь знает, что мне здесь не хватает? Заранее спасибо за помощь!

- (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);
}

Ответы [ 8 ]

9 голосов
/ 20 сентября 2009

Насколько мне известно, карта не будет пытаться определить местоположение пользователей, пока она не отобразится. Хорошим тестом является то, когда вы получаете диалоговое окно, спрашивающее вас, нормально ли приложение для определения местоположения пользователей? По моему опыту, это всегда всплывало только после того, как карта показывает на экране.

Лучший способ решить эту проблему, если у вас должно быть местоположение при запуске, это реализовать классический код обработчика ядра и сначала получить местоположение из него. Вы можете прекратить получать обновления оттуда, как только карта будет открыта, и получать от нее дальнейшие изменения (хотя, если вам нужны постоянные обновления, вам лучше просто придерживаться стандартных обновлений основного местоположения. Если вы подумаете об этом, когда у вас будет «показывает пользователя» «местоположение» включено на карте, дальнейшее использование базового местоположения вашим приложением по существу бесплатно, так как GPS все равно будет запускаться постоянно.

4 голосов
/ 21 сентября 2009

Если вы попытаетесь получить пользовательские координаты в методе viewDidLoad (), он всегда даст 0,0 результата, поскольку он еще не инициализирован.

Вам следует ознакомиться с образцом кода «Где я» на сайте Apple. Это объясняет, что вам нужно. Вам нужно использовать CLLocationManager класс. Вам также понадобится метод

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

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

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

2 голосов
/ 20 сентября 2009

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

Точность по горизонтали Широта координат и долгота определить центр круг и это значение указывает на радиус этого круга. Отрицательный значение указывает, что координата широта и долгота недействительны.

1 голос
/ 08 января 2013

Как сказал Кендалл , MKMapView не имеет пользовательского местоположения до завершения загрузки, а метод viewDidLoad обычно слишком рано запрашивает его. Более простой способ, чем использование CoreLocation, заключается в реализации метода MKMapViewDelegate. -(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation. Это даст вам местоположение пользователя, как только оно будет найдено, без необходимости иметь дело с CLLocationManager.

1 голос
/ 20 сентября 2009

Вы должны получить координату из CoreLocation вместо MapKit. MapView отобразит местоположение пользователя после того, как оно фактически получило текущее местоположение. До определения местоположения, широта и долгота устанавливаются на 0. 3

Вы должны создать объект CLLocationManager, установить делегат. Вы будете уведомлены, когда местоположение будет определено.

0 голосов
/ 05 мая 2014

Попробуйте это в

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

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

ViewdidAppear: или вызвать селектор выполнения после задержки

0 голосов
/ 02 мая 2010

Добавьте это в раздел viewDidLoad

mapView.showsUserLocation = YES;
0 голосов
/ 09 марта 2010

Этот ответ объясняет, как настроить вид карты с местоположением пользователя:

Как инициализировать MKMapView с заданным местоположением пользователя?

...