Autocomplete в контексте Mapbox GL JS реализуется через связку Mapbox Geocoding API и компонента интерфейса Mapbox Geocoder, который предоставляет интерактивное поле поиска с автоподсказками адресов, объектов и географических сущностей. Механизм основан на серверной генерации предложений (suggestions) по мере ввода текста и локальной фильтрации результатов с учётом контекста карты.
Autocomplete не является встроенной функцией Mapbox GL JS как рендера карты. Он формируется на уровне отдельного API:
Система работает по схеме:
Autocomplete реализуется через официальный плагин:
import mapboxgl fr om "mapbox-gl";
import MapboxGeocoder fr om "@mapbox/mapbox-gl-geocoder";
mapboxgl.accessToken = "YOUR_MAPBOX_ACCESS_TOKEN";
const map = new mapboxgl.Map({
container: "map",
style: "mapbox://styles/mapbox/streets-v12",
center: [69.2401, 41.2995],
zoom: 10
});
Добавление геокодера:
const geocoder = new MapboxGeocoder({
accessToken: mapboxgl.accessToken,
mapboxgl: mapboxgl
});
map.addControl(geocoder);
Autocomplete активируется автоматически при вводе текста. Каждый ввод инициирует запрос:
/geocoding/v5/mapbox.places/{query}.json
Результат содержит массив предложений, отсортированных по релевантности.
Ограничение поиска конкретными категориями:
types: "country,region,place,address,poi"
Используется для сужения области автодополнения.
countries: "kz"
Фильтрация результатов только по указанным странам.
language: "ru"
Влияет на язык названий в подсказках.
limit: 5
Определяет число автоподсказок в списке.
proximity: {
longitude: 69.2401,
latitude: 41.2995
}
Смещает релевантность в сторону объектов рядом с указанной точкой.
bbox: [68.0, 40.0, 71.0, 43.0]
Используется для строгого географического ограничения результатов.
const geocoder = new MapboxGeocoder({
accessToken: mapboxgl.accessToken,
mapboxgl: mapboxgl,
placeholder: "Поиск",
language: "ru",
countries: "kz",
types: "place,address,poi",
lim it: 6,
proximity: {
longitude: 69.2401,
latitude: 41.2995
}
});
Autocomplete тесно связан с событиями Geocoder.
Срабатывает при выборе элемента:
geocoder.on("result", (e) => {
const coords = e.result.center;
map.flyTo({
center: coords,
zoom: 14
});
});
Очистка поиска:
geocoder.on("clear", () => {
console.log("поиск очищен");
});
Хотя стандартный Geocoder всегда использует suggestions, можно управлять логикой через кастомную реализацию и прямой вызов API.
Пример запроса без UI:
fetch(
`https://api.mapbox.com/geocoding/v5/mapbox.places/Almaty.json?access_token=${mapboxgl.accessToken}`
)
.then(res => res.json())
.then(data => console.log(data.features));
Autocomplete чувствителен к производительности. Каждый ввод инициирует API-запрос, поэтому применяется debounce:
function debounce(fn, delay) {
let timeout;
return (...args) => {
clearTimeout(timeout);
timeout = setTimeout(() => fn(...args), delay);
};
}
Использование:
const search = debounce((value) => {
console.log("запрос:", value);
}, 300);
Mapbox использует session tokens для группировки запросов autocomplete в одну сессию. Это влияет на биллинг и релевантность.
Типичная схема:
Пример кастомного использования:
const geocoder = new MapboxGeocoder({
accessToken: mapboxgl.accessToken,
mapboxgl: mapboxgl,
sessionToken: "random-session-id"
});
Geocoder позволяет переопределять внешний вид:
.mapboxgl-ctrl-geocoder {
width: 100%;
max-width: 400px;
}
Также возможно создание полностью кастомного UI с использованием только Geocoding API.
Каждый элемент результата содержит структуру:
{
"place_name": "Almaty, Kazakhstan",
"center": [76.9286, 43.222],
"place_type": ["place"]
}
Основные поля:
place_name — отображаемое названиеcenter — координатыgeometry — геометрия объектаcontext — административная структураAutocomplete можно настраивать через комбинации фильтров:
types: "address",
countries: "kz",
bbox: [68, 40, 75, 45],
limit: 10
Это позволяет строить узкоспециализированные поисковые интерфейсы, например:
После выбора результата часто добавляется маркер:
geocoder.on("result", (e) => {
const coords = e.result.center;
new mapboxgl.Marker()
.setLngLat(coords)
.addTo(map);
});
Без Geocoder UI можно реализовать собственную систему:
async function autocomplete(query) {
const res = await fetch(
`https://api.mapbox.com/geocoding/v5/mapbox.places/${query}.json?access_token=${mapboxgl.accessToken}&autocomplete=true`
);
const data = await res.json();
return data.features;
}
Далее результаты отображаются в любом UI-слое приложения.
Autocomplete выступает как слой абстракции между пользователем и геоданными. Он позволяет:
Некоторые запросы возвращают несколько типов объектов. Например, название может совпадать с городом и POI. В таких случаях используется:
e.result.context.forEach(c => {
console.log(c.id, c.text);
});
В SPA-приложениях autocomplete часто связывается с:
Mapbox GL JS выступает как визуальный слой, а autocomplete — как входной фильтр пространственных данных.