В поиске мест появилась новая версия функции текстового поиска, которая позволяет получать набор мест в ответ на ввод текстового запроса.
Новая версия текстового поиска
Новая версия текстового поиска возвращает информацию о местах на основе введенной фразы, например "кафе в Москве", "обувные магазины в Санкт-Петербурге" или "улица Центральная, 123". Ответ содержит список мест, соответствующих текстовой строке с учетом указанного предпочтительного местоположения. Новая версия текстового поиска позволяет искать места по типу, фильтровать их на основе различных критериев, например часов работы или рейтинга, и подбирать варианты, относящиеся только к определенному местоположению. Новая версия текстового поиска разрабатывалась с нуля и отличается улучшенной производительностью и качеством данных по сравнению с Places API.
Требования
Чтобы использовать новую версию текстового поиска, включите "Places API (новинка)" в проекте Google Cloud. Подробности – в статье Начало работы.
Главные особенности текстового поиска
Новая версия текстового поиска имеет следующие улучшения:
- дополнительные фильтры поиска со множеством новых типов мест, а также возможностью фильтрации по минимальному рейтингу;
- теперь поддерживаются маски полей;
- в полях места теперь указываются рейтинг и отзывы.
Поиск мест по текстовому запросу
Вызовите метод searchByText
, чтобы получить список мест на основе текстового запроса или номера телефона. Если запрос содержит номер телефона, параметр региона должен совпадать с регионом домена, с которого отправляется запрос. Например, если вы используете номер телефона для поиска места в Японии, а запрашивающий домен содержит jp
, задайте для параметра region
значение "jp". Если в запросе не указать параметр region
, API по умолчанию будет использовать "us" (США).
В параметре fields
задайте поля данных (в верблюжьем регистре, через запятую).
В примере ниже показан вызов searchByText
для поиска мест по текстовому запросу.
TypeScript
let map; let center; async function initMap() { const { Map } = await google.maps.importLibrary("maps") as google.maps.MapsLibrary; center = {lat: 37.4161493, lng: -122.0812166}; map = new Map(document.getElementById('map') as HTMLElement, { center: center, zoom: 14, // ... }); findPlaces(); } async function findPlaces() { const { Place } = await google.maps.importLibrary("places") as google.maps.PlacesLibrary; //@ts-ignore const { AdvancedMarkerElement } = await google.maps.importLibrary("marker") as google.maps.MarkerLibrary; const request = { textQuery: 'Tacos in Mountain View', fields: ['displayName', 'location', 'businessStatus'], includedType: 'restaurant', isOpenNow: true, language: 'en-US', maxResultCount: 7, minRating: 3.2, region: 'us', useStrictTypeFiltering: false, }; //@ts-ignore const { places } = await Place.searchByText(request); if (places.length) { console.log(places); const { LatLngBounds } = await google.maps.importLibrary("core") as google.maps.CoreLibrary; const bounds = new LatLngBounds(); // Loop through and get all the results. places.forEach((place) => { const markerView = new AdvancedMarkerElement({ map, position: place.location, title: place.displayName, }); bounds.extend(place.location); console.log(place); }); map.setCenter(bounds.getCenter()); } else { console.log('No results'); } } initMap();
JavaScript
let map; let center; async function initMap() { const { Map } = await google.maps.importLibrary("maps"); center = { lat: 37.4161493, lng: -122.0812166 }; map = new Map(document.getElementById("map"), { center: center, zoom: 14, // ... }); findPlaces(); } async function findPlaces() { const { Place } = await google.maps.importLibrary("places"); //@ts-ignore const { AdvancedMarkerElement } = await google.maps.importLibrary("marker"); const request = { textQuery: "Tacos in Mountain View", fields: ["displayName", "location", "businessStatus"], includedType: "restaurant", isOpenNow: true, language: "en-US", maxResultCount: 7, minRating: 3.2, region: "us", useStrictTypeFiltering: false, }; //@ts-ignore const { places } = await Place.searchByText(request); if (places.length) { console.log(places); const { LatLngBounds } = await google.maps.importLibrary("core"); const bounds = new LatLngBounds(); // Loop through and get all the results. places.forEach((place) => { const markerView = new AdvancedMarkerElement({ map, position: place.location, title: place.displayName, }); bounds.extend(place.location); console.log(place); }); map.setCenter(bounds.getCenter()); } else { console.log("No results"); } } initMap();