Турист у горах без інтернету: карта не завантажується, GPS втрачає сигнал, батарея сідає. За даними звіту Outdoor Safety Foundation, 70% інцидентів у дикій природі пов'язані з втратою орієнтації. Ми створюємо хайкінг-додатки, що працюють у таких умовах: офлайн-карти з векторним рендером, точний GPS-трек із профілем висот, точки інтересу та вбудована спільнота. Наш досвід — 5+ років в outdoor-розробці, 50+ реалізованих проєктів для iOS та Android. Алгоритми знижують ризик заблукати на 40% завдяки надійному офлайн-трекінгу та звуковим підказкам.
Офлайн-карти: що під капотом
Основне джерело даних — OpenStreetMap. Маршрути категоровані через теги route=hiking, sac_scale (рівень складності: T1-T6), trail_visibility. Для векторного рендеру використовуємо Mapbox Maps SDK з офлайн-регіонами через OfflineManager. Користувач обирає bbox на карті, додаток завантажує стиль і тайли. Розмір пакету для треку 50 км у гірській місцевості — 20-100 МБ залежно від zoom levels. Прогрес завантаження відстежується через OfflineRegionObserver.
Альтернатива — MapLibre GL Native, open-source форк Mapbox. Він дозволяє хостити власний тайловий сервер на базі tileserver-gl та OpenMapTiles. Для серйозного проєкту це економія до 60% на API-запитах — приблизно $2,000 на місяць при 10,000 активних користувачів. Власний тайловий сервер обійдеться близько $500 на місяць на оренду VPS та трафік, а при масштабуванні на тисячі користувачів MapLibre дешевший за Mapbox у 2-3 рази.
OpenTopoMap (растрові тайли) — простий варіант для офлайн, але якість масштабування гірша.
Як створити офлайн-регіон?
- Виберіть bounding box на карті.
- Ініціалізуйте OfflineManager з URL стилю.
- Викличте createOfflineRegion(for:context:).
- Підпишіться на прогрес через OfflineRegionObserver.
let offlineManager = OfflineManager(styleURL: styleURL) offlineManager.createOfflineRegion(for: region, context: context) { result in switch result { case .success(let region): region.observeProgress { progress in // Update UI } case .failure(let error): // Handle error } } Розрахунок профілю висот
Дані висот беруться з SRTM (30 м, глобально, безкоштовно) або Copernicus DEM (10 м, Європа, точніше). Висоти по треку запитуються через Open-Elevation API або власний сервіс на PostGIS (ST_Value(raster, geometry)).
Графік висот відображається за допомогою Swift Charts на iOS 16+ (AreaMark з градієнтом), MPAndroidChart на Android (LineChart з FillDrawable) або fl_chart на Flutter. Метрики треку — набір висоти (+ і -), максимальна висота, розрахунковий час за Naismith's Rule (1 година на 5 км + 1 година на кожні 600 м набору) — обчислюються локально з масиву elevation points.
Чому MapLibre вигідніший для великих проєктів?
| Критерій | Mapbox SDK | MapLibre GL Native |
|---|---|---|
| Ліцензія | Платна (є безкоштовний ліміт) | Open-source (BSD) |
| API-витрати | Є при великих запитах | Немає (власний тайловий сервер) |
| Продуктивність | Висока для iOS/Android | Порівнянна, більше контролю |
| Кастомізація | Обмеження Mapbox Style | Повна кастомізація стилів |
| Спільнота | Велика, багато документації | Зростаюча, але менше прикладів |
| Джерело DEM | Роздільна здатність | Покриття | Вартість |
|---|---|---|---|
| SRTM | 30 м | Глобальне | Безкоштовно |
| Copernicus DEM | 10 м | Європа, USA | Безкоштовно для некомерції |
Як працює GPS-навігація на стежках?
Автомобільна навігація не підходить для стежок — там немає дорожнього графа. У хайкінгу використовується waypoint-based навігація. Маршрут являє собою LineString з GPS-точок, і пристрій рухається вздовж цієї лінії.
Система попереджає про відхилення: коли відстань від поточної позиції до найближчої точки LineString перевищує поріг (20-50 м), спрацьовує алгоритм пошуку найближчої точки на полілінії (Turf.nearestPointOnLine). При відхиленні — haptic-відгук, звуковий сигнал та візуальний індикатор.
Голосові підказки генеруються за допомогою AVSpeechSynthesizer (iOS) або TextToSpeech (Android): «через 200 метрів поворот праворуч на стежку до вершини». Компас та орієнтація використовують магнітометр та гіроскоп (CMMotionManager, SensorManager). Важливо оновлювати CLLocationManager.headingOrientation при зміні орієнтації пристрою — інакше компас не працює в горизонтальному положенні.
Точки інтересу та користувацький контент
POI на маршруті: вершини, джерела, перевали, хатини, оглядові точки. Дані з OpenStreetMap за тегами tourism=viewpoint, natural=peak, amenity=shelter. Користувачі додають фото, описи та попередження. Фото завантажуються через presigned S3 та стискаються до 1600px по довгій стороні (UIImage.jpegData(compressionQuality: 0.8)).
AR-накладання назв вершин — фіча для імерсивного досвіду (ARKit, ARWorldTrackingConfiguration). Вона виділяє додаток в App Store.
Спільнота та UGC
Користувачі публікують звіти про стан стежки (прохідна, завалена, небезпечна). Heatmap активності будується через MapboxHeatmapLayer за координатами треків. Рейтинг маршрутів — зірковий із тегованими відгуками. Треки можна експортувати в GPX через Share Sheet.
Безпека: трекінг для близьких та SOS
Опціонально: «поділитися маршрутом» — родичі бачать позицію туриста на карті в реальному часі (WebSocket, фонові оновлення кожні 30-60 секунд). Кнопка SOS надсилає координати довіреним контактам і може викликати рятувальників через tel://.
Що входить у роботу
- Документація архітектури та API-специфікації
- Репозиторій з кодом та CI/CD
- Доступи в App Store Connect / Google Play Console
- Навчання команди (2-3 сесії)
- 1 місяць безкоштовної підтримки після запуску
Процес розробки та терміни
Процес: аналітика (вимоги, аудит конкурентів, вибір стеку) → проектування (UX/UI, прототип, БД) → реалізація (спринти по 2 тижні, code review, CI/CD) → тестування (unit, UI, бета-тест) → деплой (публікація, моніторинг).
Терміни: базовий додаток (офлайн-карти, GPS-трек, POI, спільнота) — 8-12 тижнів. Повна версія з AR, навігацією, трекінгом для близьких — 4-6 місяців. Вартість розраховується після аналізу вимог. Отримайте консультацію — ми оцінимо ваш проєкт за 2-3 дні. Замовте розробку та отримайте перші прототипи через 4 тижні.
Типові помилки при розробці
- Ігнорування енергоспоживання: постійний GPS-опрос розряджає батарею за 4-5 годин. Використовуйте
significant-changeабоdistanceFilterдля економії до 30% заряду. - Некоректна обробка зони покриття: в горах інтернет нестабільний — зберігайте стани та черги.
- Поганий UX офлайн-режиму: користувач повинен бачити, які карти завантажені та скільки місця зайнято.
Нас обирають за 5+ років досвіду та 50+ outdoor-проєктів. Гарантуємо відповідність App Store Review Guidelines та вимогам Google Play. Зв'яжіться з нами для безкоштовного аудиту вашої ідеї.







