Точность геолокации

Точность определения местоположения в веб-картах в первую очередь зависит от того, каким источником координат пользуется браузер. В контексте MapLibre GL JS геолокация почти всегда опирается на стандартную Geolocation API, который агрегирует данные из нескольких систем: GPS, Wi-Fi, мобильных сетей и датчиков устройства.

Основные источники координат

GPS остаётся наиболее точным методом приёмки координат на открытой местности. Однако в реальных условиях браузерные приложения получают смешанный сигнал:

  • GPS (спутниковая навигация) — высокая точность на улице, до нескольких метров
  • Wi-Fi позиционирование — средняя точность в городской среде
  • Сотовые сети — низкая точность, десятки или сотни метров
  • IP-геолокация — вспомогательный, грубый уровень определения региона

Каждый источник влияет на итоговое значение coords.accuracy, которое возвращается через Geolocation API и интерпретируется картографической библиотекой.

Параметр accuracy и его интерпретация

В объекте позиции ключевым является поле:

position.coords.accuracy

Оно выражается в метрах и задаёт радиус неопределённости. В MapLibre GL JS это значение используется для построения окружности точности вокруг маркера пользователя.

При высоком значении accuracy (например, 100–500 м) отображение становится условным. При низком (5–20 м) можно считать позицию практически точной для навигации.

Работа с геолокацией в MapLibre GL JS

В MapLibre GL JS существует встроенный контрол:

  • GeolocateControl

Он является основным инструментом отображения и отслеживания местоположения пользователя.

Базовая инициализация GeolocateControl

const geolocate = new maplibregl.GeolocateControl({
    positionOptions: {
        enableHighAccuracy: true,
        timeout: 6000
    },
    trackUserLocation: true,
    showAccuracyCircle: true
});

map.addControl(geolocate);

Параметр enableHighAccuracy напрямую влияет на использование GPS. При включении браузер активнее обращается к энергозатратным сенсорам, повышая точность.

Разница между режимами отслеживания

  • Однократное определение позиции
  • Непрерывное отслеживание (trackUserLocation: true)
  • Режим наблюдения за изменением координат (watchPosition внутри API)

Непрерывное отслеживание увеличивает нагрузку на устройство, но снижает задержку обновления позиции.

Поведение в условиях низкой точности

В городских условиях сигнал GPS часто деградирует из-за:

  • отражений от зданий (multipath effect)
  • перекрытия неба
  • переключения между Wi-Fi точками
  • нестабильного сигнала мобильной сети

В результате координаты начинают «дрожать», создавая эффект скачущего маркера.

Фильтрация шумов

В MapLibre GL JS фильтрация обычно реализуется на уровне приложения:

let lastPosition = null;

function smoothPosition(newPos) {
    if (!lastPosition) {
        lastPosition = newPos;
        return newPos;
    }

    const alpha = 0.2;

    return {
        longitude: lastPosition.longitude * (1 - alpha) + newPos.longitude * alpha,
        latitude: lastPosition.latitude * (1 - alpha) + newPos.latitude * alpha
    };
}

Такой подход уменьшает визуальные скачки без вмешательства в сам Geolocation API.

Влияние браузера и устройства

Разные браузеры интерпретируют данные геолокации по-разному:

  • Chrome чаще использует комбинированный источник GPS + Wi-Fi
  • Safari на iOS тесно интегрирован с системной службой геолокации
  • Firefox может снижать частоту обновлений ради экономии энергии

Также важны аппаратные ограничения:

  • отсутствие GPS-модуля (стационарные устройства)
  • энергосберегающий режим
  • ограничение фоновой работы сенсоров

Погрешности и визуализация

MapLibre GL JS визуализирует точность через радиус вокруг точки пользователя. Этот радиус напрямую соответствует coords.accuracy.

Типичная реализация слоя точности:

{
    "type": "circle",
    "paint": {
        "circle-radius": [
            "interpolate",
            ["linear"],
            ["zoom"],
            0, 0,
            20, ["get", "accuracy"]
        ],
        "circle-color": "#3b82f6",
        "circle-opacity": 0.2
    }
}

Такой слой позволяет визуально оценивать доверие к данным позиции.

Геолокация в условиях слабого сигнала

При слабом сигнале браузер может:

  • возвращать устаревшую позицию (timestamp)
  • увеличивать accuracy
  • переключаться на IP-геолокацию
  • снижать частоту обновлений

Это особенно заметно при движении в транспорте, метро или внутри зданий.

Влияние частоты обновления

Метод watchPosition принимает параметры:

navigator.geolocation.watchPosition(success, error, {
    enableHighAccuracy: true,
    maximumAge: 0,
    timeout: 10000
});
  • maximumAge: 0 — всегда свежие данные
  • большие значения допускают использование кэша
  • высокая частота обновления увеличивает нагрузку и энергопотребление

Геометрическая интерпретация ошибки

Погрешность геолокации можно рассматривать как окружность неопределённости вокруг реальной точки.

genui{“math_block_widget_always_prefetch_v2”:{“content”:“A = r^2”}}

где r — значение accuracy в метрах. Чем больше радиус, тем больше область возможного нахождения пользователя.

Комбинирование геолокации с картографическими данными

В прикладных системах MapLibre GL JS точность часто повышают через сопоставление с дорогами (map matching). Это позволяет «прилипать» к маршрутам даже при шумных GPS-данных.

Типичные подходы:

  • привязка к ближайшей дороге
  • фильтрация по скорости движения
  • анализ направления (bearing)
  • использование истории координат

Типовые сценарии деградации точности

  1. Городские каньоны — отражение сигнала
  2. Подземные помещения — отсутствие GPS
  3. Высокая скорость движения — запаздывание обновлений
  4. Переключение между сетями — скачки координат

Практическое поведение GeolocateControl

Внутренний цикл работы можно представить так:

  1. Запрос разрешения на геолокацию
  2. Получение первичной позиции
  3. Подписка на обновления
  4. Отображение маркера
  5. Обновление радиуса точности
  6. Перерисовка слоя карты

Каждый этап зависит от качества данных, поступающих от устройства и браузера.

Особенности WebGL-рендеринга и задержек

Поскольку MapLibre GL JS использует WebGL, обновление позиции проходит через графический пайплайн. Это означает:

  • обновление маркера происходит в кадрах (frames)
  • при высокой нагрузке возможна задержка визуализации
  • частые обновления требуют оптимизации state diffing

Точность геолокации в веб-картах определяется не только физическим качеством сигнала, но и тем, как браузер агрегирует источники, как приложение обрабатывает шум и как визуально интерпретируются данные на карте.