Skip to Content
Основные понятияРасширенная геолокация

Расширенная геолокация

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


1. Фильтр Калмана (сглаживание траектории)

Необработанные данные GPS по своей сути содержат шум. Если пользователь идет по прямой дороге, необработанные координаты будут случайным образом скакать влево и вправо, создавая «зубчатую» линию. Если вы вычислите расстояние этой зубчатой ​​линии, это искусственно увеличит общее расстояние пользователя до 20%.

Как это работает

Установив useKalmanFilter: true, Tracelet применяет усовершенствованный математический алгоритм, первоначально разработанный для навигации космических кораблей. Он объединяет текущее положение GPS со скоростью устройства (скорость и курс), чтобы предсказать, где на самом деле находится пользователь, эффективно сглаживая шум и создавая идеальную изогнутую линию.

final config = Config.highAccuracy( geo: tl.GeoConfig( filter: tl.LocationFilter( useKalmanFilter: true, // Enable trajectory smoothing trackingAccuracyThreshold: 50, ), ), );

2. Точный расчет (туннели и GPS запрещены)

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

Как это работает

Установив enableDeadReckoning: true, Tracelet обнаруживает потерю GPS и мгновенно плавно переключается на внутренний IMU (инерциальный измерительный блок) устройства. Он использует акселерометр и гироскоп для продолжения расчета траектории пользователя на основе его последней известной скорости, имитируя обновления GPS, даже находясь полностью под землей.

final config = Config.balanced( geo: tl.GeoConfig( enableDeadReckoning: true, deadReckoningActivationDelay: 10, // Wait 10 seconds of no GPS before activating deadReckoningMaxDuration: 300, // Stop dead reckoning after 5 minutes to prevent drift ), );

3. Эластичность (высокоскоростная оптимизация)

Если для параметра distanceFilter установлено значение 20 метров, Tracelet просыпается каждые 20 метров. Если пользователь едет со скоростью 120 км/ч по прямой трассе, он преодолевает 20 метров менее чем за секунду. Это приводит к тому, что база данных заполняется сотнями бесполезных точек по идеально прямой линии, что разряжает батарею.

Как это работает

Эластичность системы Tracelet определяет высокие скорости и динамически растягивает фильтр расстояний. Фильтр длиной 20 м может автоматически растягиваться до 200 м на шоссе и сжиматься обратно до 20 м, когда пользователь съезжает с съезда в город.

final config = Config.balanced( geo: tl.GeoConfig( disableElasticity: false, // Ensure elasticity is on elasticityMultiplier: 2.0, // Make the dynamic stretching 2x more aggressive ), );

4. Адаптивный режим (сохранение заряда батареи)

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

Как это работает

Установив enableAdaptiveMode: true, Tracelet постоянно отслеживает API-интерфейсы батареи операционной системы. Когда уровень заряда батареи падает ниже критических порогов (например, 20%, 10%), Tracelet автоматически понижает версию desiredAccuracy с GPS до Wi-Fi/сотовой связи и расширяет distanceFilter, сохраняя достаточно энергии для поддержания работоспособности телефона.

final config = Config.balanced( geo: tl.GeoConfig( enableAdaptiveMode: true, ), );

5. Редкие обновления (только вышки сотовой связи)

Иногда вам не нужна точность пошаговой навигации; вам просто нужно примерно знать, в каком городе или районе находится пользователь (например, приложение социальной сети или приложение погоды).

Как это работает

Включив enableSparseUpdates, Tracelet полностью обходит энергоемкий чип GPS. Для обновления местоположения он использует исключительно передачу обслуживания вышки сотовой связи и триангуляцию Wi-Fi. Разряд батареи падает почти до нуля.

final config = Config.lowPower( geo: tl.GeoConfig( enableSparseUpdates: true, sparseDistanceThreshold: 500.0, // Only trigger if they move 500m sparseMaxIdleSeconds: 3600, // Or trigger once an hour even if they haven't moved ), );

6. Параметры живого поставщика (переопределения времени выполнения)

Иногда ваше приложение знает что-то, чего не может SDK: водитель службы доставки только что назначил 30-минутный перерыв, пассажир ждет внутри заведения или сработала ваша собственная стационарная эвристика. Вы хотите отключить GPS прямо сейчас — и вернуться к полной точности в тот момент, когда что-то изменится.

До сих пор единственной кнопкой была setConfig(). Но desiredAccuracy и distanceFilter являются ключами, важными для отслеживания, поэтому их изменение через конфигурацию сохраняет новые значения и выполняет чистый полный перезапуск конвейера — правильно для постоянной конфигурации, но это создает пробел в отслеживании, которого можно избежать, и перестраивает состояние процессора только для применения временной политики электропитания. Хуже того, поскольку изменение сохраняется, приложение, завершенное и перезапущенное во время фазы «низкого энергопотребления», просыпается и постоянно отслеживает с пониженной точностью.

Как это работает

Tracelet.updateLocationProviderOptions() обновляет работающий поставщик местоположения ОС — ни stop(), ни start(), ни пробелов в потоке исправлений:

  • iOS присваивает новые значения непосредственно действующему CLLocationManager (desiredAccuracy / distanceFilter изменяются в активном менеджере).
  • Android повторно подписывает существующий обратный вызов Fed-Provider с помощью нового LocationRequest. Повторная регистрация того же обратного вызова заменяет существующий запрос, поэтому подписка никогда не прерывается.
  • Web не имеет действующих элементов управления поставщика и всегда возвращает false.

Это переопределение намеренно является эфемерным и предназначено только для провайдера:

  • Сохраняющиеся Config и Tracelet.activeConfig никогда не затрагиваются — в хранилище ничего не записывается, поэтому перезапуск процесса всегда возвращается к вашей реальной конфигурации.
  • Фильтр принятых точек Rust и состояние процессора не изменяются: непрерывность отслеживания, одометр и то, какие доставленные точки принимаются, — все продолжает работать точно так, как настроено.
  • Вызов stop() автоматически очищает переопределение.
// Device confirmed stationary — drop Core Location to ~100m accuracy // and only deliver a fix every 25 meters: await Tracelet.updateLocationProviderOptions( desiredAccuracy: DesiredAccuracy.medium, distanceFilter: 25, ); // Movement detected — restore the configured provider options. // No arguments = clear the override: await Tracelet.updateLocationProviderOptions();

Возвращаемое значение и проверка

Вызов возвращает true, если было применено оперативное обновление, и false, если этого не может быть — он никогда не перезапускает конвейер в качестве резервного варианта:

СитуацияРезультат
Постоянное отслеживание активно (iOS/Android)true — параметры применяются в реальном времени
Отслеживание не началось или был вызван stop()НОТРАНС1ЛАТЕ
Режим периодического отслеживания активенfalse — периодические исправления управляют собственным приобретением
Интернетfalse — никаких текущих обновлений от провайдера

distanceFilter должен быть конечным и неотрицательным (в противном случае выдается RangeError). Значение 0 запрашивает каждое исправление, производимое поставщиком (kCLDistanceFilterNone в iOS).

Переопределение времени выполнения в сравнении с адаптивным режимомenableAdaptiveMode (раздел 4) — это автоматическая версия: SDK следит за зарядом батареи и выполняет переход на более раннюю версию за вас. Используйте updateLocationProviderOptions(), если политика ваша — обнаружение стационарных объектов, перерывы в сменах, задержка в геозонах, пользовательские пороговые значения заряда батареи — и вам нужно, чтобы она применялась мгновенно, не сохраняя ничего и не прерывая отслеживание.