从用户位置查找数组中最近的经度和纬度 - iOS Swift
Find closest longitude and latitude in array from user location - iOS Swift
在发布的问题 here 中,用户问:
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.
作为响应,他得到了以下代码:
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);
我正在处理的应用程序中存在完全相同的问题,我认为这段代码可以完美运行。但是,我正在使用 Swift,此代码位于 Objective-C.
我唯一的问题是:它在 Swift 中应该如何显示?
感谢您的帮助。我对这一切都是新手,在 Swift 中看到这段代码可能是一个很大的进步。
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)")
或作为函数:
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
}
为了 Swift 3 我创建了这段 "functional" 代码:
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:
{ [=10=].distance(from: userLocation) < .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)")
}
在发布的问题 here 中,用户问:
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.
作为响应,他得到了以下代码:
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);
我正在处理的应用程序中存在完全相同的问题,我认为这段代码可以完美运行。但是,我正在使用 Swift,此代码位于 Objective-C.
我唯一的问题是:它在 Swift 中应该如何显示?
感谢您的帮助。我对这一切都是新手,在 Swift 中看到这段代码可能是一个很大的进步。
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)")
或作为函数:
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
}
为了 Swift 3 我创建了这段 "functional" 代码:
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:
{ [=10=].distance(from: userLocation) < .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)")
}