Обратное геокодирование возвращает только один адрес из массивов широты, долготы - PullRequest
0 голосов
/ 28 октября 2019

У меня есть массив CLLocationCoordinates2D и я настроил цикл for для вызова функции get_addres_from_geoCoder, но эта функция печатает только один адрес, в то время как массив CLLocationCoordinates2D имеет 18 значений (lat, long)

override func viewDidLoad() {
  super.viewDidLoad()

  for a in My_rides_Pick_locatio
  {
     let loc =       CLLocationCoordinate2D(latitude:a.latitude,longitude: a.longitude)

     self.get_addres_from_geoCoder(loc:  loc)
  }
func get_addres_from_geoCoder(loc : CLLocationCoordinate2D) {


            let location: CLLocation =  CLLocation(latitude: loc.latitude, longitude: loc.longitude)

            geo.reverseGeocodeLocation(location as CLLocation, preferredLocale: nil) { (clPlacemark: [CLPlacemark]?, error: Error?) in
                guard let place = clPlacemark?.first else {
                    print("No placemark from Apple: \(String(describing: error))")
                    return
                }

                    print("----")
                    print(place.compactAddress!)

            }
    }
}

Результат


RA Bazaar Road, Равалпинди, Пакистан

Ответы [ 2 ]

0 голосов
/ 28 октября 2019

Крис прав в предыдущем ответе, что вам не следует «спамить» службу геокодирования Apple с большим количеством запросов, поскольку некоторые из них могут быть отброшены. Однако в этом случае я не уверен, что это именно то, что происходит, как если бы каждый из них потерпел неудачу, вызвал бы ваше защитное предложение (так как обработчик завершения все еще вызывается даже для запросов, которые отброшены в соответствии с документацией), и высообщение об ошибке будет напечатано 17 раз.

Похоже, что служба goecoding даже не примет запрос, если он уже активен. Некоторое краткое тестирование, которое я только что провел (потому что оно относится к одному из моих проектов, и я хотел быть уверен, что я его понял), похоже, подтверждает это, поскольку возвращает только ответ на первую отправленную координату и никогда не возвращает ошибкудля последующих.

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

let geo = CLGeocoder()

func reverse(locs: [CLLocation], number: Int = 1){
   guard !locs.isEmpty else {
      print("All Done")
      return
   }
   geo.reverseGeocodeLocation(locs.first!){ placemarks, error in
      print("-------------- \(number) -------------")
      if let error = error {
         print("Error \(error)")
      } else if let placemark = placemarks?.first {
         print("place: \(placemark)")
      }
      reverse(locs: Array(locs.dropFirst()), number: number + 1)
   }
}

ЧислоПараметр и операторы print просто включены, чтобы вы могли легко видеть, что происходит, и их нужно будет удалить из любой конечной базы кода.

Так же, как тривиальная демонстрация того, как его использовать, ниже приведен пример. Я успешно обработал массив из 20 мест в тестировании.

let c1 = CLLocation(latitude: 51.5074, longitude: 0.1278)
let c2 = CLLocation(latitude: 52.5074, longitude: -0.1278)
let c3 = CLLocation(latitude: 53.5074, longitude: -0.1378)
let c4 = CLLocation(latitude: 54.5074, longitude: -0.1578)
let c5 = CLLocation(latitude: 55.5074, longitude: -0.1778)

let c = [c1, c2, c3, c4, c5]

reverse(locs: c)
0 голосов
/ 28 октября 2019

Это ограничение Apple. См. Документацию.

Обсуждение Этот метод асинхронно передает указанные данные о местоположении на сервер геокодирования и возвращает данные. Когда запрос завершается, геокодер выполняет предоставленный обработчик завершения в основном потоке.

После инициирования запроса обратного геокодирования не пытайтесь инициировать другой запрос обратного или прямого геокодирования. Запросы на геокодирование ограничены для каждого приложения, поэтому выполнение слишком большого количества запросов за короткий промежуток времени может привести к сбою некоторых запросов. Когда максимальная скорость превышена, геокодер передает объект ошибки со значением CLError.Code.network вашему обработчику завершения.

...