stopLocate

Геолокация в Leaflet основана на браузерном API navigator.geolocation, которое предоставляет доступ к текущим координатам устройства и режиму непрерывного отслеживания перемещения.

Внутри Leaflet используется абстракция:

  • map.locate(options) — запуск определения местоположения
  • режим одиночного запроса координат
  • режим постоянного наблюдения (watch mode)

Основные параметры locate:

  • setView: true — автоматическое центрирование карты
  • maxZoom — масштаб при успешном определении позиции
  • watch: true — включение постоянного отслеживания
  • enableHighAccuracy: true — повышение точности GPS
  • timeout — максимальное время ожидания
  • maximumAge — допустимость кэшированных координат

В режиме watch: true браузер начинает регулярно отправлять обновления координат при изменении положения устройства. Это создаёт непрерывный поток событий, который требует корректного управления жизненным циклом.


Событийная модель геолокации

Leaflet генерирует набор событий, связанных с геолокацией:

  • locationfound — успешное получение координат
  • locationerror — ошибка определения позиции

Структура объекта события locationfound:

  • latlng — координаты пользователя
  • accuracy — радиус погрешности
  • bounds — предполагаемая область

Эти данные используются для:

  • центрирования карты
  • отображения маркера пользователя
  • построения зоны точности (circle accuracy radius)

Режим непрерывного отслеживания

При включении:

map.locate({ watch: true });

браузер активирует watchPosition, возвращающий идентификатор наблюдения (watchId). Этот идентификатор становится ключевым элементом управления процессом.

Каждое изменение координат вызывает повторное событие locationfound, что позволяет:

  • обновлять позицию маркера в реальном времени
  • изменять границы отображаемой области
  • пересчитывать маршруты или зоны интереса

Управление жизненным циклом отслеживания

При длительной работе карты с геолокацией возникает необходимость остановки наблюдения. В чистом браузерном API это реализуется через:

navigator.geolocation.clearWatch(watchId);

Leaflet не всегда экспонирует прямой метод остановки как часть ядра, поэтому управление происходит через один из подходов:

Хранение watchId

При запуске наблюдения сохраняется идентификатор:

const watchId = navigator.geolocation.watchPosition(success, error, options);

Далее он используется для остановки:

navigator.geolocation.clearWatch(watchId);

Остановка режима locate

В архитектуре некоторых обёрток и расширений встречается абстракция:

map.stopLocate();

Данный вызов концептуально выполняет:

  • завершение активного watch-соединения
  • отключение подписки на обновления координат
  • очистку внутренних слушателей геолокации

В ядре Leaflet чаще применяется косвенный контроль через clearWatch, однако логика остановки всегда сводится к прекращению подписки браузерного геолокационного сервиса.


Типовой паттерн реализации stopLocate

При создании расширяемого слоя поверх карты формируется собственный контроллер геолокации:

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;
  }
}

Такой подход обеспечивает:

  • явное управление состоянием
  • предотвращение утечек подписок
  • возможность повторного запуска без конфликтов

Поведение при множественных вызовах locate

При повторных вызовах:

map.locate({ watch: true });
map.locate({ watch: true });

без остановки предыдущего процесса возможно возникновение:

  • дублирования событий locationfound
  • параллельных watch-сессий
  • неконтролируемого роста нагрузки на GPS-модуль

Поэтому перед запуском нового отслеживания применяется стратегия:

  • проверка существующего watchId
  • принудительная остановка предыдущего процесса
  • запуск нового наблюдения

Обработка ошибок геолокации

Событие locationerror содержит:

  • code — тип ошибки
  • message — описание
  • возможные причины: отказ пользователя, отсутствие GPS, таймаут

Типовые коды:

  • 1 — доступ запрещён
  • 2 — позиция недоступна
  • 3 — таймаут

Корректная обработка включает:

  • остановку watch-сессии при критических ошибках
  • вывод альтернативного состояния карты
  • переключение в ручной режим навигации

Синхронизация с состоянием карты

При активном отслеживании важно учитывать взаимодействие с картой:

  • пользователь может вручную перемещать карту
  • автоматический setView может конфликтовать с пользовательским управлением
  • требуется режим “follow” с возможностью отключения

Типовая логика:

  • активен follow → карта следует за пользователем
  • пользователь начал панорамирование → follow отключается
  • при повторной активации → новый locate cycle

Оптимизация частоты обновлений

Браузерный watchPosition может генерировать частые события. Для снижения нагрузки применяются:

  • throttling обновлений координат
  • фильтрация по минимальному смещению
  • игнорирование шумовых изменений в пределах accuracy

Пример логики фильтрации:

  • обновлять позицию только при изменении > 5–10 метров
  • игнорировать повторяющиеся координаты
  • учитывать радиус погрешности

Геолокация в мобильных сценариях

На мобильных устройствах поведение отличается:

  • более высокая точность GPS
  • агрессивное энергосбережение
  • нестабильные обновления в фоне

При длительном отслеживании важно:

  • корректно завершать watch при сворачивании приложения
  • избегать постоянной активности GPS без необходимости
  • учитывать ограничения браузера в фоне

Интеграция с пользовательскими слоями

Геолокация часто используется совместно с:

  • маркерами текущего положения
  • кругами точности (L.circle)
  • маршрутными слоями
  • тепловыми картами перемещений

Обновление слоя происходит синхронно с событием locationfound, что позволяет строить динамическую визуализацию перемещения в реальном времени.