MKLocalsearch Запросить близлежащие места БЕЗ естественного языка Query string
Можно ли все показать близлежащие места с помощью MKLocalSearchRequest, не предоставляя NaturalLanguageQuery?
Я знаю, что типичный маршрут для этого - использовать foursquare или google. Я использовал оба.
3 ответа
Я пытался достичь этого в течение некоторого времени, но самое близкое, что я пришел, - это использование цикла for для выполнения нескольких запросов и добавления результатов в основной массив. Невероятно неэффективно, очевидно, у вас был больший успех?
Моя стратегия
- Получите метку с помощью геокодера.
- Создайте поисковый текст, который выглядит нормально (в чем я не уверен).
- Запросите MKLocalSearch.
Псевдокод здесь.
func placemark() async throws -> CLPlacemark? {
// (1)
let geocoder: CLGeocoder = .init()
let location: CLLocation = .init(
latitude: coordinate.latitude,
longitude: coordinate.longitude
)
return try await geocoder.reverseGeocodeLocation(location).first
}
func findNearbyMapItems() async {
guard let placemark = placemark else {
return
}
// (2)
let searchText: String = Array(Set([
placemark.administrativeArea ?? "",
placemark.subAdministrativeArea ?? "",
placemark.locality ?? "",
])).joined(separator: " ").trimmingCharacters(in: .whitespacesAndNewlines)
// (3)
let nearbyMeters: CLLocationDistance = 500
let request = MKLocalSearch.Request()
request.naturalLanguageQuery = searchText
request.resultTypes = [.pointOfInterest]
request.region = MKCoordinateRegion(
center: center,
latitudinalMeters: nearbyMeters,
longitudinalMeters: nearbyMeters
)
let response = try await MKLocalSearch(request: request).start()
return response.mapItems
}
Другое решение работает только для POI.
func mapItemsNearbyPOIOnSystem(radius: CLLocationDistance = 500) async throws -> [MKMapItem] {
let request: MKLocalPointsOfInterestRequest = .init(center: coordinate, radius: radius)
let response = try await MKLocalSearch(request: request).start()
return response.mapItems
}
Вы можете добиться этого в демонстрационных целях следующим образом, но я бы не рекомендовал использовать этот подход в производственном приложении, поскольку он явно не масштабируется.
var nearbyPlaces: [MKMapItem] = []
let params: [String] = ["bar", "shop", "restaurant", "cinema"]
let request = MKLocalSearchRequest()
let span = MKCoordinateSpan(latitudeDelta: CLLocationDegrees(exactly: 1000)!, longitudeDelta: CLLocationDegrees(exactly: 1000)!)
let region = MKCoordinateRegion(center: coord, span: span)
request.region = region
for param in params {
request.naturalLanguageQuery = param
let places = MKLocalSearch(request: request)
places.start { [unowned self] response, error in
guard let result = response else { return }
self.nearbyPlaces.append(contentsOf: result.mapItems)
}
}