2

我有一个 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”

如何获取当前位置以传递给相机和标记?

4

2 回答 2

4

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 知道该位置是有效的。

当 mapview 被释放时,不要忘记将自己移除为观察者:

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

正如撒克逊人已经提到的,地图视图将显示它自己的当前位置指示器。您正在添加的标记将另外显示,但是当您创建标记时,mapview 可能还没有有效的位置,因此它被添加在中间的纬度/经度 0,0的海洋。

于 2014-05-22T20:21:46.283 回答
1

当您将 myLocationEnabled 设置为 YES 时,地图会自动在您的当前位置添加一个标记。所以你可能不需要添加你自己的?

设备和您的应用程序需要时间来确定您的位置。当它启动时,它可能还不知道你的位置,所以它默认为零的纬度/经度,这是在非洲附近。

正如 NigelG 所说,您可以在 myLocation 属性上使用 KVO 来找出位置更新的时间。

于 2014-05-23T00:00:47.090 回答