MapLibre GL JS предоставляет встроенные механизмы работы с геолокацией пользователя через браузерный API и набор событий, позволяющих отслеживать состояние получения координат, режимы слежения и ошибки. Эти события являются ключевым элементом интерактивных карт, где необходимо отображать позицию пользователя, строить навигацию или реагировать на перемещение в реальном времени.
Геолокация в MapLibre GL JS основана на стандартном Web Geolocation API, который предоставляет:
В MapLibre GL JS этот функционал инкапсулирован в
GeolocateControl, который автоматически добавляет
UI-элемент и генерирует события жизненного цикла геолокации.
Основной механизм работы с геолокацией реализован через контрол:
const geolocate = new maplibregl.GeolocateControl({
positionOptions: {
enableHighAccuracy: true,
maximumAge: 0,
timeout: 6000
},
trackUserLocation: true,
showAccuracyCircle: true,
showUserLocation: true
});
map.addControl(geolocate);
Контрол генерирует набор событий, которые позволяют отслеживать состояние геолокации.
Срабатывает при успешном получении координат пользователя. Это базовое событие, на котором строится вся логика отображения позиции.
geolocate.on('geolocate', (position) => {
console.log('Координаты:', position.coords.longitude, position.coords.latitude);
console.log('Точность:', position.coords.accuracy);
});
Структура объекта position соответствует стандарту
Geolocation API:
coords.latitudecoords.longitudecoords.accuracycoords.heading (если доступно)coords.speed (если доступно)Типичные сценарии использования:
Срабатывает при невозможности определить местоположение. Причины могут включать:
geolocate.on('error', (error) => {
console.error('Ошибка геолокации:', error.message);
});
Объект ошибки содержит:
code — тип ошибкиmessage — описаниеPERMISSION_DENIEDPOSITION_UNAVAILABLETIMEOUTПри включённом trackUserLocation геолокация переходит в
режим постоянного наблюдения.
Срабатывает при начале отслеживания:
geolocate.on('trackuserlocationstart', () => {
console.log('Начато отслеживание пользователя');
});
Используется для:
Срабатывает при остановке отслеживания:
geolocate.on('trackuserlocationend', () => {
console.log('Отслеживание остановлено');
});
Типичные причины:
При активном трекинге координаты могут обновляться многократно. В
MapLibre GL JS это сопровождается повторными вызовами
geolocate.
Практический подход — хранение последнего состояния:
let lastPosition = null;
geolocate.on('geolocate', (position) => {
lastPosition = position;
map.flyTo({
center: [position.coords.longitude, position.coords.latitude],
speed: 1.2
});
});
Геолокационные события часто используются совместно с кастомными слоями:
const userMarker = new maplibregl.Marker()
.setLngLat([0, 0])
.addTo(map);
geolocate.on('geolocate', (pos) => {
userMarker.setLngLat([
pos.coords.longitude,
pos.coords.latitude
]);
});
Accuracy circle может быть визуализирован через GeoJSON источник:
geolocate.on('geolocate', (pos) => {
const radius = pos.coords.accuracy;
const point = {
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [pos.coords.longitude, pos.coords.latitude]
},
properties: { radius }
};
map.getSource('accuracy').setData(point);
});
Современные браузеры требуют явного разрешения на геолокацию. Частая ситуация — пользователь отклоняет запрос.
Рекомендуемая обработка:
geolocate.on('error', (err) => {
if (err.code === err.PERMISSION_DENIED) {
console.log('Доступ к геолокации запрещён пользователем');
}
});
В этом случае интерфейс должен переходить в режим ручного выбора точки или поиска адреса.
GeolocateControl поддерживает программное управление:
geolocate.trigger(); // принудительный запрос геолокации
geolocate.options.trackUserLocation = true;
Также возможно отключение:
geolocate.options.trackUserLocation = false;
Геолокация тесно связана с событиями самой карты:
movezoomrotateПример синхронизации:
geolocate.on('geolocate', (pos) => {
map.easeTo({
center: [pos.coords.longitude, pos.coords.latitude],
zoom: 15
});
});
Геолокация хранится отдельно от UI:
const state = {
position: null,
tracking: false
};
geolocate.on('geolocate', (pos) => {
state.position = pos;
});
Использование событий как единственного источника истины:
При высокой точности GPS события могут приходить слишком часто:
let timeout;
geolocate.on('geolocate', (pos) => {
clearTimeout(timeout);
timeout = setTimeout(() => {
updateUserPosition(pos);
}, 200);
});
Некоторые окружения не поддерживают геолокацию:
if (!navigator.geolocation) {
console.log('Геолокация недоступна');
}
В таких случаях MapLibre GL JS продолжает работу без контроля местоположения.
Геолокационные события влияют на интерфейс:
Система событий позволяет строить реактивный интерфейс, где карта отражает реальное состояние устройства без ручного опроса API.