Swift - GoogleMaps SDK获取触摸坐标

时间:2016-08-09 10:08:03

标签: swift google-maps google-maps-markers google-maps-sdk-ios

我是swift和Google Maps SDK的新手,并想知道如何使用Google Maps SDK获取用户点击的位置坐标。例如,如果用户将手指放在地图上的某个位置,则会在那里创建注释。我非常感谢你的帮助,谢谢。

3 个答案:

答案 0 :(得分:11)

在GMSMapViewDelegate中有一个名为mapView:didLongPressAtCoordinate:的方法,该方法在特定坐标的长按手势后调用。请参阅参考here

通过实施此方法,您可以在地图视图中添加标记:

func mapView(mapView: GMSMapView!, didLongPressAtCoordinate coordinate: CLLocationCoordinate2D) {
     let marker = GMSMarker(position: coordinate)
     marker.title = "Hello World"
     marker.map = mapView
}

对于点击手势,可以实现一个名为mapView:didTapAtCoordinate:的类似委托方法,该方法可以类似的方式使用:

func mapView(mapView: GMSMapView!, didTapAtCoordinate coordinate: CLLocationCoordinate2D) {
     print("Tapped at coordinate: " + String(coordinate.latitude) + " " 
                                    + String(coordinate.longitude))
}

答案 1 :(得分:0)

尝试

    extension ViewController: GMSMapViewDelegate {

    func mapView(_ mapView: GMSMapView, didTapAt coordinate: CLLocationCoordinate2D)    
      {

        print("Tapped at coordinate: " + String(coordinate.latitude) + " "
                + String(coordinate.longitude))
      }

    }

答案 2 :(得分:0)

适用于 Swift 5.0+

<块引用>

首先,确保您已将 GMSMapViewDelegate 委托添加到您的 ViewController 类

在你的类中添加这个默认函数

func mapView(_ mapView: GMSMapView, didLongPressAt coordinate: CLLocationCoordinate2D) {
   debugPrint("Coordinates: ", coordinate)
}

如果你只想要坐标,那么上面的功能非常适合你但是如果你想创建标记或通过触摸获取本地地址,那么请看下面的功能

func mapView(_ mapView: GMSMapView, didLongPressAt coordinate: CLLocationCoordinate2D) {
    let marker = GMSMarker(position: coordinate) //Add this line if you want to add marker

    let decoder = CLGeocoder()
    decoder.reverseGeocodeLocation(CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude)) { placemarks, err in
        if let placeMark = placemarks?.first {
            let plName = placeMark.name ?? placeMark.subThoroughfare ?? placeMark.thoroughfare! //Place Name

            var address : String! = "" //This will be the local address
            if let subLocality = placeMark.subLocality ?? placeMark.name {
                address.append(subLocality)
                address.append(", ")
            }
            if let city = placeMark.locality ?? placeMark.subAdministrativeArea {
                address.append(city)
                address.append(", ")
            }
            if let state = placeMark.administrativeArea, let country = placeMark.country {
                address.append(state)
                address.append(", ")
                address.append(country)
            }
            // Add Marker:
            marker.title = plName
            marker.snippet = address
            marker.appearAnimation = .pop
            marker.map = mapView
        }
    }
 }

此函数不仅获取坐标,还创建一个标记,其中包含从坐标中获取的所有详细信息(例如地点名称、城市、州、国家/地区等)< /p>

如果你只想要本地地址,那么删除所有与marker相关的代码行

<块引用>

我使用 CLGeocoder 而不是 GMSGeocoder 的原因来自 GoogleMapDelegate 是 Apple 的 CLGeocoder 更精确 在获取地名而 GMSGeocoder 未获取时 准确地名。

  • 另请注意:Apple 的地理编码请求对每个应用程序都有速率限制,因此在短时间内发出过多请求可能 导致某些请求失败。