web-dev-qa-db-ja.com

総移動距離を計算するiOS Swift

SwiftのCoreLocationを使用して総移動距離を計算するにはどうすればよいですか?

これを行う方法については、これまでのところSwift for iOS 8)でリソースを見つけることができませんでした。

位置の追跡を開始してから移動した合計距離をどのように計算しますか?

これまで読んだ内容から、ポイントの位置を保存し、現在のポイントと最後のポイントの間の距離を計算して、その距離を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)



}
10
YichenBman

更新:Xcode8.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()
        }
    }
}

サンプルプロジェクト

18
Leo Dabus

MKDirectionsRequestを使用する必要がある2つのポイント間のルート距離を計算する場合、これにより、ポイントAからポイントBへの1つまたは複数のルートが段階的に返されます。命令:

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

この関数は、2つの場所を受け取り、距離やその他の必要な情報を返すように簡単に変更できます。

お役に立てば幸いです。

5
Icaro

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