Функциональность автодополнения адресов и объектов реализуется через
библиотеку Places внутри Google Maps JavaScript API.
Без её подключения виджет Autocomplete недоступен.
Загрузка API выполняется с указанием нужной библиотеки:
<script
src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places"
defer
></script>
Ключевой параметр — libraries=places, который активирует
доступ к сервису предсказаний мест и адресов.
Виджет google.maps.places.Autocomplete привязывается к
DOM-элементу input и начинает обрабатывать ввод пользователя, формируя
список подсказок.
<input id="address" type="text" placeholder="Введите адрес" />
const input = document.getElementById("address");
const autocomplete = new google.maps.places.Autocomplete(input);
После инициализации поле ввода становится источником запросов к сервису Places, а выпадающий список формируется автоматически.
Механизм Autocomplete включает несколько этапов:
После выбора элемента генерируется событие
place_changed.
autocomplete.addListener("place_changed", () => {
const place = autocomplete.getPlace();
console.log(place);
});
Метод getPlace() возвращает объект
PlaceResult, содержащий данные о выбранном объекте.
Типичная структура включает:
place_id — уникальный идентификаторformatted_address — полный адресgeometry.location — координатыname — название объектаtypes — категории местаaddress_components — структурированные элементы
адресаПример доступа к координатам:
const location = place.geometry.location;
const lat = location.lat();
const lng = location.lng();
Autocomplete поддерживает фильтрацию результатов через параметры конфигурации.
const autocomplete = new google.maps.places.Autocomplete(input, {
types: ["geocode"]
});
Основные значения:
geocode — адресаaddress — адресные данныеestablishment — организации(regions) — регионы(cities) — городаconst autocomplete = new google.maps.places.Autocomplete(input, {
componentRestrictions: { country: "kz" }
});
Код страны задаётся в формате ISO 3166-1 alpha-2.
const circle = new google.maps.Circle({
center: { lat: 49.8, lng: 73.1 },
radius: 50000
});
const autocomplete = new google.maps.places.Autocomplete(input);
autocomplete.setBounds(circle.getBounds());
При заданных границах результаты становятся географически локализованными.
const autocomplete = new google.maps.places.Autocomplete(input, {
strictBounds: true
});
При включённом режиме strictBounds результаты вне
заданной области полностью исключаются.
Для оптимизации запросов используется параметр fields.
Он управляет тем, какие данные будут загружены для выбранного места.
const autocomplete = new google.maps.places.Autocomplete(input);
autocomplete.setFields([
"place_id",
"geometry",
"formatted_address",
"name"
]);
Сокращение набора данных снижает стоимость запросов и ускоряет обработку.
Places API использует механизм сессий для группировки запросов автодополнения и последующего выбора места.
Сессии позволяют:
Сессионные токены применяются на уровне запросов к Places Service,
особенно при использовании расширенного API через
AutocompleteService.
Для более низкоуровневого управления запросами применяется
AutocompleteService, не привязанный к DOM.
const service = new google.maps.places.AutocompleteService();
service.getPlacePredictions(
{
input: "Almaty",
types: ["geocode"]
},
(predictions, status) => {
console.log(predictions);
}
);
Каждое предсказание содержит:
descriptionplace_idstructured_formattingtypesAutocomplete поддерживает смещение результатов в сторону текущей географии пользователя.
navigator.geolocation.getCurrentPosition((position) => {
const center = {
lat: position.coords.latitude,
lng: position.coords.longitude
};
const circle = new google.maps.Circle({
center,
radius: position.coords.accuracy
});
autocomplete.setBounds(circle.getBounds());
});
Такой подход усиливает релевантность выдачи без жёсткого ограничения области.
После выбора места важно корректно обрабатывать состояние компонента:
autocomplete.addListener("place_changed", () => {
const place = autocomplete.getPlace();
if (!place.geometry) {
return;
}
const position = {
lat: place.geometry.location.lat(),
lng: place.geometry.location.lng()
};
map.setCenter(position);
});
Проверка place.geometry необходима, поскольку некоторые
результаты могут не содержать координат.
Стандартный виджет генерирует собственный dropdown, однако поведение можно частично контролировать через CSS:
.pac-container {
z-index: 10000;
}
.pac-item {
font-size: 14px;
}
Основные элементы интерфейса:
.pac-container — контейнер списка.pac-item — элемент подсказки.pac-icon — иконка результата.pac-item-query — основной текст запросаПредсказания, возвращаемые сервисом, имеют строгую структуру:
{
"description": "Almaty, Kazakhstan",
"place_id": "ChIJ...",
"types": ["locality", "political"],
"structured_formatting": {
"main_text": "Almaty",
"secondary_text": "Kazakhstan"
}
}
Эти данные используются для отображения списка и последующего запроса деталей места.
При интенсивном использовании автодополнения учитываются следующие факторы:
types)bounds)fields для сокращения ответаAutocompleteServiceПример debounce:
let timeout;
input.addEventListener("input", (e) => {
clearTimeout(timeout);
timeout = setTimeout(() => {
service.getPlacePredictions({ input: e.target.value }, callback);
}, 300);
});
Autocomplete не всегда возвращает полный адрес или координаты до момента выбора результата. Предсказания носят вероятностный характер и не гарантируют точного соответствия реальному объекту.
Некоторые типы объектов:
Модель ранжирования учитывает популярность, географическую близость и релевантность запроса.