【问题标题】:Swift - GoogleMaps SDK get coordinates on touchSwift - GoogleMaps SDK 在触摸时获取坐标
【发布时间】:2016-12-15 07:53:22
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    在 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))
    }
    

    【讨论】:

    • 如果用户长按现有标记会发生什么?如何识别用户按下标记或地图?
    • 您可以使用 GMSMapViewDelegate mapView:didTapMarker: 方法检测标记上的点击。不幸的是,没有一种方法可以检测代表中标记的长按。因此,您需要使用 mapView:didLongPressAtCoordinate: 方法,然后根据其位置属性识别您的标记,可能通过循环并将您的标记的坐标与代表提供的用户长按的坐标进行比较。见这里:developers.google.com/maps/documentation/ios-sdk/reference/…
    【解决方案2】:

    试试这个

        extension ViewController: GMSMapViewDelegate {
    
        func mapView(_ mapView: GMSMapView, didTapAt coordinate: CLLocationCoordinate2D)    
          {
    
            print("Tapped at coordinate: " + String(coordinate.latitude) + " "
                    + String(coordinate.longitude))
          }
    
        }
    

    【讨论】:

      【解决方案3】:

      适用于 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 不获取 准确的地名。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-20
        相关资源
        最近更新 更多