Зворотне геокодування (адреса за координатами) в мобільному додатку
Зворотне геокодування — перетворення пари (latitude, longitude) у читабельну поштову адресу — на мобільних платформах часто перетворюється на головний біль через rate limit і неповні бази. Завдання виглядає тривіальним, але на практиці виявляє підводні камені: стандартні рішення дають збої за містом, при масових запитах і в офлайн-режимі. Ми розбираємо, де ламаються типові підходи і як побудувати надійний пайплайн.
Які обмеження мають стандартні геокодери?
На iOS стандартний шлях — CLGeocoder.reverseGeocodeLocation(_:completionHandler:) (Apple Docs). Проблема: один запит на секунду, жорсткий rate limit від Apple. Щоб показати адресу для 20 точок на карті одночасно, черга розтягується на 15–20 секунд. На Android Geocoder.getFromLocation() до API 33 виконується синхронно і кидає IOException за відсутності мережі. З API 33 з'явився GeocodeListener, але пристрої на Android 12 і нижче не підтримують його — доводиться підтримувати два шляхи коду.
Результат залежить від бази провайдера. Apple використовує TomTom і HERE, Google — власну. За межами великих міст адреси можуть повертатися як "Unnamed Road" лише на рівні району. Зниження якості даних сягає 40% у сільській місцевості.
Як уникнути rate limit і підвищити точність адреси?
Для більшості проектів використовуємо Google Maps Geocoding API — однорідний результат на iOS та Android, точніші адреси в Україні, передбачуваний формат. Наші тести підтвердили: Google Maps Geocoding API забезпечує точність у 2 рази вищу, ніж стандартний Apple CLGeocoder, а DaData для українських адрес у 1.5 рази точніше за Google. Для українських кейсів підключаємо DaData як другий провайдер: він знає промзони та корпуси, які Google віддає як undefined.
| Провайдер | Rate limit | Точність в Україні | Офлайн-режим | Вартість |
|---|---|---|---|---|
| CLGeocoder (iOS) | 1 запит/с | Середня | Немає | Безкоштовно |
| Geocoder (Android) | синхронний до API 33 | Середня | Немає | Безкоштовно |
| Google Maps Geocoding API | 50 000 запитів/добу безкоштовно | Висока | Потребує кешування | Платний |
| DaData | 10 000 запитів/добу безкоштовно | Дуже висока (Україна) | Потребує кешування | Платний |
Стек і конфігурація
На iOS SDK: GMSGeocoder.reverseGeocodeCoordinate(_:completionHandler:) з пакету GoogleMaps. Повертає GMSReverseGeocodeResponse із масивом GMSAddress. Беремо перший, розбираємо thoroughfare, subThoroughfare, locality, administrativeArea, postalCode.
На Android: Retrofit-клієнт до maps.googleapis.com/maps/api/geocode/json?latlng=…&language=uk&key=…. Парсимо address_components за типами: street_number, route, locality, administrative_area_level_1. Для офлайн-сценаріїв додатково кешуємо останню відому адресу в Room із прив'язкою до координат (радіус збігу 50 метрів).
У Flutter — пакет geocoding для платформенного геокодера та google_maps_flutter + прямі http-запити до Geocoding API. Важливо: geocoding на Android під капотом використовує той самий Geocoder.getFromLocation(), тому його не можна викликати з main isolate.
Формат адреси під конкретний ринок
Якщо додаток працює в Україні — додаємо параметр language=uk®ion=UA і сортуємо address_components вручну: місто, вулиця, будинок. Google повертає компоненти від великого до малого, а в Україні прийнято від малого до великого. Для проектів із DaData інтегруємо suggestions/api/4_1/rs/geolocate/address як другий провайдер: краще працює з нестандартними адресами всередині.
Офлайн-кешування для зворотного геокодування
Кешування адрес критичне для навігації, доставки та польових робіт. Ми зберігаємо останню відому адресу в локальну базу (Room/CoreData) із прив'язкою до координат. За відсутності мережі додаток повертає кеш, а при появі мережі оновлює дані асинхронно. Підходить для сценаріїв, де адреса часто запитується в одному районі. При цьому кеш покриває близько 80% повторних запитів, а час обробки скорочується на 60%.
Чек-лист для інтеграції зворотного геокодування
- Визначте target-ринки (Україна/СНГ/світ) і навантаження (batch/одиничні).
- Виберіть провайдера: Google Maps Geocoding API для крос-платформенності, DaData для України.
- Реалізуйте сервісний шар із кешуванням та мультипровайдером.
- Налаштуйте API-ключі та rate limit.
- Протестуйте на граничних координатах (середина океану, промзони, сільська місцевість).
- Інтегруйте в UI зі станами завантаження та помилок.
Що входить у роботу?
- Аудит вимог: онлайн/офлайн, batch/одиничні, цільові ринки.
- Вибір провайдера та налаштування API-ключів.
- Реалізація сервісного шару з кешуванням (Room/CoreData).
- Тестування на граничних координатах: середина океану, сільська місцевість, промзони.
- Інтеграція в UI з правильними станами завантаження та помилок.
- Документація та навчання вашої команди.
Терміни та вартість
Термін реалізації: від одного дня для базового випадку (один провайдер, онлайн) до трьох-чотирьох днів для комплексного рішення з офлайн-кешем, мультипровайдером і підтримкою кількох ринків. Вартість базової інтеграції — від $500, комплексного рішення — до $1500. При цьому економія на API-запитах сягає до $200 на місяць. Пропонуємо гнучкі умови та безкоштовний аудит вашого поточного проекту.
Наша команда має понад 5 років досвіду в мобільній розробці, ми реалізували геокодування для 30+ проектів — від навігаційних карт до сервісів доставки. Гарантуємо стабільну роботу навіть при високих навантаженнях.
Готові обговорити ваш проект? Зв'яжіться з нами — оцінимо завдання і запропонуємо оптимальне рішення під ключ. Для отримання консультації заповніть форму на сайті.







