In the question posted here, the user asked:
I have an array full of longitudes and latitudes. I have two double variables with my users location. I'd like to test the distance between my user's locations against my array to see which location is the closest. How do I do this?
This will get the distance between 2 location but stuggeling to understand how I'd test it against an array of locations.
In response, he got the following code:
NSArray *locations = //your array of CLLocation objects
CLLocation *currentLocation = //current device Location
CLLocation *closestLocation;
CLLocationDistance smallestDistance = DBL_MAX; // set the max value
for (CLLocation *location in locations) {
CLLocationDistance distance = [currentLocation distanceFromLocation:location];
if (distance < smallestDistance) {
smallestDistance = distance;
closestLocation = location;
}
}
NSLog(@"smallestDistance = %f", smallestDistance);
I have the exact same problem in an application I'm working on, and I think this piece of code could work perfectly. However, I'm using Swift, and this code is in Objective-C.
My only question is: how should it look in Swift?
Thanks for any help. I'm new to all of this, and seeing this piece of code in Swift could be a big leg up.
var closestLocation: CLLocation?
var smallestDistance: CLLocationDistance?
for location in locations {
let distance = currentLocation.distanceFromLocation(location)
if smallestDistance == nil || distance < smallestDistance {
closestLocation = location
smallestDistance = distance
}
}
print("smallestDistance = \(smallestDistance)")
or as a function:
func locationInLocations(locations: [CLLocation], closestToLocation location: CLLocation) -> CLLocation? {
if locations.count == 0 {
return nil
}
var closestLocation: CLLocation?
var smallestDistance: CLLocationDistance?
for location in locations {
let distance = location.distanceFromLocation(location)
if smallestDistance == nil || distance < smallestDistance {
closestLocation = location
smallestDistance = distance
}
}
print("closestLocation: \(closestLocation), distance: \(smallestDistance)")
return closestLocation
}
For Swift 3 I have created this little piece of "functional" code:
let coord1 = CLLocation(latitude: 52.12345, longitude: 13.54321)
let coord2 = CLLocation(latitude: 52.45678, longitude: 13.98765)
let coord3 = CLLocation(latitude: 53.45678, longitude: 13.54455)
let coordinates = [coord1, coord2, coord3]
let userLocation = CLLocation(latitude: 52.23678, longitude: 13.55555)
let closest = coordinates.min(by:
{ $0.distance(from: userLocation) < $1.distance(from: userLocation) })
func closestLoc(userLocation:CLLocation){
var distances = [CLLocationDistance]()
for location in locations{
let coord = CLLocation(latitude: location.latitude!, longitude: location.longitude!)
distances.append(coord.distance(from: userLocation))
print("distance = \(coord.distance(from: userLocation))")
}
let closest = distances.min()//shortest distance
let position = distances.index(of: closest!)//index of shortest distance
print("closest = \(closest!), index = \(position)")
}