как получить направление до ближайшего пина в mapkit - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь получить направление к ближайшему контакту из текущего местоположения пользователя.

-Мой код

 let locationManager = CLLocationManager()
 var currentCoordinate: CLLocationCoordinate2D!

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let pins = mapView?.annotations
    // let currentLocation = mapView?.userLocation.location
    guard let currentLocation = locations.first else { return }
    currentCoordinate = currentLocation.coordinate
    let nearestPin: MKAnnotation? = pins!.reduce((CLLocationDistanceMax,nil)) { (nearest, pin) -> (CLLocationDistance, MKAnnotation) in
        let coord = pin.coordinate
        let loc = CLLocation(latitude: coord.latitude, longitude: coord.longitude)
        let distance = currentLocation.distance(from: loc)
        print(distance, pin)
        return distance < nearest.0 ? (distance, pin) : nearest as! (CLLocationDistance, MKAnnotation)
        } as AnyObject as? MKAnnotation
    if nearestPin?.title == "Test"{
        print("found")
    }
}

, но он также не работает

спасибо

1 Ответ

0 голосов
/ 21 февраля 2019

Прежде всего, проверьте, если вы установили конфиденциальность местоположения в вашем Info.plist.В вашем случае я проверяю авторизацию в расширении.

CLLocationManagerDelegate

extension ViewController: CLLocationManagerDelegate{
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
    checkLocationAuthorization()
}

Не забудьте установить делегата в viewDidLoad()

Делегат
locationManager.delegate = self

Теперь перейдем к актуальному вопросу.Я создал приватную функцию, которую можно вызывать в

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

Поиск ближайшей аннотации

Я полагаю, у вас объявлен массив аннотаций (var annotation = [MKAnnotation]()).Мы будем использовать эти аннотации (в моем случае Париж и Амстердам) по сравнению с нашим текущим местоположением, чтобы найти наиболее близкие.

    private func getNearestPin(locations: [CLLocation]) -> MKAnnotation? {

    let allPinsOnMap = mapView?.annotations

    guard let currentLocation = locations.first else { return nil }
    if let pins = allPinsOnMap {

        let nearestPin: (CLLocationDistance, MKAnnotation?) = pins.reduce((CLLocationDistanceMax,nil))
        { (nearest, pin) -> (CLLocationDistance, MKAnnotation?) in
            let coord = pin.coordinate
            let loc = CLLocation(latitude: coord.latitude, longitude: coord.longitude)
            let distance = currentLocation.distance(from: loc)

            return distance < nearest.0 ? (distance, pin) : nearest
        }
        return nearestPin.1

    }
   return nil
}


Функция вернет MKAnnotation?, поэтому, когда мы вызываем функцию, мы должны проверить, не возвращает ли она ноль.Мы называем эту функцию в нашем расширении!

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    if let nearest = getNearestPin(locations: locations) {
        if nearest.title == "Amsterdam" {
            print("Nearest is available: \(nearest.title! ?? "Title")")
        }
    }
}

Если у вас есть дополнительные вопросы или пожелания, пожалуйста, дайте мне знать!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...