Комментарии 3
Спасибо за статью, очень зашло. Сам делаю похожее (велосипедные маршруты, карта, офлайн), поэтому навопрошу)
Про офлайн-районы. Как у тебя район упакован — это один архив со всем внутри (тайлы, граф, высоты) или куча отдельных файлов и манифест? И докачка как работает — целиком район перекачивается или только изменившиеся куски?
Про запись трека. Какой фильтр шума GPS используешь? Просто отсекаешь по accuracy или что-то умнее? У меня точки иногда уезжают метров на 50 в сторону, пока не победил.
И про батарею — сколько в итоге телефон живёт с записью трека? И как борешься с ксяоми всякими, которые фоновые процессы убивают? Это вообще решаемо?
Телеметрия у тебя самописная? Интересно, что шлёшь с телефона и куда это всё складывается. Понимаю, что без неё ты бы половину из статьи не нашёл, хочу себе такое же, но не хочется велосипедить.
Заранее спасибо)
1. Упаковка района и докачка. Не один архив: на район несколько отдельных файлов (карта , данные — тропы/точки/ручьи/горизонтали, файл прокладки, высоты, сёла, список точек). В S3 лежит — каталог с точным размером каждого файла. Докачка: файл целиком не перекачивается, но и не частями. Сверка идёт по размеру файла байт в байт (допуск в килобайт съел реальную пересборку, пришлось убрать). Совпал — пропускаем, нет — качаем этот файл заново. «Дозакачать» добирает только недостающие файлы и клетки, а не весь район. Дельты внутри файла нет.
2. Фильтр GPS. Простой, не умный: отсекаю точки с accuracy > 50 м и точки ближе 4 м к предыдущей (стояние на месте). Набор высоты — гистерезис 5 м. Ваши «уезжания на 50 м» при хорошей заявленной точности он не поймает: нужен фильтр по скорости между точками (отбрасывать, если прыжок физически невозможен) или сглаживание Калмана. Я такого не делал. Буду ещё доделывать.
3. Батарея и Xiaomi. Честно: замеров расхода батареи у меня нет, называть цифру было бы враньём. Что есть: foreground-сервис с постоянным уведомлением, BestForNavigation, шаг 3 с / 5 м. Без сервиса Android глушит GPS через пару минут после погасшего экрана. Против убийства процесса на Xiaomi/MIUI я ничего не делаю, кроме killServiceOnDestroy: false. Кнопки «отключить оптимизацию батареи» и инструкций по автозапуску нет. Частично решаемо: ручные настройки у пользователя (автозапуск, «Без ограничений» для батареи) плюс сайт dontkillmyapp.com, но это не гарантия. Если процесс всё же убит, точки уже в SQLite, а прерванная запись подхватывается при следующем запуске. Буду доделывать , ещё к этому вернусь.
4. Телеметрия. Была самописная и временная: приложение слало замеры на сервер, nginx складывал в jsonl-файлы на сервере. Для вашего случая велосипедить не нужно: Sentry (ошибки и производительность, есть Expo-интеграция) закроет большую часть. Свои метрики типа «время построения маршрута» легко добавить событиями в PostHog.
У походного сервиса есть неприятная особенность: он нужнее всего там, где нет связи.
А в итоге запилили сервер. Автономность пропала.

Офлайн-карта в кармане: 48 районов, PMTiles и телефон, который в 90 раз медленнее ноутбука