MapKit Определите желаемый тип результатов поиска (Страна, город, регион и т. Д.)
Для приложения, которое я создаю, я хочу реализовать функцию, которая позволяет пользователям указывать географическое происхождение вин (страна (например, Франция), регион (например, Бордо), субрегион (например, Пауллак)).
Я хочу убедиться, что мне не нужно добавлять все доступные страны самостоятельно, и что вся информация, поступающая в базу данных, является действительной. Поэтому я решил сделать это следующим образом:
- Пользователь добавляет новое вино и вводит название страны, из которой оно происходит.
- Во время набора приложение выполняет поиск в базе данных карт Apple.
- Результаты этого поиска отображаются в виде предложений, и когда пользователь нажимает на предложение, приложение создает
Country
объект со всей соответствующей информацией. Винный фургон может быть спасен только при наличии такого объекта
Это прекрасно работает, за исключением одного: карты Apple возвращают что угодно, например, рестораны, магазины и так далее, откуда угодно.
Мой вопрос: как мне указать ЧТО я ищу? Я могу указать только регион, в котором я ищу, что не имеет значения в моем случае. Я хотел бы иметь возможность указывать карты яблок ТОЛЬКО для поиска стран, регионов, городов, чего угодно. Это возможно каким-то образом? Я исчерпал Google для этого и до сих пор не нашел пути.
5 ответов
Я работал с MapKit и не верю, что вы можете помочь автозаполнению для записей пользователей, поскольку они вводят лучшее решение, которое я нашел, это автозаполнение API Google Place
iOS прямо сейчас обеспечивает получение гео-координат при отправке хорошо отформатированного адреса, или вы можете получить адрес при отправке пары координат. Или точки интереса для названий мест или координат.
Лучшее решение, которое мы нашли, - отфильтровать результаты, используя запятую в заголовке результата. В основном это только те результаты, которые соответствуют формату города, например Detroit, MI, United States
, Мы добавили этот фильтр к предложенным @Ben Stahl. Решение Бена отфильтровывало крайние случаи, когда запятая составляла часть названия бизнеса.
Обычно это возвращает правильный результат в течение трех символов. Чтобы ответить на вопрос ОП, вы можете проанализировать эту строку по городу, штату или стране, чтобы получить желаемый результат.
Для лучших результатов вы можете использовать Google Places API.
func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
self.searchResults = completer.results.filter { result in
if !result.title.contains(",") {
return false
}
if result.title.rangeOfCharacter(from: CharacterSet.decimalDigits) != nil {
return false
}
if result.subtitle.rangeOfCharacter(from: CharacterSet.decimalDigits) != nil {
return false
}
return true
}
self.searchResultsCollectionView.reloadData()
}
Если исходить из того, что сказал @Trevor, я обнаружил отклонение результатов, когда заголовок или подзаголовок с числами дают довольно хорошие результаты, если вам нужны только города и поселки.
КодSwift 4.1:
// Store this as a property if you're searching a lot.
let digitsCharacterSet = NSCharacterSet.decimalDigits
let filteredResults = completer.results.filter { result in
if result.title.rangeOfCharacter(from: digitsCharacterSet) != nil {
return false
}
if result.subtitle.rangeOfCharacter(from: digitsCharacterSet) != nil {
return false
}
return true
}
или более компактно:
let filteredResults = completer.results.filter({ $0.title.rangeOfCharacter(from: digitsCharacterSet) == nil && $0.subtitle.rangeOfCharacter(from: digitsCharacterSet) == nil })
В дополнение к ответу Аллана я обнаружил, что если вы фильтруете по свойству subtitle объекта MkLocalSearchCompletion, вы можете удалить бизнес-записи.
В iOS 9.3 был добавлен класс MapKit под названием MKLocalSearchCompleter, который помогает с автозаполнением. Вы можете отфильтровать то, что возвращается, используя "MKSearchCompletionFilterType", но это не самое обширное и может не полностью помочь в вашей ситуации. Он возвращает города и страны как результаты, но также возвращает бизнес, когда я его использовал.
Один из возможных вариантов - снова отфильтровать возвращаемые результаты на стороне приложения и исключить все результаты, в которых есть числовой символ.
func setupCompleter() {
self.searchCompleter = MKLocalSearchCompleter()
self.searchCompleter?.delegate = self
self.searchCompleter?.filterType = .locationsOnly
self.searchCompleter?.queryFragment = "Bordeaux"
}
func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
print("Results \(completer.results)")
// Do additional filtering on results here
}