xcode 计算总行驶距离 iOS Swift

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/28952747/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-15 06:47:40  来源:igfitidea点击:

Calculate Total Traveled Distance iOS Swift

iosxcodeswiftcore-locationcllocation

提问by YichenBman

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

如何在 Swift 中使用 CoreLocation 计算总行驶距离

I haven't been able to so far find any resources for how to do this in Swift for iOS 8,

到目前为止,我还没有找到任何有关如何在 Swift for iOS 8 中执行此操作的资源,

How would you calculate the total distance moved since you began tracking your location?

您将如何计算自开始跟踪您的位置以来移动的总距离?

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

从我到目前为止读到的内容来看,我需要保存一个点的位置,然后计算当前点和最后一个点之间的距离,然后将该距离添加到 totalDistance 变量中

Objective-C is extremely unfamiliar to me, so I haven't been able to work out the swift syntax

Objective-C 对我来说非常陌生,所以我一直无法计算出 swift 语法

Here is what I've worked out so far, not sure if I'm doing it right. Though the distanceFromLocationmethod is returning all 0.0 so obviously something is wrong

这是我到目前为止所做的工作,不确定我是否做得对。虽然该distanceFromLocation方法返回所有 0.0 所以显然有些问题

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)



}

回答by Leo Dabus

update: Xcode 8.3.2 ? Swift 3.1

更新:Xcode 8.3.2?斯威夫特 3.1

The problem there is because you are always getting the same location over and over again. Try 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()
        }
    }
}

Sample Project

示例项目

回答by Icaro

If you want to calculate the route distancebetween two points you need to use MKDirectionsRequest, this will return you one, or many, routes from point A to point B with the step by step instruction:

如果您想计算您需要使用的两点之间的路线距离MKDirectionsRequest,这将通过分步说明返回一条或多条从 A 点到 B 点的路线:

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 example code will return you this:

此示例代码将返回给您:

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 modified to receive two locations and return the distance and any other needed information.

该函数可以很容易地修改为接收两个位置并返回距离和任何其他需要的信息。

I hope that helps you!

我希望对你有帮助!

回答by Francesco Cambria

Leo Dabus method could be used to calculate the geographical distance between your actual location and start one.

Leo Dabus 方法可用于计算您的实际位置和开始位置之间的地理距离。

In order to obtain the precise traveled distance, you have to update "traveledDistance" using the difference between the last position and the old one.

为了获得精确的行驶距离,您必须使用最后一个位置和旧位置之间的差异来更新“traveledDistance”。

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