Search code examples
uitableviewmkmapviewios9mkannotationxcode7.3

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


Just wondering How to do that , really would like this in my custom cell in the table view in my app...

Will appreciate any help thank you !


Solution

  • You can calculate the distance between two CLLocation objects with the distanceFromLocation method:

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

    With an MKMapView object and an MKAnnotationView object, you can calculate the distance between the user's current location and the annotation as follows:

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

    The following function uses the NSNumberFormatter class to format a distance in meters or kilometres (if the number of meters is more than 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
      }
    }
    

    Putting all this together gives us the following:

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