distanceFromLocation - Calculate distance between two points
Just a quick question on Core Location, I'm trying to calculate the distance between two points, code is below:
-(void)locationChange:(CLLocation *)newLocation:(CLLocation *)oldLocation
{
// Configure the new event with information from the location.
CLLocationCoordinate2D newCoordinate = [newLocation coordinate];
CLLocationCoordinate2D oldCoordinate = [oldLocation coordinate];
CLLocationDistance kilometers = [newCoordinate distanceFromLocation:oldCoordinate] / 1000; // Error ocurring here.
CLLocationDistance meters = [newCoordinate distanceFromLocation:oldCoordinate]; // Error ocurring here.
}
I'm getting the following error on the last two lines:
error: cannot convert to a pointer type
I've been searching Google, but I cannot find anything.
Solution 1:
Try this instead:
CLLocationDistance meters = [newLocation distanceFromLocation:oldLocation];
The method you're trying to use is a method on a CLLocation object :)
Solution 2:
The distance is calculated between 2 CLLocations and not between to coordinates.
You need to use these coordinates to get the CLLocations for the respective coordinates using the following line of code
CLLocation *newLocation = [[CLLocation alloc] initWithCoordinate: newCoordinate altitude:1 horizontalAccuracy:1 verticalAccuracy:-1 timestamp:nil];
Similarly for the other coordinate and then you can calculate the distance between these two locations using the following line of code
CLLocationDistance kilometers = [newLocation distanceFromLocation:oldLocation] / 1000;
Hope this will help you.
Update: Swift 3.0
let distanceKiloMeters = (newLocation.distance(from: oldLocation))/1000
Solution 3:
In Swift
Let's create a method function that calculates distance between two locations:
func distanceBetweenTwoLocations(source:CLLocation,destination:CLLocation) -> Double{
var distanceMeters = source.distanceFromLocation(destination)
var distanceKM = distanceMeters / 1000
let roundedTwoDigit = distanceKM.roundedTwoDigit
return roundedTwoDigit
}
If you want only two digits:
extension Double{
var roundedTwoDigit:Double{
return Double(round(100*self)/100)
}
}
Solution 4:
If you're going to do with 2 CLLocationCoordinate2D values then you can use this.
This is Swift 2.1 on Xcode 7.1
import CoreLocation
extension CLLocationCoordinate2D {
func distanceInMetersFrom(otherCoord : CLLocationCoordinate2D) -> CLLocationDistance {
let firstLoc = CLLocation(latitude: self.latitude, longitude: self.longitude)
let secondLoc = CLLocation(latitude: otherCoord.latitude, longitude: otherCoord.longitude)
return firstLoc.distanceFromLocation(secondLoc)
}
}
Solution 5:
The problem here is that you're calling an object method:
- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location;
of class CLLocation.
CLLocationCoordinate2D is in fact a structure, consisting of two doubles:
typedef struct
{
CLLocationDegrees latitude;
CLLocationDegrees longitude;
} CLLocationCoordinate2D;
Proper way of doing this is to get a CLLocation
object and call distanceFromLocation
on it. Like this:
CLLocation* newLocation;
CLLocation* oldLocation;
CLLocationDistance distance = [newLocation distanceFromLocation:oldLocation];
Of course you first need to initialize both of those values (from CLLocationManager
, for instance).