【发布时间】:2016-12-15 07:53:22
【问题描述】:
我是 swift 和 Google Maps SDK 的新手,想知道如何使用 Google Maps SDK 获取用户点击位置的坐标。例如,如果用户将手指放在地图上的某个位置,则会在该位置创建注释。非常感谢您的帮助,谢谢。
【问题讨论】:
标签: swift google-maps google-maps-markers google-maps-sdk-ios
我是 swift 和 Google Maps SDK 的新手,想知道如何使用 Google Maps SDK 获取用户点击位置的坐标。例如,如果用户将手指放在地图上的某个位置,则会在该位置创建注释。非常感谢您的帮助,谢谢。
【问题讨论】:
标签: swift google-maps google-maps-markers google-maps-sdk-ios
在 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))
}
【讨论】:
试试这个
extension ViewController: GMSMapViewDelegate {
func mapView(_ mapView: GMSMapView, didTapAt coordinate: CLLocationCoordinate2D)
{
print("Tapped at coordinate: " + String(coordinate.latitude) + " "
+ String(coordinate.longitude))
}
}
【讨论】:
适用于 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
}
}
}
此函数不仅获取坐标,还创建一个标记,其中包含从坐标中获取的所有详细信息(如 PlaceName、城市、州、国家等)
如果你只想要本地地址,那么删除所有与marker相关的代码行
我使用
CLGeocoder而不是GMSGeocoder的原因来自GoogleMapDelegate是苹果的CLGeocoder更精确 在获取地名时GMSGeocoder不获取 准确的地名。
【讨论】: