На этой странице объясняются различия между функциями текстового поиска мест в классе Place (новом) и PlacesService (устаревшем), а также приводятся фрагменты кода для сравнения.
В устаревшей версии PlacesService есть следующие методы текстового поиска:
- Метод
findPlaceFromQuery(), который принимает текстовый запрос и возвращает одно место, а также поддерживает использование полей данных о месте. - Метод
findPlaceFromPhoneNumber()позволяет искать место по номеру телефона и поддерживает использование полей данных о местах. - Метод
textSearch()принимает текстовый запрос и возвращает список мест.textSearch()– более старая версия, которая не поддерживает поля данных о местах.
Новый класс Place предлагает метод Place.searchByText(), который позволяет искать места по текстовому запросу или номеру телефона, а также настраивать поиск с помощью расширенного набора регулярно обновляемых полей данных и типов мест.
В таблице ниже приведены основные различия между методами поиска мест в классе Place и PlacesService.
PlacesService (устаревшая версия) |
Place (новое) |
|---|---|
findPlaceFromQuery()findPlaceFromPhoneNumber()
|
searchByText() |
FindPlaceFromQueryRequestFindPlaceFromPhoneNumberRequest |
SearchByTextRequest |
| Ограниченные возможности запросов. | Более широкие возможности запросов. |
Требует использования обратного вызова для обработки объекта результатов и ответа google.maps.places.PlacesServiceStatus. |
Использует объекты Promise и работает асинхронно. |
Требуется проверка PlacesServiceStatus. |
Проверка статуса не требуется, можно использовать стандартную обработку ошибок. Подробнее… |
| Поддерживает только смещение местоположения. | Поддерживает смещение и ограничение по местоположению. |
| Поля данных о месте форматируются с использованием змеиного регистра. | Поля данных о местах форматируются с использованием верблюжьего регистра. |
| Возвращает один результат. | Возвращает до 20 результатов. |
| Ограничен фиксированным набором типов мест и полей данных о местах. | Расширенный выбор регулярно обновляемых типов мест и полей данных о местах. |
textSearch() |
searchByText() |
| Возвращает все доступные поля данных (подмножество поддерживаемых полей). Ограничить запрос определенными полями нельзя. | Возвращает только запрошенные поля данных о месте. |
Сравнение кода
В этом разделе сравнивается код методов текстового поиска, чтобы проиллюстрировать различия между сервисом Places и классом Place. Фрагменты кода показывают, какой код требуется для каждого API, чтобы сделать текстовый поисковый запрос.
Places Service (устаревший)
В следующем фрагменте кода показано, как использовать метод findPlaceFromQuery() для поиска места. Запрос является синхронным и включает условную проверку PlacesServiceStatus. Необходимые поля данных о месте указываются в теле запроса, которое определяется до выполнения фактического запроса.
function findPlaces() {
const request = {
query: "Museum of Contemporary Art Australia",
fields: ["name", "geometry"],
};
// Create an instance of PlacesService.
service = new google.maps.places.PlacesService(map);
// Make a findPlaceFromQuery request.
service.findPlaceFromQuery(request, (results, status) => {
let place = results[0];
if (status === google.maps.places.PlacesServiceStatus.OK && results) {
if (!place.geometry || !place.geometry.location) return;
const marker = new google.maps.Marker({
map,
position: place.geometry.location,
});
map.setCenter(place.geometry.location);
}
});
}
Подробнее…
Новая версия текстового поиска
В приведенном ниже фрагменте кода показано, как использовать метод searchByText() для поиска мест. Запрос является асинхронным и не требует проверки статуса (можно использовать стандартную обработку ошибок). В этом примере запрос включает параметр maxResultCount со значением 8 (значение должно быть в диапазоне от 1 до 20). Эта функция перебирает результаты и добавляет маркер для каждого из них, корректируя границы карты в зависимости от положения маркеров. Поскольку метод searchByText() использует оператор await, его можно использовать только внутри функции async.
async function findPlaces() {
// Define a request.
// The `fields` property is required; all others are optional.
const request = {
fields: ["displayName", "location", "businessStatus"],
textQuery: "Tacos in Mountain View",
includedType: "restaurant",
locationBias: { lat: 37.4161493, lng: -122.0812166 },
isOpenNow: true,
language: "en-US",
maxResultCount: 8,
minRating: 3.2,
region: "us",
useStrictTypeFiltering: false,
};
// Call searchByText passing the request.
const { places } = await google.maps.places.Place.searchByText(request);
// Add a marker for each result.
if (places.length) {
const bounds = new google.maps.LatLngBounds();
places.forEach((place) => {
const markerView = new google.maps.marker.AdvancedMarkerElement({
map,
position: place.location,
title: place.displayName,
});
bounds.extend(place.location);
console.log(place);
});
map.fitBounds(bounds);
} else {
console.log("No results");
}
}
Метод searchByText() поддерживает гораздо больше параметров запроса, чем предыдущая версия, в том числе:
includedType, который позволяет ограничить поиск определенным типом мест.isOpenNow– позволяет ограничить поиск только открытыми местами.minRating, который позволяет отфильтровать результаты ниже указанного предела (например, возвращать только места с тремя звездами или более).locationRestriction, который исключает результаты за пределами указанного местоположения (также поддерживаетсяlocationBias).
Подробнее…
- Посмотреть полный пример кода
- См. документацию по текстовому поиску (New)
- Ознакомьтесь со справочной информацией о
searchByText()