Calculate total iOS Swift rides

How can I calculate the total distance traveled using CoreLocation in Swift

I have not yet found resources for how to do this in Swift for iOS 8,

How would you calculate the total distance traveled since you started tracking your location?

From what I've read so far, I need to save the location of the points, then calculate the distance between the current point and the last point, and then add this distance to the variable totalDistance

Objective-C is very unfamiliar to me, so I could not develop a quick syntax

Here is what I have developed so far, not sure if I am doing it right. Although the distanceFromLocation method returns all 0.0, so obviously something is wrong.

 func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) { var newLocation: CLLocation = locations[0] as CLLocation oldLocationArray.append(newLocation) var totalDistance = CLLocationDistance() var oldLocation = oldLocationArray.last var distanceTraveled = newLocation.distanceFromLocation(oldLocation) totalDistance += distanceTraveled println(distanceTraveled) } 
+7
ios xcode swift core-location cllocation
source share
3 answers

update: Xcode 8.3.2 • Swift 3.1

The problem is that you always get the same location over and over again. Try it like this:

 import UIKit import MapKit class ViewController: UIViewController, CLLocationManagerDelegate { @IBOutlet weak var mapView: MKMapView! let locationManager = CLLocationManager() var startLocation: CLLocation! var lastLocation: CLLocation! var startDate: Date! var traveledDistance: Double = 0 override func viewDidLoad() { super.viewDidLoad() if CLLocationManager.locationServicesEnabled() { locationManager.delegate = self locationManager.desiredAccuracy = kCLLocationAccuracyBest locationManager.requestWhenInUseAuthorization() locationManager.startUpdatingLocation() locationManager.startMonitoringSignificantLocationChanges() locationManager.distanceFilter = 10 mapView.showsUserLocation = true mapView.userTrackingMode = .follow } } func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { if startDate == nil { startDate = Date() } else { print("elapsedTime:", String(format: "%.0fs", Date().timeIntervalSince(startDate))) } if startLocation == nil { startLocation = locations.first } else if let location = locations.last { traveledDistance += lastLocation.distance(from: location) print("Traveled Distance:", traveledDistance) print("Straight Distance:", startLocation.distance(from: locations.last!)) } lastLocation = locations.last } func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { if (error as? CLError)?.code == .denied { manager.stopUpdatingLocation() manager.stopMonitoringSignificantLocationChanges() } } } 

Project example

+15
source share

If you want to calculate the distance of a route between two points, you need to use MKDirectionsRequest , this will return you one or more routes from point A to point B with a step-by-step instruction:

 class func caculateDistance(){ var directionRequest = MKDirectionsRequest() var sourceCoord = CLLocationCoordinate2D(latitude: -36.7346287, longitude: 174.6991812) var destinationCoord = CLLocationCoordinate2D(latitude: -36.850587, longitude: 174.7391745) var mkPlacemarkOrigen = MKPlacemark(coordinate: sourceCoord, addressDictionary: nil) var mkPlacemarkDestination = MKPlacemark(coordinate: destinationCoord, addressDictionary: nil) var source:MKMapItem = MKMapItem(placemark: mkPlacemarkOrigen) var destination:MKMapItem = MKMapItem(placemark: mkPlacemarkDestination) directionRequest.setSource(source) directionRequest.setDestination(destination) var directions = MKDirections(request: directionRequest) directions.calculateDirectionsWithCompletionHandler { (response, error) -> Void in if error != nil { println("Error calculating direction - \(error.localizedDescription)") } else { for route in response.routes{ println("Distance = \(route.distance)") for step in route.steps!{ println(step.instructions) } } } } } 

This sample code will return the following to you:

 Distance Distance = 16800.0 Step by Step instructions Start on the route At the end of the road, turn left onto Bush Road Turn right onto Albany Expressway At the roundabout, take the first exit onto Greville Road toward 1, Auckland At the roundabout, take the third exit to merge onto 1 toward Auckland Keep left Take exit 423 onto Shelly Beach Road Continue onto Shelly Beach Road At the end of the road, turn right onto Jervois Road Turn left onto Islington Street Keep right on Islington Street Arrive at the destination 

The function can be easily changed to get two locations and return the distance and any other necessary information.

I hope this helps!

+5
source share

You can use the Leo Dabus method to calculate the geographical distance between your actual location and the beginning of it.

To get the exact distance traveled, you need to update the "distance traveled" using the difference between the last position and the old one.

This is my implementation:

 var startLocation:CLLocation! var lastLocation: CLLocation! var traveledDistance:Double = 0 func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) { if startLocation == nil { startLocation = locations.first as! CLLocation } else { let lastLocation = locations.last as! CLLocation let distance = startLocation.distanceFromLocation(lastLocation) startLocation = lastLocation traveledDistance += distance } } 
+4
source share

All Articles