Контрол геолокации добавляет на карту интерфейсный элемент, позволяющий получать текущее местоположение пользователя через браузерный Geolocation API и отображать его на карте в виде маркера с зоной точности. В MapLibre GL JS этот контрол интегрируется как стандартный компонент управления и работает в связке с источником геоданных, предоставляемых устройством.
Основная роль компонента заключается в синхронизации состояния карты с реальным положением пользователя, включая автоматическое центрирование, отслеживание перемещения и визуализацию радиуса погрешности определения координат.
Контрол создаётся через конструктор GeolocateControl и
добавляется на карту как обычный UI-элемент:
import maplibregl from "maplibre-gl";
const map = new maplibregl.Map({
container: "map",
style: "https://demotiles.maplibre.org/style.json",
center: [0, 0],
zoom: 2
});
const geolocate = new maplibregl.GeolocateControl();
map.addControl(geolocate);
После добавления контрол отображается в панели управления картой и становится доступным для взаимодействия. При активации он запрашивает разрешение на доступ к геолокации через браузер.
При первом запуске контрол инициирует запрос к Geolocation API. Если пользователь предоставляет доступ, возвращается объект с координатами, точностью и временной меткой.
Полученные данные используются для:
Если доступ запрещён, генерируется событие ошибки.
Контрол поддерживает набор опций, влияющих на поведение геолокации и визуализацию.
Передаются напрямую в браузерный API и определяют точность и способ получения координат:
const geolocate = new maplibregl.GeolocateControl({
positionOptions: {
enableHighAccuracy: true,
timeout: 6000,
maximumAge: 0
}
});
enableHighAccuracy включает использование GPS (если
доступен);timeout задаёт максимальное время ожидания ответа;maximumAge определяет допустимость кэшированных
координат.Включает режим постоянного отслеживания перемещения пользователя. В этом режиме карта обновляет позицию при каждом изменении координат:
trackUserLocation: true
При включении активируется поток наблюдения через
watchPosition.
Отвечает за отображение маркера пользователя. При значении
false координаты используются только для логики карты, без
визуального представления:
showUserLocation: true
Определяет отображение радиуса точности вокруг позиции:
showAccuracyCircle: true
Этот круг полезен для понимания погрешности GPS-сигнала.
Настройки анимации при центрировании карты:
fitBoundsOptions: {
maxZoom: 16,
duration: 1000
}
Позволяет управлять плавностью перехода и максимальным масштабом при фокусировке на пользователе.
Контрол предоставляет программный интерфейс для ручного запуска геолокации.
Метод инициирует запрос геопозиции без необходимости пользовательского клика:
geolocate.trigger();
При вызове происходит аналогичный процесс, как при нажатии кнопки интерфейса.
GeolocateControl генерирует несколько событий, позволяющих отслеживать жизненный цикл геолокации.
Срабатывает при успешном получении координат:
map.on("geolocate", (e) => {
console.log(e.coords.longitude, e.coords.latitude);
});
Объект события содержит:
coords.longitudecoords.latitudecoords.accuracytimestampВозникает при ошибке получения местоположения:
map.on("error", (e) => {
console.log(e.message);
});
Типичные причины:
Срабатывает при включении режима отслеживания:
map.on("trackuserlocationstart", () => {
console.log("tracking started");
});
Срабатывает при остановке отслеживания:
map.on("trackuserlocationend", () => {
console.log("tracking stopped");
});
Возникает, если пользователь выходит за пределы заданного bounding box (если он используется в логике приложения):
map.on("outofmaxbounds", () => {
console.log("user outside allowed bounds");
});
Контрол опирается на два механизма браузера:
getCurrentPosition — однократное получение
координат;watchPosition — потоковое отслеживание изменений.При включении tracking mode создаётся наблюдатель, который периодически возвращает новые координаты. Эти данные преобразуются в GeoJSON-совместимый формат и передаются в слой отображения.
Визуализация состоит из двух основных элементов:
Хотя контрол не создаёт отдельный source вручную в API
карты, внутри MapLibre GL JS он использует внутренний geojson-источник
для отрисовки пользовательской позиции. Этот источник обновляется при
каждом событии геолокации.
Структура данных примерно соответствует:
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [longitude, latitude]
},
"properties": {
"accuracy": 12
}
}
На основе accuracy формируется окружность, аппроксимируемая полигоном.
Контрол реагирует на изменения состояния карты:
watchPosition.Особенность заключается в том, что геолокация работает независимо от viewport карты, но её визуализация всегда привязана к текущей системе координат карты.
Работа контроллера зависит от ограничений Geolocation API:
Некоторые браузеры могут блокировать watchPosition при
свёрнутой вкладке или отсутствии активности пользователя.
В интерфейсе контрол имеет несколько состояний:
Состояние влияет на визуальный стиль кнопки и наличие активной подсветки.
GeolocateControl часто используется совместно с:
NavigationControl — для управления масштабом и
поворотом;FullscreenControl — для отображения карты на весь
экран;При изменении геопозиции можно синхронизировать другие элементы интерфейса, например обновлять список ближайших объектов или фильтровать данные на карте.
Если устройство теряет сигнал GPS или сеть, контроль сохраняет последнее известное положение. В режиме tracking обновления прекращаются, но маркер остаётся на карте до получения новых координат.
При восстановлении сигнала поток watchPosition
продолжает работу без необходимости повторной инициализации
контроллера.