【问题标题】:Calculate Total Traveled Distance iOS Swift计算总行驶距离iOS Swift
【发布时间】:2015-05-11 05:50:18
【问题描述】:

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

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

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

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

Objective-C 对我来说非常陌生,所以我一直无法弄清楚 swift 语法

这是我到目前为止的工作,不确定我是否做得对。虽然distanceFromLocationmethod 返回的都是 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)



}

【问题讨论】:

    标签: ios xcode swift core-location cllocation


    【解决方案1】:

    更新:Xcode 8.3.2 • Swift 3.1

    问题在于您总是一遍又一遍地获得相同的位置。试试这样:

    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

    【讨论】:

    • @LeoDabus 在第一次调用没有移动一英寸的情况下更新位置的距离超过 300 米
    • 第一个位置通常不准确。您可以在开始更新之前丢弃其中一些
    • @LeoDabus 在这一行,lastLocation.distanceFromLocation(lastLocation),有两个lastLocations。第一个应该是类变量,对吧?就这样? self.lastLocation.distanceFromLocation(lastLocation)
    • @Isuru 感谢我修复/更新代码的反馈
    • 距离以公里还是米为单位?
    【解决方案2】:

    Leo Dabus 方法可用于计算您的实际位置与起点之间的地理距离。

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

    这是我的实现:

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

    【讨论】:

      【解决方案3】:

      如果您想计算两点之间的路线距离,您需要使用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)
                      }  
                  }
              }
          }
      }
      

      此示例代码将返回:

      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
      

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

      希望对你有帮助!

      【讨论】:

        猜你喜欢
        • 2016-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-09
        相关资源
        最近更新 更多