2

Google Maps SDK を使用してアプリ内に地図を表示する iOS アプリがあります。

マップを表示することはできましたが、カメラまたはマーカーをユーザーの現在の場所に設定する方法がわかりません。

マップが機能しているかどうかをテストするためだけに座標をハードコーディングしましたが、ユーザーの現在の場所を表示する方法に行き詰まっています。

カメラを座標の中央に配置するコードは次のとおりです

- (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;

mapView がまだ有効な場所を持っていない可能性があるため、KVO を使用して myLocation への変更を観察することも価値があります。

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"];

Saxon が既に述べたように、マップビューには独自の現在位置インジケーターが表示されます。追加するマーカーが追加で表示されますが、マーカーを作成しているときに mapview がまだ有効な位置を持っていない可能性が高いため、中央の緯度/経度 0,0 に追加されています。海の。

于 2014-05-22T20:21:46.283 に答える
1

myLocationEnabled を YES に設定すると、マップは現在の場所にマーカーを自動的に追加します。おそらく、独自に追加する必要はありませんか?

デバイスとアプリが現在地を特定するには時間がかかります。起動時には、まだあなたの場所を認識していない可能性があるため、デフォルトで緯度/経度ゼロ (アフリカ沖) に設定されます。

NigelG が言ったように、myLocation プロパティで KVO を使用して、位置がいつ更新されるかを確認できます。

于 2014-05-23T00:00:47.090 に答える