web-dev-qa-db-ja.com

iOSでのGoogleマップの移動に合わせてマーカーを移動するにはどうすればよいですか?

Googleマップの住所ラベルに現在の住所を表示するとともに、特定の場所にマーカーを表示しています。

ここで、Googleマップを移動して場所を変更したいのですが、問題は、マップを移動しているときに、マーカーを地図とともに同時に移動し、その場所の住所を住所ラベルに表示する必要があることです。

どうやってやるの?

私はこれを試しました:

let destinationMarker = GMSMarker(position: self.destinationLocation.coordinate)

let image = UIImage(named:"sourcemarker")
destinationMarker.icon = image
destinationMarker.draggable = true
destinationMarker.map = self.viewMap
//viewMap.selectedMarker = destinationMarker
destinationMarker.title = "hi"
destinationMarker.userData = "changedestination"

func mapView(mapView: GMSMapView, didEndDraggingMarker marker: GMSMarker)
{
    if marker.userData as! String == "changedestination"
    {
        self.destinationLocation = CLLocation(latitude: marker.position.latitude, longitude: marker.position.longitude)
        self.destinationCoordinate = self.destinationLocation.coordinate
        //getAddressFromLatLong(destinationCoordinate)
    }
}
11
Shilpashree MC
// UpdteLocationCoordinate
    func updateLocationoordinates(coordinates:CLLocationCoordinate2D) {
        if destinationMarker == nil
        {
            destinationMarker = GMSMarker()
            destinationMarker.position = coordinates
            let image = UIImage(named:"destinationmarker")
            destinationMarker.icon = image
            destinationMarker.map = viewMap
            destinationMarker.appearAnimation = kGMSMarkerAnimationPop
        }
        else
        {
            CATransaction.begin()
            CATransaction.setAnimationDuration(1.0)
            destinationMarker.position =  coordinates
            CATransaction.commit()
        }
    }

    // Camera change Position this methods will call every time
    func mapView(mapView: GMSMapView, didChangeCameraPosition position: GMSCameraPosition) {
        let destinationLocation = CLLocation()
        if self.mapGesture == true
        {
            destinationLocation = CLLocation(latitude: position.target.latitude,  longitude: position.target.longitude)
            destinationCoordinate = destinationLocation.coordinate
            updateLocationoordinates(destinationCoordinate)
        }
    }
12
Shilpashree MC

Swift 4:

最初に GMSMapViewDelegate に準拠する必要があります。

extension MapsVC: GMSMapViewDelegate{

そして、VC viewDidLoad()のviewMapのデリゲートとして設定します

viewMap.delegate = self

その後、次のメソッドを使用して、カメラの位置から更新を取得し、それをマーカーの新しい位置として設定するだけです。

func mapView(_ mapView: GMSMapView, didChange position: GMSCameraPosition) {
    destinationMarker.position = position.target
    print(destinationMarker.position)
}
8
Hugo Jordao

ここで役立つ1つのトリックがあります。ここでGMSMarkerを使用する代わりに、中央を指す画像をGoogle MapViewの上に配置します。

これを使用して、マップの中心の座標を簡単に見つけることができます。

double latitude = mapView.camera.target.latitude;
double longitude = mapView.camera.target.longitude;

またはこれ

GMSCoordinateBounds *bounds = nil;
bounds = [[GMSCoordinateBounds alloc] initWithRegion: visibleRegion];

CLLocationCoordinate2D centre = CLLocationCoordinate2DMake(
                                                           (bounds.southWest.latitude + bounds.northEast.latitude) / 2,
                                                           (bounds.southWest.longitude + bounds.northEast.longitude) / 2);

これで、Geocoding API by googleを使用して場所の住所を取得できます。

リファレンスは次のとおりです。 https://developers.google.com/maps/documentation/ios-sdk/reference/interface_g_m_s_geocoder

このデリゲートメソッドが呼び出されると、アドレスを更新できます。

- (void) mapView:(GMSMapView *)mapView idleAtCameraPosition:(GMSCameraPosition *)position 

お役に立てれば。

3
Bharat

IOSのMaps SDKで作成された リリースノート に基づいて、マーカーの位置を変更すると、マーカーが新しい場所に移動します。

これを解決するには、次のような リリースバージョン1.5 に記載されているGMSMarkerの新機能を使用します。

  • Draggableプロパティを使用してマーカーをドラッグ可能にでき、GMSMapViewDelegateに新しいドラッグデリゲートメソッドが追加されました。 (問題4975)。
  • マーカーの位置と回転のアニメーションをサポートするGMSMarkerのカスタムCALayerサブクラスであるGMSMarkerLayerを追加しました。 (問題4951、問題5743)

それに加えて、GitHubのこの投稿- GoogleMapsAnimationGlitch およびthis SO post- Objective Cの座標に沿ってGMSMarkerをスムーズに移動する方法 また助けます。

1
Teyam