如何使文本显示从用户当前位置到某个地图注释的距离

How to make Text Show distance from The user current location to a certain Map annotation

只是想知道如何做到这一点,真的很想在我的应用程序 table 视图中的自定义单元格中使用这个...

感谢您的帮助,谢谢!

您可以使用 distanceFromLocation 方法计算两个 CLLocation 对象之间的距离:

let newYork = CLLocation(latitude: 40.725530, longitude: -73.996738)
let sanFrancisco = CLLocation(latitude: 37.768, longitude: -122.441)
let distanceInMeters = newYork.distanceFromLocation(sanFrancisco)

使用MKMapView对象和MKAnnotationView对象,可以计算用户当前位置和注释之间的距离,如下所示:

if let userLocation = mapView.userLocation.location, annotation = annotationView.annotation {
  // Calculate the distance from the user to the annotation
  let annotationLocation = CLLocation(latitude: annotation.coordinate.latitude, longitude: annotation.coordinate.longitude)
  let distanceFromUserToAnnotationInMeters = userLocation.distanceFromLocation(annotationLocation)
  ...
}

以下函数使用 NSNumberFormatter class 以米或千米为单位格式化距离(如果米数大于 1000):

func formatDistance(distanceInMeters: CLLocationDistance) -> String? {
  // Set up a number formatter with two decimal places
  let numberFormatter = NSNumberFormatter()
  numberFormatter.numberStyle = .DecimalStyle
  numberFormatter.maximumFractionDigits = 2

  // Display as kilometers if the distance is more than 1000 meters
  let distanceToFormat: CLLocationDistance = distanceInMeters > 1000 ? distanceInMeters/1000.0 : distanceInMeters
  let units = distanceInMeters > 1000 ? "Km" : "m"

  // Format the distance
  if let formattedDistance = numberFormatter.stringFromNumber(distanceToFormat) {
    return "\(formattedDistance)\(units)"
  } else {
    return nil
  }
}

将所有这些放在一起得出以下结果:

if let userLocation = mapView.userLocation.location, annotation = annotationView.annotation {
  // Calculate the distance from the user to the annotation
  let annotationLocation = CLLocation(latitude: annotation.coordinate.latitude, longitude: annotation.coordinate.longitude)
  let distanceFromUserToAnnotationInMeters = userLocation.distanceFromLocation(annotationLocation)
  if let formattedDistance = formatDistance(distanceFromUserToAnnotationInMeters) {
    // Now set the vaue of your label to formattedDistance
  }
}