I would like to be able to display the speed the device is travelling at in a simple label.
I have found this on apples website:
var speed: CLLocationSpeed { get }
source
The code above puts speed in m/s
and I can therefore convert it to miles per hour etc.
How can i use this code to display the speed?
I know this can be done because snapchat has it as a filter.
Updated to Swift 4
This may be more than what you are looking for but should help hopefully.
import UIKit
import MapKit
import CoreLocation
class TestViewController: UIViewController, CLLocationManagerDelegate {
//MARK: Global Var's
var locationManager: CLLocationManager = CLLocationManager()
var switchSpeed = "KPH"
var startLocation:CLLocation!
var lastLocation: CLLocation!
var traveledDistance:Double = 0
var arrayMPH: [Double]! = []
var arrayKPH: [Double]! = []
//MARK: IBoutlets
@IBOutlet weak var speedDisplay: UILabel!
@IBOutlet weak var headingDisplay: UILabel!
@IBOutlet weak var latDisplay: UILabel!
@IBOutlet weak var lonDisplay: UILabel!
@IBOutlet weak var distanceTraveled: UILabel!
@IBOutlet weak var minSpeedLabel: UILabel!
@IBOutlet weak var maxSpeedLabel: UILabel!
@IBOutlet weak var avgSpeedLabel: UILabel!
//MARK: Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
minSpeedLabel.text = "0"
maxSpeedLabel.text = "0"
// Ask for Authorisation from the User.
self.locationManager.requestAlwaysAuthorization()
// For use in foreground
self.locationManager.requestWhenInUseAuthorization()
if CLLocationManager.locationServicesEnabled() {
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
locationManager.startUpdatingLocation()
}
}
// 1 mile = 5280 feet
// Meter to miles = m * 0.00062137
// 1 meter = 3.28084 feet
// 1 foot = 0.3048 meters
// km = m / 1000
// m = km * 1000
// ft = m / 3.28084
// 1 mile = 1609 meters
//MARK: Location
private func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let location = locations.last
if (location!.horizontalAccuracy > 0) {
updateLocationInfo(latitude: location!.coordinate.latitude, longitude: location!.coordinate.longitude, speed: location!.speed, direction: location!.course)
}
if lastLocation != nil {
traveledDistance += lastLocation.distance(from: locations.last!)
if switchSpeed == "MPH" {
if traveledDistance < 1609 {
let tdF = traveledDistance / 3.28084
distanceTraveled.text = (String(format: "%.1f Feet", tdF))
} else if traveledDistance > 1609 {
let tdM = traveledDistance * 0.00062137
distanceTraveled.text = (String(format: "%.1f Miles", tdM))
}
}
if switchSpeed == "KPH" {
if traveledDistance < 1609 {
let tdMeter = traveledDistance
distanceTraveled.text = (String(format: "%.0f Meters", tdMeter))
} else if traveledDistance > 1609 {
let tdKm = traveledDistance / 1000
distanceTraveled.text = (String(format: "%.1f Km", tdKm))
}
}
}
lastLocation = locations.last
}
func updateLocationInfo(latitude: CLLocationDegrees, longitude: CLLocationDegrees, speed: CLLocationSpeed, direction: CLLocationDirection) {
let speedToMPH = (speed * 2.23694)
let speedToKPH = (speed * 3.6)
let val = ((direction / 22.5) + 0.5);
var arr = ["N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"];
let dir = arr[Int(val.truncatingRemainder(dividingBy: 16))]
//lonDisplay.text = coordinateString(latitude, longitude: longitude)
lonDisplay.text = (String(format: "%.3f", longitude))
latDisplay.text = (String(format: "%.3f", latitude))
if switchSpeed == "MPH" {
// Chekcing if speed is less than zero or a negitave number to display a zero
if (speedToMPH > 0) {
speedDisplay.text = (String(format: "%.0f mph", speedToMPH))
arrayMPH.append(speedToMPH)
let lowSpeed = arrayMPH.min()
let highSpeed = arrayMPH.max()
minSpeedLabel.text = (String(format: "%.0f mph", lowSpeed!))
maxSpeedLabel.text = (String(format: "%.0f mph", highSpeed!))
avgSpeed()
} else {
speedDisplay.text = "0 mph"
}
}
if switchSpeed == "KPH" {
// Checking if speed is less than zero
if (speedToKPH > 0) {
speedDisplay.text = (String(format: "%.0f km/h", speedToKPH))
arrayKPH.append(speedToKPH)
let lowSpeed = arrayKPH.min()
let highSpeed = arrayKPH.max()
minSpeedLabel.text = (String(format: "%.0f km/h", lowSpeed!))
maxSpeedLabel.text = (String(format: "%.0f km/h", highSpeed!))
avgSpeed()
// print("Low: \(lowSpeed!) - High: \(highSpeed!)")
} else {
speedDisplay.text = "0 km/h"
}
}
// Shows the N - E - S W
headingDisplay.text = "\(dir)"
}
func avgSpeed(){
if switchSpeed == "MPH" {
let speed:[Double] = arrayMPH
let speedAvg = speed.reduce(0, +) / Double(speed.count)
avgSpeedLabel.text = (String(format: "%.0f", speedAvg))
//print( votesAvg )
} else if switchSpeed == "KPH" {
let speed:[Double] = arrayKPH
let speedAvg = speed.reduce(0, +) / Double(speed.count)
avgSpeedLabel.text = (String(format: "%.0f", speedAvg))
//print( votesAvg
}
}
//MARK: Buttons
@IBOutlet weak var switchSpeedStatus: UIButton!
@IBAction func speedSwtich(sender: UIButton) {
if switchSpeed == "MPH" {
switchSpeed = "KPH"
switchSpeedStatus.setTitle("KPH", for: .normal)
} else if switchSpeed == "KPH" {
switchSpeed = "MPH"
switchSpeedStatus.setTitle("MPH", for: .normal)
}
}
@IBAction func restTripButton(sender: AnyObject) {
arrayMPH = []
arrayKPH = []
traveledDistance = 0
minSpeedLabel.text = "0"
maxSpeedLabel.text = "0"
headingDisplay.text = "None"
speedDisplay.text = "0"
distanceTraveled.text = "0"
avgSpeedLabel.text = "0"
}
@IBAction func startTrip(sender: AnyObject) {
locationManager.startUpdatingLocation()
}
@IBAction func endTrip(sender: AnyObject) {
locationManager.stopUpdatingLocation()
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With