2017-01-13 8 views
2

Я хочу создать функцию, которая принимает в качестве параметров:Найти ближайшее расположение между coodinates пользователя и координирует массив

  1. Массив заполнены координаты
  2. Текущего местоположение пользователя

и вернуть ближайшего местоположения между местоположением пользователя и местоположениями массива.

Вот мои места:

let coord1 = CLLocation(latitude: 52.45678, longitude: 13.98765) 
let coord2 = CLLocation(latitude: 52.12345, longitude: 13.54321) 
let coord3 = CLLocation(latitude: 48.771896, longitude: 2.270748000000026) 

пользователя функции местоположение:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    var userLocation:CLLocation = locations[0] 
    let long = userLocation.coordinate.longitude; 
    let lat = userLocation.coordinate.latitude; 

    let coordinates = [ coord1, coord2, coord3] 

    userLocation = CLLocation(latitude: lat, longitude: long) 

    print("my location: \(userLocation)") 
    closestLocation(locations: coordinates, closestToLocation: userLocation) 
} 

Координаты Функция сравнения

func closestLocation(locations: [CLLocation], closestToLocation location: CLLocation) -> CLLocation? { 

    if let closestLocation: CLLocation = locations.min(by: { userLocation.distance(from: $0) < userLocation.distance(from: $1) }) { 

     let distanceMeters = userLocation.distance(from: closestLocation) 
     let distanceKM = distanceMeters/1000 

     print("closest location: \(closestLocation), distance: \(distanceKM)") 
     return closestLocation 
    } else { 
     print("coordinates is empty") 
     return nil 
    } 

} 

Это фактически не работает, и моя функция closestLocation всегда возвращает огромное расстояние между двумя «ближайшими местоположениями».

Входные параметры

closestLocation(locations: coordinates, closestToLocation: userLocation) 

Редактировать

Результат при печати closestLocation и distanceKM:

closest location: <+48.77189600,+2.27074800> +/- 0.00m (speed -1.00 mps/course -1.00) @ 14/01/2017 00:16:04 heure normale d’Europe centrale, distance: 5409.0 

Как вы можете видеть, расстояние (в км) очень огромные, в то время как эти местоположения - один и тот же город.

+0

Что вы получаете, когда вы печатаете 'location'? Также попробуйте распечатать 'distance' на каждой итерации, чтобы узнать, какие значения они есть. – TheAmateurProgrammer

+0

Отредактировал вопрос всем, что вам нужно! –

ответ

4

Вы можете использовать Array.min(by:) найти минимальный элемент в соответствии с критериями сортировки (расстояние в вашем случае):

func closestLocation(locations: [CLLocation], closestToLocation location: CLLocation) -> CLLocation? { 
    if let closestLocation = locations.min(by: { location.distance(from: $0) < location.distance(from: $1) }) { 
     print("closest location: \(closestLocation), distance: \(location.distance(from: closestLocation))") 
     return closestLocation 
    } else { 
     print("coordinates is empty") 
     return nil 
    } 
} 

// We know the answer is coord3 and the distance is 0  
closestLocation(locations: [coord1, coord2, coord3], closestToLocation: coord3) 
+0

Спасибо за этот ответ. Но почему функция возвращает расстояние 8968450 метров? –

+0

Это не имеет смысла. Можете ли вы предоставить входные параметры, переданные в функцию «ближайшийLocation»? –

+0

Отредактировал вопрос со всем, что вам нужно! –