В Google Maps JavaScript API функциональность разделена на модули, которые подключаются по требованию. Places Library представляет собой отдельный слой поверх базового JavaScript API карт и предоставляет доступ к геокодированию мест, поиску объектов, автодополнению адресов и расширенным данным о точках интереса.
Подключение библиотек осуществляется через параметр
libraries в URL загрузки скрипта. Это позволяет уменьшить
начальный вес приложения и загружать только необходимые компоненты.
Базовая структура подключения:
<script
src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places"
async
defer
></script>
Ключевой параметр:
libraries=places — активирует Places Librarykey — API ключ проекта Google Cloudasync/defer — асинхронная загрузка без блокировки
рендеринга страницыВ современных приложениях часто используется динамическая загрузка API через JavaScript вместо прямого подключения скрипта в HTML.
function loadGoogleMapsScript() {
const script = document.createElement("script");
script.src =
"https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places";
script.async = true;
script.defer = true;
document.head.appendChild(script);
}
Такой подход удобен для SPA, где загрузка API зависит от маршрута или пользовательского действия.
После загрузки API доступен глобальный объект
google.maps, внутри которого находятся классы для работы с
картами и местами.
let map;
function initMap() {
map = new google.maps.Map(document.getElementById("map"), {
center: { lat: 51.1694, lng: 71.4491 },
zoom: 12,
});
}
Places Library становится доступной автоматически после загрузки, дополнительных импортов не требуется.
Places Library включает несколько ключевых сервисов:
PlacesService используется для запросов к базе мест
Google: рестораны, организации, адреса, достопримечательности.
Создание сервиса:
const service = new google.maps.places.PlacesService(map);
Метод findPlaceFromQuery выполняет поиск по строке:
const request = {
query: "Central Park",
fields: ["name", "geometry", "formatted_address"],
};
service.findPlaceFromQuery(request, (results, status) => {
if (status === google.maps.places.PlacesServiceStatus.OK) {
console.log(results);
}
});
Ключевые поля запроса:
query — текст поискаfields — какие данные вернуть (важно для оптимизации
стоимости)Поиск объектов поблизости используется для отображения точек интереса вокруг координаты.
const request = {
location: { lat: 51.1694, lng: 71.4491 },
radius: 1500,
type: "restaurant",
};
service.nearbySearch(request, (results, status) => {
if (status === google.maps.places.PlacesServiceStatus.OK) {
results.forEach((place) => {
console.log(place.name);
});
}
});
Параметры:
location — центр поискаradius — радиус в метрахtype — тип объектов (restaurant, cafe, hospital и
т.д.)Метод getDetails позволяет получить расширенные данные о
конкретном месте.
const request = {
placeId: "ChIJN1t_tDeuEmsRUsoyG83frY4",
fields: [
"name",
"rating",
"formatted_phone_number",
"geometry",
"opening_hours",
"website",
],
};
service.getDetails(request, (place, status) => {
if (status === google.maps.places.PlacesServiceStatus.OK) {
console.log(place);
}
});
Важно ограничивать fields, так как каждый дополнительный
параметр влияет на стоимость запроса.
Autocomplete позволяет реализовать интеллектуальный ввод адресов и объектов.
const input = document.getElementById("search");
const autocomplete = new google.maps.places.Autocomplete(input, {
types: ["geocode"],
});
Основные параметры:
types — ограничение типов (geocode, address,
establishment)componentRestrictions — ограничение по странеПример ограничения по стране:
{
componentRestrictions: { country: "kz" }
}
autocomplete.addListener("place_changed", () => {
const place = autocomplete.getPlace();
console.log(place.name);
console.log(place.geometry.location.lat());
console.log(place.geometry.location.lng());
});
getPlace() возвращает объект PlaceResult,
содержащий координаты, адрес и дополнительные поля.
В отличие от UI-компонента, AutocompleteService
используется для кастомных интерфейсов.
const service = new google.maps.places.AutocompleteService();
service.getPlacePredictions(
{ input: "Astana" },
(predictions, status) => {
if (status === google.maps.places.PlacesServiceStatus.OK) {
console.log(predictions);
}
}
);
Это позволяет строить собственные UI-компоненты без использования встроенного input.
Places API использует систему сессий для группировки запросов Autocomplete и Place Details.
const sessionToken = new google.maps.places.AutocompleteSessionToken();
Использование:
Пример:
const autocomplete = new google.maps.places.Autocomplete(input, {
sessionToken: sessionToken,
});
Places Library позволяет фильтровать результаты по типам и регионам:
types — тип объектаlocationBias — смещение поиска к областиlocationRestriction — строгие границы поискаПример bias:
{
locationBias: {
radius: 5000,
center: { lat: 51.1694, lng: 71.4491 }
}
}
Результаты запросов возвращают объект PlaceResult,
который может включать:
name — названиеgeometry — координатыformatted_address — адресrating — рейтингopening_hours — часы работыphotos — фотографииplace_id — уникальный идентификаторПример работы с координатами:
const location = place.geometry.location;
const lat = location.lat();
const lng = location.lng();
Places Library позволяет получать изображения объектов через
PlacePhoto.
const photoUrl = place.photos[0].getUrl({
maxWidth: 400,
maxHeight: 400,
});
Особенности:
place.photosПри работе с Places Library необходимо учитывать:
fieldsЧасто используемая практика — минимизация данных через выборочное указание полей, чтобы уменьшить количество тарифицируемых атрибутов.
libraries=places в URLfieldsКаждая из этих ошибок приводит к статусам вроде
REQUEST_DENIED или INVALID_REQUEST.
Типичная архитектура использования Places Library включает:
Пример логики:
autocomplete.addListener("place_changed", () => {
const place = autocomplete.getPlace();
map.setCenter(place.geometry.location);
new google.maps.Marker({
map,
position: place.geometry.location,
title: place.name,
});
});