CoreLocation を利用して移動速度を取得する方法です。
実行環境
- Xcode 8.0
- Swift 3.0
前提条件
ユーザが位置情報の使用を許可している必要があります。詳細は下記記事を参照してください。
iOS 8から位置情報を取得する方法が変わるよ - Qiita
実装方法
CLLocation クラスの CLLocationSpeed
プロパティを使います。
/*
* speed
*
* Discussion:
* Returns the speed of the location in m/s. Negative if speed is invalid.
*/
@available(iOS 2.2, *)
public var speed: CLLocationSpeed { get }
単位は秒速(m/s)です。速度が取得できない時はマイナスの値が返ります。
移動距離から速度を計算するため、精度はそこまで高くないようです。
実装例
startUpdatingLocation
を実行します。
override func viewDidLoad() {
super.viewDidLoad()
if CLLocationManager.locationServicesEnabled() {
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.startUpdatingLocation()
}
}
位置情報が更新されるたびに次のデリゲートが呼ばれます。
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let newLocation = locations.last,
CLLocationCoordinate2DIsValid(newLocation.coordinate) else {
return
}
self.mpsTextField.text = "".appendingFormat("%.2f", newLocation.speed)
self.kphTextField.text = "".appendingFormat("%.2f", newLocation.speed * 3.6)
}
実行結果
サンプルソース
おまけ
iOSシミュレータでは City Bicycle Ride(自転車で移動している場合)などをシミュレーションできますが、それぞれの移動速度を取得したところ次のような結果になりました。
City Run | City Bicycle Ride | Freeway Drive |
---|---|---|
約4m/s | 約7m/s | 約33m/s |
約14km/h | 約27km/h | 約120km/h |
Freeway Drive の移動速度が意外と速くて驚きました