Geocoder control в Mapbox GL JS представляет собой готовый UI-компонент для поиска географических объектов, адресов и координат через сервис геокодирования Mapbox Geocoding API. В экосистеме Mapbox этот контрол подключается как отдельный плагин и расширяет базовую карту строкой поиска с автодополнением, обработкой результатов и управлением камерой карты.
Geocoder control не входит в ядро Mapbox GL JS и подключается через
отдельный пакет @mapbox/mapbox-gl-geocoder. Он работает как
связующее звено между пользовательским вводом и API геокодирования.
Основные компоненты:
map.flyTo, map.fitBoundsКонтрол реализует модель “ввод → запрос → список подсказок → выбор → перемещение карты”.
Библиотека подключается через npm:
npm install @mapbox/mapbox-gl-geocoder
Импорт в проект:
import mapboxgl from "mapbox-gl";
import MapboxGeocoder from "@mapbox/mapbox-gl-geocoder";
import "@mapbox/mapbox-gl-geocoder/dist/mapbox-gl-geocoder.css";
Подключение базовой карты:
mapboxgl.accessToken = "YOUR_MAPBOX_TOKEN";
const map = new mapboxgl.Map({
container: "map",
style: "mapbox://styles/mapbox/streets-v12",
center: [0, 0],
zoom: 2
});
Базовая инициализация:
const geocoder = new MapboxGeocoder({
accessToken: mapboxgl.accessToken,
mapboxgl: mapboxgl
});
map.addControl(geocoder);
После добавления появляется стандартный поисковый интерфейс, привязанный к карте.
Обязательный параметр. Используется для авторизации запросов к API.
accessToken: mapboxgl.accessToken
Передача объекта Mapbox GL JS обязательна для управления картой.
mapboxgl: mapboxgl
Управление маркером результата:
marker: true
Возможные значения:
true — стандартный маркерfalse — без маркераnew mapboxgl.Marker(...) — кастомный маркерОпределяет уровень масштабирования при выборе результата:
zoom: 14
Текст в поле ввода:
placeholder: "Поиск адреса"
Приоритет результатов рядом с заданной точкой:
proximity: {
longitude: 37.6173,
latitude: 55.7558
}
Используется для повышения релевантности поиска.
Ограничение поиска рамками:
bbox: [30, 50, 40, 60]
Формат: [minX, minY, maxX, maxY].
Фильтрация по странам:
countries: "ru,kz"
Язык результатов:
language: "ru"
Фильтрация типов объектов:
types: "address,place,poi"
Geocoder control генерирует события, позволяющие управлять логикой приложения.
Срабатывает при выборе результата:
geocoder.on("result", (e) => {
console.log(e.result);
});
e.result содержит GeoJSON Feature:
Срабатывает при обновлении списка подсказок:
geocoder.on("results", (e) => {
console.log(e.features);
});
Срабатывает при очистке поля:
geocoder.on("clear", () => {
console.log("поиск очищен");
});
Geocoder автоматически взаимодействует с картой:
flyTo)zoom)setCenter)fitBounds)Пример кастомного поведения результата:
geocoder.on("result", (e) => {
const coords = e.result.center;
map.flyTo({
center: coords,
zoom: 16,
speed: 1.2
});
});
Отключение стандартного маркера:
const geocoder = new MapboxGeocoder({
accessToken: mapboxgl.accessToken,
mapboxgl: mapboxgl,
marker: false
});
Добавление собственного маркера:
const customMarker = new mapboxgl.Marker({ color: "red" });
const geocoder = new MapboxGeocoder({
accessToken: mapboxgl.accessToken,
mapboxgl: mapboxgl,
marker: customMarker
});
Geocoder можно разместить вне стандартных контролов карты:
document.getElementById("geocoder").appendChild(
geocoder.onAdd(map)
);
Это позволяет интегрировать поиск в собственный UI.
Geocoder может работать как автономный компонент:
const geocoder = new MapboxGeocoder({
accessToken: mapboxgl.accessToken,
mapboxgl: mapboxgl,
flyTo: false,
marker: false
});
Результаты можно обрабатывать вручную через событие
result.
Каждый результат соответствует формату GeoJSON Feature:
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [37.6173, 55.7558]
},
"place_name": "Москва, Россия",
"center": [37.6173, 55.7558]
}
Это позволяет напрямую использовать данные в слоях карты:
map.addSource("search-result", {
type: "geojson",
data: {
type: "FeatureCollection",
features: []
}
});
geocoder.on("result", (e) => {
map.getSource("search-result").setData({
type: "FeatureCollection",
features: [e.result]
});
});
Geocoder позволяет настраивать поведение через фильтры:
Комбинация параметров используется для строгих сценариев:
const geocoder = new MapboxGeocoder({
accessToken: mapboxgl.accessToken,
mapboxgl: mapboxgl,
countries: "kz",
types: "address,place",
bbox: [46, 40, 87, 56],
proximity: {
longitude: 66.9237,
latitude: 48.0196
}
});
Geocoder использует дебаунсинг ввода: запрос отправляется после короткой паузы, что снижает нагрузку на Mapbox Geocoding API.
Дополнительно:
CSS подключается отдельно и может быть переопределён:
.mapboxgl-ctrl-geocoder {
width: 100%;
max-width: 400px;
font-size: 14px;
}
Возможные кастомизации:
В сложных интерфейсах можно использовать несколько экземпляров:
const startGeocoder = new MapboxGeocoder({...});
const endGeocoder = new MapboxGeocoder({...});
Geocoder control часто используется как:
При интеграции с пользовательскими слоями Mapbox GL JS он становится частью интерактивной гео-логики приложения, связывая текстовый поиск и пространственные данные карты в единую систему.