Отображение текущего местоположения на картах Google

У меня есть приложение для iOS, которое использует Google Maps SDK для отображения карты в моем приложении.

Мне удалось отобразить карту, но я не знаю, как установить камеру или маркер в текущее местоположение пользователя.

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

Вот мой код для центрирования камеры по координате

- (void)viewDidLoad
{
    [super viewDidLoad];

    GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:47.995602 longitude:-78.902153 zoom:6];

    self.mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];

    self.mapView.myLocationEnabled = YES;
    self.mapView.mapType = kGMSTypeNormal;
    self.mapView.accessibilityElementsHidden = NO;
    self.mapView.settings.scrollGestures = YES;
    self.mapView.settings.zoomGestures = YES;
    self.mapView.settings.compassButton = YES;
    self.mapView.settings.myLocationButton = YES;
    self.mapView.delegate = self;
    self.view = self.mapView;

    [self placeMarkers];
}

А вот код для отображения маркера по координатам

-(void)placeMarkers
{
    GMSMarker *marker = [[GMSMarker alloc] init];

    marker.position = CLLocationCoordinate2DMake(47.995602, -78.902153);
    marker.title = @"PopUp HQ";
    marker.snippet = @"Durham, NC";
    marker.icon = [GMSMarker markerImageWithColor:[UIColor blueColor]];
    marker.opacity = 0.9;
    marker.map = self.mapView;
}

Я попытался получить текущую позицию следующим образом:

CLLocationCoordinate2D *myLocation = self.mapView.myLocation.coordinate;

но я получаю сообщение об ошибке:

Инициализация «CLLocationCoordinate2D» с выражением несовместимого типа «CLLocationCoordinate2D»

Как я могу передать текущее местоположение камере, а также маркеру?


person heyred    schedule 22.05.2014    source источник


Ответы (2)


CLLocationCoordinate2D — это просто структура, содержащая широту и долготу, поэтому вы можете просто использовать

CLLocationCoordinate2D myLocation = self.mapView.myLocation.coordinate;

Также стоит использовать KVO для наблюдения за изменениями в myLocation, так как возможно, что mapView еще не будет иметь действительного местоположения.

Чтобы объяснить больше о KVO:

Вы можете добавить наблюдателя для свойства myLocation следующим образом:

[self.mapView addObserver:self
          forKeyPath:@"myLocation"
             options:(NSKeyValueObservingOptionNew |
                      NSKeyValueObservingOptionOld)
             context:NULL];

Затем вы должны реализовать следующий метод:

- (void)observeValueForKeyPath:(NSString *)keyPath
                  ofObject:(id)object
                    change:(NSDictionary *)change
                   context:(void *)context {
    if ([keyPath isEqualToString:@"myLocation"]) {
//            NSLog(@"My position changed");
    }
}

Затем вы можете безопасно получить доступ к self.mapView.myLocation.coordinate, зная, что местоположение допустимо.

Не забудьте удалить себя в качестве наблюдателя, когда карта будет освобождена:

[self.mapView removeObserver:self forKeyPath:@"myLocation"];

Как уже упоминал Саксон, на карте будет отображаться собственный индикатор текущей позиции. Маркер, который вы добавляете, будет отображаться дополнительно, но вполне вероятно, что представление карты еще не имеет действительной позиции, когда вы создаете маркер, поэтому он добавляется на широте/долготе 0,0, что находится посередине. океана.

person NigelG    schedule 22.05.2014
comment
Хорошо, кажется, что маркер перемещается из его жестко закодированного положения. Но теперь он помещает маркер в середину океана - как раз у западного побережья Африки (где меня нет). Если я уменьшу масштаб, я увижу на экране еще один маркер с моим правильным местоположением, но я понятия не имею, откуда он взялся? Я установил для камеры и маркера значения myLocation.latitude и myLocation.longitude, и приложение, кажется, думает, что это посреди океана? Есть ли что-то еще, что мне нужно проверить, и откуда берется другой маркер? - person heyred; 23.05.2014

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

Устройству и приложению требуется время, чтобы определить ваше местоположение. Когда он запускается, он, вероятно, еще не знает вашего местоположения, поэтому по умолчанию широта / долгота равны нулю, что находится за пределами Африки.

Как сказал НайджелГ, вы можете использовать KVO для свойства myLocation, чтобы узнать, когда обновляется позиция.

person Saxon Druce    schedule 23.05.2014