Mapkit, как поменять координаты аннотации на ближайший адрес? - PullRequest
0 голосов
/ 09 октября 2018

У меня есть приложение для навигации, над которым я работаю, и одно из его применений заключается в том, что оно может вычислять среднее значение всех координат аннотаций, размещенных пользователем (через таблицу поиска, и каждая аннотация помещается при нажатии на результат) и найдите то, что вы могли бы назвать средней точкой, между всеми аннотациями.Эта средняя точка, однако, в настоящий момент проходит только по координатам, что означает, что в зависимости от того, где находятся текущие аннотации пользователей, эта средняя точка может оказаться в середине озера или леса, что бесполезно.Я хочу, чтобы он нашел ближайший адрес к координатам моей средней точки и вместо этого перенаправил туда аннотацию.Вот как создается аннотация:

@IBAction func middleFinderButton(_ sender: Any) {

    let totalLatitude = mapView.annotations.reduce(0) { $0 + $1.coordinate.latitude }

    let totalLongitude = mapView.annotations.reduce(0) { $0 + $1.coordinate.longitude }

    let averageLatitude = totalLatitude/Double(mapView.annotations.count)

    let averageLongitude = totalLongitude/Double(mapView.annotations.count)

    let centerPoint = MKPointAnnotation()

    centerPoint.coordinate.latitude = averageLatitude
    centerPoint.coordinate.longitude = averageLongitude

    mapView.addAnnotation(centerPoint)
}

Как я могу получить эту аннотацию 'centerPoint', чтобы настроить для ближайшего адреса?Спасибо.

1 Ответ

0 голосов
/ 10 октября 2018

Я бы просто использовал обратный геокод, возвращающий MKPlacemark.Документация предполагает, что обработчик завершения в основном потоке обычно возвращает только одну метку, так что вы можете сразу же использовать результат для обновления пользовательского интерфейса.MKPlacemark соответствует протоколу аннотаций, поэтому вы можете поместить его прямо на карту:

func resolveAddress(for averageCoordinate: CLLocationCoordinate2D, completion: @escaping (MKPlacemark?) -> () ) {

    let geocoder = CLGeocoder()
    let averageLocation = CLLocation(latitude: averageCoordinate.latitude, longitude: averageCoordinate.longitude)
    geocoder.reverseGeocodeLocation(averageLocation) { (placemarks, error) in
        guard error == nil,
            let placemark = placemarks?.first
             else {
            completion(nil)
            return
        }
        completion(MKPlacemark(placemark: placemark))
    }
}

@IBAction func middleFinderButton(_ sender: Any) {

    // your code to find center annotation

    resolveAddress(for: centerPoint.coordinate) { placemark in 
        if let placemark = placemark { 
            self.mapView.addAnnotation(placemark) 
        } else {
            self.mapView.addAnnotation(centerCoordinate) 
    }    
}   
...