Функция текстового поиска (новая) возвращает информацию о наборе мест на основе строки (например, "пицца в Нью-Йорке", "обувные магазины рядом с Оттавой" или "Главная улица, 123"). Сервис отвечает списком мест, соответствующих текстовой строке, с учетом любых заданных параметров местоположения.
Помимо обязательных параметров , функция текстового поиска (новая версия) поддерживает уточнение запросов с помощью необязательных параметров для получения лучших результатов.
Получите список мест с помощью текстового поиска.
Выполните запрос на текстовый поиск, вызвав GMSPlacesClient searchByTextWithRequest: передав объект GMSPlaceSearchByTextRequest , определяющий параметры запроса, и метод обратного вызова типа GMSPlaceSearchByTextResultCallback для обработки ответа.
Объект GMSPlaceSearchByTextRequest определяет все обязательные и необязательные параметры запроса. К обязательным параметрам относятся:
- Список полей, которые должны быть возвращены в объекте
GMSPlace, также называемый маской полей , определяется свойствомGMSPlaceProperty. Если вы не укажете хотя бы одно поле в списке полей или если вы его опустите, вызов вернет ошибку. - Текстовый запрос .
В этом примере запроса на текстовый поиск указано, что объекты GMSPlace в ответе должны содержать название места и идентификатор места для каждого объекта GMSPlace в результатах поиска. Он также фильтрует ответ, чтобы возвращать только места типа «ресторан».
Places Swift SDK
let restriction = GMSPlaceRectangularLocationOption( northEast: CLLocationCoordinate2D(latitude: 20, longitude: 30), southWest: CLLocationCoordinate2D(latitude: 40, longitude: 50) ) let searchByTextRequest = SearchByTextRequest( textQuery: "pizza in New York", placeProperties: [ .name, .placeID ], locationRestriction: restriction, includedType: .restaurant, maxResultCount: 5, minRating: 3.5, priceLevels: [ .moderate, .inexpensive ], isStrictTypeFiltering: true ) switch await placesClient.searchByText(with: searchByTextRequest) { case .success(let places): // Handle places case .failure(let placesError): // Handle error }
Быстрый
// Create the GMSPlaceSearchByTextRequest object. let myProperties = [GMSPlaceProperty.name, GMSPlaceProperty.placeID].map {$0.rawValue} let request = GMSPlaceSearchByTextRequest(textQuery:"pizza in New York", placeProperties:myProperties) request.isOpenNow = true request.includedType = "restaurant" request.maxResultCount = 5 request.minRating = 3.5 request.rankPreference = .distance request.isStrictTypeFiltering = true request.locationBias = GMSPlaceCircularLocationOption(CLLocationCoordinate2DMake(40.7, -74.0), 200.0) // Array to hold the places in the response var placeResults: [GMSPlace] = [] let callback: GMSPlaceSearchByTextResultCallback = { [weak self] results, error in guard let self, error == nil else { if let error { print(error.localizedDescription) } return } guard let results = results as? [GMSPlace] else { return } placeResults = results } GMSPlacesClient.shared().searchByText(with: request, callback: callback)
Objective-C
// Create the GMSPlaceSearchByTextRequest object. GMSPlaceSearchByTextRequest *request = [[GMSPlaceSearchByTextRequest alloc] initWithTextQuery:@"pizza in New York" placeProperties:@[GMSPlacePropertyName, GMSPlacePropertyPlaceID]]; request.isOpenNow = YES; request.includedType = @"restaurant"; request.maxResultCount = 5; request.minRating = 3.5; request.rankPreference = GMSPlaceSearchByTextRankPreferenceDistance; request.isStrictTypeFiltering = YES; request.priceLevels = @[ @(kGMSPlacesPriceLevelFree), @(kGMSPlacesPriceLevelCheap) ]; request.locationBias = GMSPlaceCircularLocationOption(CLLocationCoordinate2DMake(40.7, -74.0), 200.0); // Array to hold the places in the response _placeResults = [NSArray array]; // Create the GMSPlaceSearchByTextRequest object. [_placesClient searchByTextWithRequest:request callback:^(NSArray<GMSPlace *> *_Nullable placeResults, NSError * _Nullable error) { if (error != nil) { NSLog(@"An error occurred %@", [error localizedDescription]); return; } else { if (placeResults.count > 0) { // Get list of places. _placeResults = placeResults; } } } ];
Ответы на текстовый поиск
API текстового поиска возвращает массив совпадений в виде объектов GMSPlace , причем для каждого совпавшего места используется один объект GMSPlace .
Получить статус "Открыто"
Объект GMSPlacesClient содержит функцию-член с именем isOpenWithRequest ( isOpenRequest в Swift и isPlaceOpenRequest в GooglePlacesSwift), которая возвращает ответ, указывающий, открыто ли место в данный момент, исходя из времени, указанного в вызове.
Этот метод принимает один аргумент типа GMSPlaceIsOpenWithRequest , содержащий:
- Объект
GMSPlaceили строка, указывающая идентификатор места. Дополнительную информацию о создании объекта Place с необходимыми полями см. в разделе «Подробности о месте» . - Необязательный объект
NSDate(Obj-C) илиDate(Swift), указывающий время, которое вы хотите проверить. Если время не указано, используется текущее время. - Метод
GMSPlaceOpenStatusResponseCallbackдля обработки ответа. >
Для работы метода GMSPlaceIsOpenWithRequest необходимо задать следующие поля в объекте GMSPlace :
-
GMSPlacePropertyUTCOffsetMinutes -
GMSPlacePropertyBusinessStatus -
GMSPlacePropertyOpeningHours -
GMSPlacePropertyCurrentOpeningHours -
GMSPlacePropertySecondaryOpeningHours
Если эти поля не указаны в объекте Place или если вы передаете идентификатор места, метод использует GMSPlacesClient GMSFetchPlaceRequest: для их получения.
isOpenWithRequest response
isOpenWithRequest возвращает объект GMSPlaceIsOpenResponse , содержащий логическое значение с именем status , указывающее, открыто ли предприятие, закрыто или его статус неизвестен.
| Язык | Значение при открытии | Стоимость при закрытии | Значение, если статус неизвестен |
|---|---|---|---|
| Места Свифт | true | false | nil |
| Быстрый | .open | .closed | .unknown |
| Objective-C | GMSPlaceOpenStatusOpen | GMSPlaceOpenStatusClosed | GMSPlaceOpenStatusUnknown |
Оплата за isOpenWithRequest
- Поля
GMSPlacePropertyUTCOffsetMinutesиGMSPlacePropertyBusinessStatusоплачиваются в рамках SKU «Основные данные» . Остальные данные о часах работы оплачиваются в рамках SKU «Подробная информация о месте» для предприятий. - Если ваш объект
GMSPlaceуже содержит эти поля из предыдущего запроса, повторная оплата взиматься не будет.
Пример: Выполните запрос GMSPlaceIsOpenWithRequest
В следующем примере показано, как инициализировать объект GMSPlaceIsOpenWithRequest внутри существующего объекта GMSPlace . Places Swift SDK
let isOpenRequest = IsPlaceOpenRequest(place: place) switch await placesClient.isPlaceOpen(with: isOpenRequest) { case .success(let isOpenResponse): switch isOpenResponse.status { case true: // Handle open case false: // Handle closed case nil: // Handle unknown case .failure(let placesError): // Handle error }
Быстрый
let isOpenRequest = GMSPlaceIsOpenRequest(place: place, date: nil) GMSPlacesClient.shared().isOpen(with: isOpenRequest) { response, error in if let error = error { // Handle Error } switch response.status { case .open: // Handle open case .closed: // Handle closed case .unknown: // Handle unknown } }
Objective-C
GMSPlaceIsOpenRequest *isOpenRequest = [[GMSPlaceIsOpenRequest alloc] initWithPlace:place date:nil]; [[GMSPlacesClient sharedClient] isOpenWithRequest:isOpenRequest callback:^(GMSPlaceIsOpenResponse response, NSError *_Nullable error) { if (error) { // Handle error } switch (response.status) { case GMSPlaceOpenStatusOpen: // Handle open case GMSPlaceOpenStatusClosed: // Handle closed case GMSPlaceOpenStatusUnknown: // Handle unknown } }];
Пагинация
Функция поиска по тексту предоставляет объект пагинации , логический параметр hasNextPage , который возвращается в первом ответе на вызов функции поиска по тексту. Если следующая страница доступна, вы можете использовать функцию fetchNextPage() для ее загрузки.
В следующем примере показано, как проверить наличие следующей страницы и затем загрузить её.
Быстрый
public struct PlaceSearchPagination { public var pageSize: Int public var hasNextPage: Bool public func fetchNextPage() async -> SearchByTextResponse } public struct SearchByTextResponse { public var pagination: PlaceSearchPagination? public var places: [Place]? public var error: PlaceError? } PlacesClient.swift public func searchByText(with request: SearchByTextRequest) async -> SearchByTextResponse let searchByTextRequest = SearchByTextRequest(textQuery: "restaurants", placeProperties: [PlaceProperty.displayName], locationBias: CircularCoordinateRegion(center: CLLocationCoordinate2D(latitude: 0, longitude: 0), radius: 100)) searchByTextRequest.maxResultCount = 10 var searchByTextResponse = await PlacesClient.shared.searchByText(with: searchByTextRequest) print("Found \(searchByTextResponse.places.count) places") searchByTextResponse.pagination.pageSize = 20 // Continue making requests until no more results are found in pagination object while searchByTextResponse.pagination.hasNextPage { searchByTextResponse = await searchByTextResponse.pagination.fetchNextPage() print("Found \(searchByTextResponse.places.count) places") }
Objective-C
GMSPlaceSearchByTextRequest *searchByTextRequest = [[GMSPlaceSearchByTextRequest alloc] initWithTextQuery: @"restaurants" placeProperties: @[GMSPlacePropertyAll]]; searchByTextRequest.maxResultCount = 10; __block void (^recursiveCallback)(GMSPlaceSearchByTextResponse *, NSError *); recursiveCallback = ^(GMSPlaceSearchByTextResponse * response, NSError* error) { NSLog(@"Found %d places", response.places.count); if (response.pagination.hasNextPage) { [response.pagination fetchNextPageWithCompletion:recursiveCallback]; } }; [GMSPlacesClient.sharedClient searchByTextWithRequest:searchByTextRequest completion:recursiveCallback];
Необходимые параметры
Используйте объект GMSPlaceSearchByTextRequest для указания необходимых параметров поиска.
Список полей
Укажите, какие свойства данных места следует вернуть. Передайте список свойств
GMSPlace, указывающих поля данных для возврата. Если вы не укажете маску поля, запрос вернет ошибку.Использование списков полей — это хорошая практика проектирования, позволяющая избежать запроса лишних данных, что помогает сэкономить время на обработке и увеличить расходы на выставление счетов.
Укажите одно или несколько из следующих полей:
Следующие поля активируют функцию Text Search Essentials ID Only SKU :
GMSPlacePropertyPlaceIDСледующие поля активируют артикул Text Search Pro :
GMSPlacePropertyAddressComponents
GMSPlacePropertyBusinessStatus
GMSPlacePropertyCoordinate
GMSPlacePropertyFormattedAddress
GMSPlacePropertyIconBackgroundColor
GMSPlacePropertyIconImageURL
GMSPlacePropertyName
GMSPlacePropertyPhotos
GMSPlacePropertyPlusCode
GMSPlacePropertyTypes
GMSPlacePropertyUTCOffsetMinutes
GMSPlacePropertyViewport
GMSPlacePropertyWheelchairAccessibleEntranceСледующие поля запускают функцию текстового поиска Enterprise SKU :
GMSPlacePropertyCurrentOpeningHours
GMSPlacePropertySecondaryOpeningHours
GMSPlacePropertyPhoneNumber
GMSPlacePropertyPriceLevel
GMSPlacePropertyRating
GMSPlacePropertyOpeningHours
GMSPlacePropertyUserRatingsTotal
GMSPlacePropertyWebsiteСледующие поля запускают функцию текстового поиска Enterprise Plus :
GMSPlacePropertyCurbsidePickup
GMSPlacePropertyDelivery
GMSPlacePropertyDineIn
GMSPlacePropertyEditorialSummary
GMSPlacePropertyReservable
GMSPlacePropertyReviews
GMSPlacePropertyServesBeer
GMSPlacePropertyServesBreakfast
GMSPlacePropertyServesBrunch
GMSPlacePropertyServesDinner
GMSPlacePropertyServesLunch
GMSPlacePropertyServesVegetarianFood
GMSPlacePropertyServesWine
GMSPlacePropertyTakeout
текстовый запрос
Текстовая строка для поиска, например: "ресторан", "123 Main Street" или "лучшее место для посещения в Сан-Франциско".
Дополнительные параметры
Используйте объект GMSPlaceSearchByTextRequest для указания необязательных параметров поиска.
включенный тип
Ограничивает результаты местами, соответствующими указанному типу, определенному в таблице А. Можно указать только один тип. Например:
-
let request = SearchByTextRequest()
request.includedType = "bar" -
let request = SearchByTextRequest()
request.includedType = "pharmacy"
-
isOpenNow
Если
true, возвращаются только те заведения, которые открыты на момент отправки запроса. Еслиfalse, возвращаются все заведения независимо от их статуса. Если вы установите для этого параметра значениеfalse, будут возвращены заведения, у которых не указаны часы работы в базе данных Google Places.isStrictTypeFiltering
Используется с параметром
includeType. Если установлено значениеtrue, возвращаются только места, соответствующиеincludeTypeтипам. Если значение false (по умолчанию), ответ может содержать места, не соответствующие указанным типам.locationBias
Указывает область поиска. Это местоположение служит в качестве смещения, что означает, что могут быть получены результаты вокруг указанного местоположения, включая результаты за пределами указанной области.
Вы можете указать
locationRestrictionилиlocationBias, но не оба параметра одновременно. РассматривайтеlocationRestrictionкак указание региона, в пределах которого должны находиться результаты, аlocationBiasкак указание региона, рядом с которым результаты должны находиться, но могут находиться за его пределами.Укажите область в виде прямоугольника или круга.
Окружность определяется центром и радиусом в метрах. Радиус должен находиться в диапазоне от 0,0 до 50000,0 включительно. Радиус по умолчанию равен 0,0. Например:
let request = SearchByTextRequest() request.locationBias = GMSPlaceCircularLocationOption(CLLocationCoordinate2DMake(40.7, -74.0), 200.0)
Прямоугольник — это область просмотра, отображаемая по широте и долготе, в виде двух расположенных по диагонали нижней и верхней точек. Нижняя точка обозначает юго-западный угол прямоугольника, а верхняя — северо-восточный угол.
Область просмотра считается замкнутой областью, то есть включает в себя свои границы. Границы широты должны находиться в диапазоне от -90 до 90 градусов включительно, а границы долготы — в диапазоне от -180 до 180 градусов включительно.
- Если
low=high, то область просмотра состоит из этой единственной точки. - Если
low.longitude>high.longitude, диапазон долготы инвертируется (область просмотра пересекает линию долготы в 180 градусов). - Если
low.longitude= -180 градусов иhigh.longitude= 180 градусов, то область просмотра будет включать все долготы. - Если
low.longitude= 180 градусов иhigh.longitude= -180 градусов, то диапазон долготы пуст. - Если
low.latitude>high.latitude, диапазон широт пуст.
- Если
locationRestriction
Указывает область поиска. Результаты за пределами указанной области не возвращаются. Укажите область в виде прямоугольной области просмотра. Информацию об определении области просмотра см. в описании параметра
locationBias.Вы можете указать
locationRestrictionилиlocationBias, но не оба параметра одновременно. РассматривайтеlocationRestrictionкак указание региона, в пределах которого должны находиться результаты, аlocationBiasкак указание региона, рядом с которым результаты должны находиться, но могут находиться за его пределами.maxResultCount
Указывает максимальное количество результатов поиска мест, которые необходимо вернуть. Должно быть от 1 до 20 (по умолчанию) включительно.
минРейтинг
Отображает только те результаты, средний пользовательский рейтинг которых больше или равен этому пределу. Значения должны быть в диапазоне от 0,0 до 5,0 (включительно) с шагом 0,5. Например: 0, 0,5, 1,0, ..., 5,0 включительно. Значения округляются до ближайшего 0,5. Например, значение 0,6 исключает все результаты с рейтингом ниже 1,0.
уровни цен
Ограничьте поиск местами, отмеченными определенными ценовыми уровнями. По умолчанию выбраны все ценовые уровни.
Укажите массив из одного или нескольких значений, определенных параметром
PriceLevel.Например:
let request = SearchByTextRequest() request.priceLevels = [GMSPlacesPriceLevel.moderate.rawValue, GMSPlacesPriceLevel.cheap.rawValue]
rankPreference
Указывает, как результаты ранжируются в ответе в зависимости от типа запроса:
- Для категориального запроса, такого как "Рестораны в Нью-Йорке", значение по умолчанию —
.relevance(ранжировать результаты по релевантности поиска). Вы можете установитьrankPreferenceна.relevanceили.distance(ранжировать результаты по расстоянию). - Для некатегориальных запросов, таких как "Mountain View, CA", мы рекомендуем не задавать
rankPreference.
- Для категориального запроса, такого как "Рестораны в Нью-Йорке", значение по умолчанию —
regionCode
Региональный код, используемый для форматирования ответа, указывается в виде двухсимвольного кода CLDR . Этот параметр также может влиять на результаты поиска. Значение по умолчанию отсутствует.
Если название страны в адресном поле ответа совпадает с кодом региона, то код страны опускается в адресе.
Большинство кодов CLDR идентичны кодам ISO 3166-1, за некоторыми заметными исключениями. Например, национальный домен верхнего уровня Соединенного Королевства — «uk» (.co.uk), а его код ISO 3166-1 — «gb» (технически обозначающий «Соединенное Королевство Великобритании и Северной Ирландии»). Параметр может влиять на результаты в зависимости от применимого законодательства.
следует включить предприятия, работающие исключительно в данной сфере.
Если
true, в результатах поиска отображаются компании, работающие исключительно в пределах зоны обслуживания. Компания, работающая исключительно в пределах зоны обслуживания, — это компания, которая посещает клиентов или доставляет им товары напрямую, но не обслуживает клиентов по их корпоративному адресу.Например:
Places Swift SDK
let request = SearchByTextRequest() request.shouldIncludePureServiceAreaBusinesses = true
Быстрый
let request = SearchByTextRequest() request.shouldIncludePureServiceAreaBusinesses: true
Objective-C
GMSPlaceSearchByTextRequest *request = [[GMSPlaceSearchByTextRequest alloc] initWithTextQuery:@"pizza in New York" placeProperties:@[GMSPlacePropertyAll]]; request.shouldIncludePureServiceAreaBusinesses = YES;
Отображайте атрибуцию в своем приложении
Когда ваше приложение отображает информацию, полученную от GMSPlacesClient , такую как фотографии и отзывы, оно также должно отображать необходимые атрибуты.
Например, свойство reviews объекта GMSPlacesClient содержит массив, содержащий до пяти объектов GMSPlaceReview . Каждый объект GMSPlaceReview может содержать информацию об авторстве и его авторстве. Если вы отображаете отзыв в своем приложении, то вы также должны отображать любую информацию об авторстве или его авторстве.
Для получения более подробной информации см. документацию по атрибуции .