Геолокация в Leaflet основана на браузерном API
navigator.geolocation, которое предоставляет доступ к
текущим координатам устройства и режиму непрерывного отслеживания
перемещения.
Внутри Leaflet используется абстракция:
map.locate(options) — запуск определения
местоположенияОсновные параметры locate:
setView: true — автоматическое центрирование картыmaxZoom — масштаб при успешном определении позицииwatch: true — включение постоянного отслеживанияenableHighAccuracy: true — повышение точности GPStimeout — максимальное время ожиданияmaximumAge — допустимость кэшированных координатВ режиме watch: true браузер начинает регулярно
отправлять обновления координат при изменении положения устройства. Это
создаёт непрерывный поток событий, который требует корректного
управления жизненным циклом.
Leaflet генерирует набор событий, связанных с геолокацией:
locationfound — успешное получение координатlocationerror — ошибка определения позицииСтруктура объекта события locationfound:
latlng — координаты пользователяaccuracy — радиус погрешностиbounds — предполагаемая областьЭти данные используются для:
При включении:
map.locate({ watch: true });
браузер активирует watchPosition, возвращающий
идентификатор наблюдения (watchId). Этот идентификатор
становится ключевым элементом управления процессом.
Каждое изменение координат вызывает повторное событие
locationfound, что позволяет:
При длительной работе карты с геолокацией возникает необходимость остановки наблюдения. В чистом браузерном API это реализуется через:
navigator.geolocation.clearWatch(watchId);
Leaflet не всегда экспонирует прямой метод остановки как часть ядра, поэтому управление происходит через один из подходов:
При запуске наблюдения сохраняется идентификатор:
const watchId = navigator.geolocation.watchPosition(success, error, options);
Далее он используется для остановки:
navigator.geolocation.clearWatch(watchId);
В архитектуре некоторых обёрток и расширений встречается абстракция:
map.stopLocate();
Данный вызов концептуально выполняет:
В ядре Leaflet чаще применяется косвенный контроль через
clearWatch, однако логика остановки всегда сводится к
прекращению подписки браузерного геолокационного сервиса.
При создании расширяемого слоя поверх карты формируется собственный контроллер геолокации:
let watchId = null;
function startTracking(map) {
watchId = navigator.geolocation.watchPosition(
(pos) => {
const latlng = [pos.coords.latitude, pos.coords.longitude];
map.setView(latlng);
},
(err) => console.error(err),
{ enableHighAccuracy: true }
);
}
function stopTracking() {
if (watchId !== null) {
navigator.geolocation.clearWatch(watchId);
watchId = null;
}
}
Такой подход обеспечивает:
При повторных вызовах:
map.locate({ watch: true });
map.locate({ watch: true });
без остановки предыдущего процесса возможно возникновение:
locationfoundПоэтому перед запуском нового отслеживания применяется стратегия:
Событие locationerror содержит:
code — тип ошибкиmessage — описаниеТиповые коды:
Корректная обработка включает:
При активном отслеживании важно учитывать взаимодействие с картой:
setView может конфликтовать с
пользовательским управлениемТиповая логика:
Браузерный watchPosition может генерировать частые
события. Для снижения нагрузки применяются:
accuracyПример логики фильтрации:
На мобильных устройствах поведение отличается:
При длительном отслеживании важно:
Геолокация часто используется совместно с:
L.circle)Обновление слоя происходит синхронно с событием
locationfound, что позволяет строить динамическую
визуализацию перемещения в реальном времени.