Найти ближайшее местоположение между координатами пользователя и массивом координат - PullRequest
1 голос
/ 07 ноября 2019

У меня есть следующий код для получения одного ближайшего местоположения:

Мои данные:

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)


closestLocation(locations: [coord1, coord2, coord3], closestToLocation: coord3)

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


    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

        var userLocation:CLLocation = locations[0]
        let long = userLocation.coordinate.longitude;
        let lat = userLocation.coordinate.latitude;

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

        print("My location: \(userLocation)")
    }

Как я могу вычислить, скажем, 2, ближайший к данному 4-му массиву для сравнения?

Моя идея состоит в том, чтобы получить текущее местоположение пользователя, сохранить его в БД, а затем отсортировать некоторые сообщения по местоположению. Итак, если у меня есть местоположение пользователя и местоположение сообщений, как я могу найти 2 ближайших к пользователю?

Спасибо

1 Ответ

2 голосов
/ 07 ноября 2019

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

extension Array where Element == CLLocation {
    func sortedByDistance(to location: CLLocation) -> [CLLocation] {
        return sorted(by: { location.distance(from: $0) < location.distance(from: $1) })
    }
}

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)
let coords = [coord1, coord2, coord3]

let sortedCoordinates = coords.sortedByDistance(to: coord3)
print(sortedCoordinates)
let closestTwoCoordinates = sortedCoordinates.prefix(2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...