2016-11-07 8 views
0

Я хотел бы выполнить поиск местоположения, например приложение Apple Weather, которое отображает таблицу потенциальных местоположений с каждым нажатием клавиши. Я посылаю входную строку пользователя в функцию ниже каждый раз, когда в текстовом поле происходит событие «edit changed». Строка, кажется, отправляется правильно, но я не возвращаю ожидаемый массив меток. Например, «Честнат» возвращает только «Честнат, Иллинойс», но если я наберу «Честнат Привет», я получаю четыре элемента: «Маршфилд, Массачусетс», «Уилбрахам, Массачусетс», «Южный Хэдли, Массачусетс» и «Гринфилд, Массачусетс» ». Затем набрав «Chesnut Hil», возвращается «Brookline, MA», который даже не был в списке «Честнат-привет». Код ниже. Большое спасибо!Поиск местоположения на клавиатуре, например приложение Apple Weather

func forwardGeocoding(address: String) { 
    CLGeocoder().geocodeAddressString(address, completionHandler: { (placemarks, error) in 
     if error != nil { 
      print(error!) 
      return 
     } 
     var placeName = "" 
     var placeCoordinate = "" 
     self.placeNames = [] // empty arrays at the start of each geocode result 
     self.placeCoordinates = [] 

     if (placemarks?.count)! > 0 { 

      for placemark in placemarks! { 

       if placemark.country != "United States" { 
        let city = placemark.locality ?? "" 
        let country = placemark.country ?? "" 
        placeName = "\(city) \(country)" 
       } else { 
        let city = placemark.locality ?? "" 
        placeName = "\(city), \(placemark.administrativeArea!)" 
       } 

       let coordinate = placemark.location?.coordinate 
       placeCoordinate = "\(coordinate!.latitude), \(coordinate!.longitude)" 
       self.placeNames.append(placeName) 
       self.placeCoordinates.append(placeCoordinate) 
      } 
     } 
     self.tableView.reloadData() 
    }) 
} 

ответ

2

Некоторые известные фрагменты из CLGeocoder docs, подчеркивания добавлено:

Объекта геокодера является объектом однократный, что работает с сетевым сервисом на основе искать информацию меток для его указания значение координаты


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


Компьютер или устройство должно иметь доступ к сети для того, чтобы объект геокодера вернуть подробную информацию Placemark

Все это говорит о том, что а) с помощью CLGeocoder вернуться и уточнить «, как вы типа ", вероятно, не будет работать хорошо, в общем и б), поэтому, вероятно, это не то, что Apple использует в погоде.

Помните, что Погода не хочет отображать введенные пользователем строки в lat/longs на земном шаре - он ищет по список мест. (В частности, список мест, для которых партнеры по прогнозированию погоды Apple предоставляют данные.) Если это то, что вы хотите искать, вам понадобится ваш собственный такой список.

Если вы хотите, чтобы результаты поиска «по мере ввода» вам лучше всего обслуживали локальная база данных или, по крайней мере, веб-сервис, специально предназначенный для этого использования. Как отмечено в this old answer, для этого есть множество вариантов: Google предлагает некоторые услуги, а GeoNames.org - это бесплатный/открытый вариант, который имеет как веб-сервисы, так и загружаемые базы данных, которые вы могли бы встроить в свое приложение.

Как только у вас будет такая база данных/служба, вы также захотите подумать о том, как вы ее используете. Например, вы хотите, чтобы «каштан привет» нашел Честнат-Хилл, Пенсильвания или (предположительно, нет ни одного) Каштана, Гавайи? Как вы предварительно обрабатываете строки поиска и вносите их в запросы к базе данных, повлияет на ваши результаты.

 Смежные вопросы

  • Нет связанных вопросов^_^