Google Maps API: получение координат текущего местоположения iOS

В настоящее время я работаю с API Карт Google в своем проекте. Я пытаюсь установить камеру/увеличение по умолчанию для местоположения пользователя. Я сделаю это:

@implementation ViewController{

GMSMapView *mapView_;

}
@synthesize currentLatitude,currentLongitude;

- (void)viewDidLoad
{
[super viewDidLoad];
mapView_.settings.myLocationButton = YES;
mapView_.myLocationEnabled = YES;


}
- (void)loadView{

CLLocation *myLocation = mapView_.myLocation;

GMSMarker *marker = [[GMSMarker alloc] init];
marker.position = CLLocationCoordinate2DMake(myLocation.coordinate.latitude, myLocation.coordinate.longitude);
marker.title = @"Current Location";
marker.map = mapView_;
GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:myLocation.coordinate.latitude
                                                        longitude:myLocation.coordinate.longitude
                                                             zoom:6];
mapView_ = [GMSMapView mapWithFrame:CGRectZero camera:camera];

self.view = mapView_;
   NSLog(@"%f, %f", myLocation.coordinate.latitude, myLocation.coordinate.longitude);

}

Однако это не работает, так как, когда я делаю

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

он возвращает 0, 0 и не дает координаты текущего местоположения. Как я могу правильно получить координаты пользователя?


person Alexyuiop    schedule 12.06.2013    source источник
comment
Что делает эта линия? CLLocation *myLocation = mapView_.myLocation; Чтобы получить текущее местоположение, нам нужно: 1. Добавить CoreLocation Framework 2. Создать объект CLLocationManager CLLocationManager *locationManager = [[CLLocationManager alloc] init]; 3. [locationManager startUpdatingLocation]; CLLocation *location = [locationManager]; CLLocationCoordinate2D координата = [координата местоположения];   -  person Puneet Sharma    schedule 12.06.2013
comment
В Google Maps есть функция, которая определяет местоположение пользователя, но я не знаю, как ее получить.   -  person Alexyuiop    schedule 12.06.2013
comment
См.: stackoverflow.com/questions/16331767/ Надеюсь, это поможет   -  person Puneet Sharma    schedule 12.06.2013
comment
Я смотрел на этот, но он, кажется, не работает для меня   -  person Alexyuiop    schedule 12.06.2013
comment
когда я использую его, у меня пустой экран, я показываю карту в пользовательском представлении и хочу получить широту, долготу текущего местоположения?   -  person Ravi Ojha    schedule 16.03.2015


Ответы (4)


.h

#import <CoreLocation/CoreLocation.h>
@property(nonatomic,retain) CLLocationManager *locationManager;

.m

- (NSString *)deviceLocation 
{
NSString *theLocation = [NSString stringWithFormat:@"latitude: %f longitude: %f", locationManager.location.coordinate.latitude, locationManager.location.coordinate.longitude];
return theLocation;
}

- (void)viewDidLoad
{
    locationManager = [[CLLocationManager alloc] init];
    locationManager.distanceFilter = kCLDistanceFilterNone; 
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; // 100 m
    [locationManager startUpdatingLocation];
}

ответил здесь.

person DrDev    schedule 12.06.2013
comment
Вам нужно будет вызвать [super viewDidLoad]; в вашей собственной реализации viewDidLoad - person Allen Zeng; 23.09.2014
comment
После инициализации вам необходимо установить делегат; иначе не получится. В Swift: locationManager.delegate = selfВам нужно соответствовать делегату CLLocationManagerDelegate и реализовать func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {...}. Вы также можете перестать обновлять местоположение в какой-то момент: self.locationManager.stopUpdatingLocation() - person oyalhi; 15.01.2016

Когда приложение запускается впервые, оно может еще не знать ваше местоположение, так как обычно требуется некоторое время, чтобы устройство GPS зафиксировало ваше местоположение (если оно только что было запущено), особенно если это первый раз, когда приложение было запущено. run, поэтому пользователь еще не ответил на запрос о предоставлении приложению доступа к своему местоположению. Также кажется, что mapView.myLocation всегда пусто (либо nil, либо имеет координаты 0,0), когда представление карты только что было создано.

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

Одним из способов может быть использование кода на странице как получить текущее местоположение в google map sdk в iphone, как было предложено Puneet, но обратите внимание, что в примере кода отсутствуют детали настройки диспетчера местоположений (например, настройка делегата диспетчера местоположений), что может быть причиной того, что он не не работать на вас.

Другим вариантом может быть использование KVO на mapView.myLocation, как описано здесь: о позиционировании, некоторых проблемах

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

person Saxon Druce    schedule 12.06.2013

Я только что загрузил новую демо-версию GoogleMap SDK для iOS. Вот что я увидел из исходного кода о том, как «Текущее местоположение» достигается с помощью KVO.

#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif

#import "SDKDemos/Samples/MyLocationViewController.h"

#import <GoogleMaps/GoogleMaps.h>

@implementation MyLocationViewController {
  GMSMapView *mapView_;
  BOOL firstLocationUpdate_;
}

- (void)viewDidLoad {
  [super viewDidLoad];
  GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.868
                                                          longitude:151.2086
                                                               zoom:12];

  mapView_ = [GMSMapView mapWithFrame:CGRectZero camera:camera];
  mapView_.settings.compassButton = YES;
  mapView_.settings.myLocationButton = YES;

  // Listen to the myLocation property of GMSMapView.
  [mapView_ addObserver:self
             forKeyPath:@"myLocation"
                options:NSKeyValueObservingOptionNew
                context:NULL];

  self.view = mapView_;

  // Ask for My Location data after the map has already been added to the UI.
  dispatch_async(dispatch_get_main_queue(), ^{
    mapView_.myLocationEnabled = YES;
  });
}

- (void)dealloc {
  [mapView_ removeObserver:self
                forKeyPath:@"myLocation"
                   context:NULL];
}

#pragma mark - KVO updates

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context {
  if (!firstLocationUpdate_) {
    // If the first location update has not yet been recieved, then jump to that
    // location.
    firstLocationUpdate_ = YES;
    CLLocation *location = [change objectForKey:NSKeyValueChangeNewKey];
    mapView_.camera = [GMSCameraPosition cameraWithTarget:location.coordinate
                                                     zoom:14];
  }
}

@end

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

person TypingPanda    schedule 31.08.2015
comment
Этот метод довольно длинный, и было бы лучше, если бы мы выбрали CLLocation Manager. - person G.Abhisek; 15.12.2015

На всякий случай кому-то нужен отличный ответ DrDev в Swift 3:

var locationManager: CLLocationManager?

func deviceLocation() -> String {
    let theLocation: String = "latitude: \(locationManager.location.coordinate.latitude) longitude: \(locationManager.location.coordinate.longitude)"
    return theLocation
}

func viewDidLoad() {
    locationManager = CLLocationManager()
    locationManager.distanceFilter = kCLDistanceFilterNone
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters
    // 100 m
    locationManager.startUpdatingLocation()
}
person agrippa    schedule 18.05.2017