【问题标题】:Displaying current location on Google maps在谷歌地图上显示当前位置
【发布时间】:2014-05-22 20:06:28
【问题描述】:

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

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

【问题讨论】:

    标签: ios google-maps-sdk-ios gmsmapview cllocationcoordinate2d


    【解决方案1】:

    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海洋。

    【讨论】:

    • OK 这似乎正在将标记从其硬编码位置移动。但它现在将标记放置在海洋中间——就在非洲西海岸(我不在的地方)。如果我缩小,我可以在屏幕上看到另一个标记我正确的位置,但我不知道这是从哪里来的?我已将相机和标记都设置为 myLocation.latitude 和 myLocation.longitude 并且应用程序似乎认为这是在海洋中间?还有什么我需要检查的吗?另一个标记是从哪里来的?
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-08-14
      • 1970-01-01
      • 2015-02-10
      • 1970-01-01
      • 2017-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多