Получить местоположение пользователя из MKMapView

Можно ли использовать собственный менеджер местоположения MKMapView, чтобы вернуть текущее местоположение пользователей для передачи в веб-сервис?

У меня mapView.showsUserLocation=YES;, и это действительно возвращает действительную синюю точку в моем местоположении, но в симуляторе это Купертино - это нормально, но когда я смотрю на

mapView.userLocation.coordinate.latitude, он равен 180, тогда как CLLocationManager возвращает правильный, 37,3317.

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

Спасибо.


person joec    schedule 13.01.2010    source источник
comment
Привет, Джоек! Что ты имеешь в виду, когда в моем местоположении не отображается действительная синяя точка? Взгляните на мой ответ, это может быть полезно.   -  person vfn    schedule 14.01.2010
comment
Хороший вопрос! +1, но выбранный ответ никогда не сработает! Таким образом, 1!   -  person DD_    schedule 07.01.2013
comment
Ответы, которые здесь приняты, неверны. Это не сработает, для правильного решения прочтите ответы на этот вопрос http://stackoverflow.com/questions/1449486/iphone-current-user-location-coordinates-show-as-0-0 Надеюсь, это имеет смысл   -  person DD_    schedule 07.01.2013


Ответы (2)


Вы можете получить местоположение пользователя из MKMapView. Вам просто не хватает свойства при поиске его. Должен быть:

mapView.userLocation.location.coordinate.latitude;

userLocation хранит только атрибут местоположения CLLocation и атрибут обновления BOOL. Вы должны перейти к атрибуту местоположения, чтобы получить координаты.

-Нарисовался

РЕДАКТИРОВАТЬ: userLocation MKMapView не обновляется, пока карта не завершит загрузку, а слишком ранняя проверка вернет нули. Чтобы этого избежать, я предлагаю использовать метод MKMapViewDelegate -(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation.

person Drew C    schedule 16.01.2010
comment
он возвращает 0.0000 и в моем случае :( - person Piscean; 31.01.2012
comment
Если вы получаете 0,000 в качестве местоположения, см. Мою правку в ответе выше. - person Drew C; 08.01.2013

Итак, чтобы использовать уникальный CLLocateManager, вы можете создать класс, который будет делегатом для всех ваших карт, поэтому вместо того, чтобы делать:

self.locationManager = [[CLLocationManager alloc] init];
    _locationManager.delegate = self;

Сделайте что-нибудь вроде:

self.locationManager = [[CLLocationManager alloc] init];
    _locationManager.delegate = mySharedDelegate;

Где mySharedDelegate - это ваш класс со всеми методами делегата CLLocationManager.

Вы можете получить действительные координаты для userLocation только после первого вызова

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

Когда этот метод вызывается, это происходит потому, что GPS обнаружил новое местоположение, и поэтому синяя точка будет перемещена туда, а userLocation будет иметь новые координаты.

Используйте следующий метод в делегате CLLocationManager для регистрации текущего местоположения при его обнаружении:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    NSLog(@"---------- locationManager didUpdateToLocation");
    location=newLocation.coordinate;

    NSLog(@"Location after calibration, user location (%f, %f)", _mapView.userLocation.coordinate.latitude, _mapView.userLocation.coordinate.longitude);
}

У вас есть идея?

Ура,
VFN

person vfn    schedule 14.01.2010
comment
Тогда нормально ли иметь отдельный диспетчер местоположения для каждой из моих вкладок и только тогда делиться делегатом? Или мне следует выделить и запустить один диспетчер местоположения в делегате приложения и использовать его? благодаря. - person joec; 14.01.2010