GeolocateControl представляет собой встроенный UI-компонент, обеспечивающий доступ к геолокации пользователя через браузерный механизм получения координат. В основе работы лежит Geolocation API, который предоставляет доступ к текущему местоположению устройства при наличии разрешения.
Контрол используется для автоматического определения позиции пользователя, отображения маркера на карте, визуализации области точности и последующего отслеживания перемещений.
GeolocateControl добавляется к экземпляру карты через метод
addControl.
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({
positionOptions: {
enableHighAccuracy: true
},
trackUserLocation: true,
showUserLocation: true
});
map.addControl(geolocate);
Контрол добавляется как стандартный элемент интерфейса и отображается в панели управления картой.
Параметр positionOptions напрямую передаётся в
Geolocation API и определяет точность и поведение запроса координат.
Основные свойства:
enableHighAccuracy — включает повышенную точность (GPS
вместо сети)timeout — максимальное время ожидания координатmaximumAge — допустимость кэшированных данныхpositionOptions: {
enableHighAccuracy: true,
timeout: 6000,
maximumAge: 0
}
Высокая точность увеличивает энергопотребление и время получения координат, особенно на мобильных устройствах.
Опция trackUserLocation активирует непрерывное
отслеживание перемещений пользователя.
trackUserLocation: true
Поведение:
При отключённом режиме происходит единичное определение координат.
Определяет визуализацию текущей позиции.
showUserLocation: true
При включении:
Управляет отображением окружности точности.
showAccuracyCircle: true
Круг точности отражает возможную погрешность координат, предоставленных устройством. Чем слабее сигнал, тем больше радиус.
Контрол генерирует ряд событий, позволяющих отслеживать процесс получения координат.
Срабатывает при успешном получении позиции.
map.on("geolocate", (e) => {
console.log(e.coords.longitude, e.coords.latitude);
});
Событие содержит объект coords:
Срабатывает при ошибке доступа к геолокации.
map.on("error", (e) => {
console.log("Ошибка геолокации", e);
});
Типичные причины:
Активируется при начале отслеживания перемещения.
map.on("trackuserlocationstart", () => {
console.log("Отслеживание включено");
});
Срабатывает при остановке отслеживания.
map.on("trackuserlocationend", () => {
console.log("Отслеживание завершено");
});
GeolocateControl позволяет программно инициировать запрос координат:
geolocate.trigger();
Этот вызов эквивалентен нажатию на кнопку управления.
Остановка отслеживания осуществляется через:
geolocate.stop();
После вызова:
Работа контроллера зависит от ограничений Geolocation API:
При отказе в доступе повторные запросы могут игнорироваться браузером до перезагрузки страницы.
GeolocateControl может изменять:
const geolocate = new maplibregl.GeolocateControl({
trackUserLocation: true,
showUserLocation: true,
showUserHeading: true
});
map.addControl(geolocate);
map.on("geolocate", (e) => {
map.flyTo({
center: [e.coords.longitude, e.coords.latitude],
zoom: 14
});
});
Контрол по умолчанию использует стандартную кнопку. Варианты кастомизации:
position при добавлении:map.addControl(geolocate, "top-right");
Возможные позиции:
top-lefttop-rightbottom-leftbottom-rightПри слабом сигнале:
Особенности:
Чаще используется:
Повторный вызов trigger():
GeolocateControl часто интегрируется с:
Пример обновления слоя:
map.on("geolocate", (e) => {
map.getSource("user-position").setData({
type: "Point",
coordinates: [e.coords.longitude, e.coords.latitude]
});
});
При использовании trackUserLocation: true важно
учитывать:
Рекомендации по снижению нагрузки:
Геолокация является чувствительной функцией браузера:
Контрол не может обойти эти ограничения и полностью зависит от поведения браузера и системы.