Офлайн-карти не є опціональними в тактичних застосунках. Оператори в спірних або віддалених середовищах не можуть покладатися на сервери тайлів. Пакет карт має бути на пристрої, доступним для запитів без доступу до інтернету і достатньо малим, щоб вміститися в доступне сховище. Два формати пакування тайлів домінують у тактичному використанні: MBTiles — усталений стандарт на основі SQLite, та PMTiles — новіший формат одного файлу, розроблений для хмарно-оптимізованого випадкового доступу.

Формат MBTiles: структура контейнера SQLite

MBTiles — це відкрита специфікація, підтримувана Mapbox, що пакує тайли карти — растрові або векторні — в базу даних SQLite. Схема бази даних мінімальна: дві обов'язкові таблиці та одна опціональна.

Таблиця tiles зберігає фактичні дані тайлів: zoom_level INTEGER, tile_column INTEGER, tile_row INTEGER та tile_data BLOB. Система координат тайлів використовує конвенцію TMS (Tile Map Service), де вісь Y інвертована відносно більш поширеної конвенції XYZ: tile_row = (2^zoom - 1) - y. Ця інверсія є поширеним джерелом помилок при інтеграції MBTiles з бібліотеками карт, що використовують координати XYZ.

Таблиця metadata зберігає пари ключ-значення, що описують набір тайлів: name, type, version, description, format (png, jpg або pbf для векторних тайлів), bounds, center та minzoom/maxzoom.

Складений індекс на (zoom_level, tile_column, tile_row) є критичним індексом продуктивності — без нього пошук окремих тайлів деградує до повних сканувань таблиці в міру зростання бази даних. Файл MBTiles розміром 10 ГБ, що охоплює країну на рівнях масштабування 0–16 з цим індексом, виконується адекватно на сучасних мобільних пристроях.

PMTiles: формат з довільним доступом до одного файлу

PMTiles був розроблений Protomaps як хмарно-оптимізована альтернатива MBTiles. PMTiles може обслуговувати тайли безпосередньо з об'єктного сховища (S3, GCS, Azure Blob) за допомогою HTTP-запитів діапазонів — без сервера тайлів. Один файл PMTiles містить усі тайли плюс внутрішній індекс, що дозволяє знайти будь-який тайл максимум за два HTTP-запити діапазонів незалежно від загального розміру файлу.

Внутрішня структура PMTiles складається з фіксованого заголовка 127 байт, кореневого каталогу та листових каталогів. Кожен запис каталогу відображає координату тайлу (закодовану як індекс кривої Гільберта для просторової локальності) на зміщення байтів і довжину у файлі. Кодування кривої Гільберта забезпечує зберігання просторово суміжних тайлів поряд у файлі, покращуючи продуктивність кешу попереднього зчитування.

Компроміс: PMTiles за своєю суттю незмінний. Додавання або заміна окремих тайлів вимагає перезапису файлу. Для тактичних застосунків, де пакет карт замінюється як цілісна одиниця, це не проблема. Для застосунків, яким потрібно виправляти окремі тайли, MBTiles є більш відповідним.

Генерація тайлів: tippecanoe, MapTiler, GDAL

tippecanoe є стандартним інструментом для генерації векторних тайлів з даних GeoJSON, FlatGeobuf або GeoPackage. Його алгоритм спрощення тайлів розроблений для створення корисних тайлів на кожному рівні масштабування. Для тактичних застосунків ключові параметри tippecanoe: --maximum-zoom (зазвичай 16 для піхотного використання, 12–14 для операцій на транспортних засобах), --minimum-zoom (0 для огляду площі, 6–8 для уникнення надмірно великих файлів).

MapTiler Engine обробляє генерацію растрових тайлів: ортофотографії, супутниковий растр, рельєф DTED. Ключові параметри: формат вихідних тайлів (PNG для зображень з прозорістю, JPEG для чистих растрів при якості 75–85, WebP для меншого розміру файлу).

GDAL надає аналогічні можливості генерації растрових тайлів через скрипт gdal2tiles.py. Для великих вихідних растрів час генерації є значним — 8–16 годин для повного набору тайлів країни на одній робочій станції. Паралелізація за допомогою прапора --processes N пропорційно зменшує це.

Стратегії часткового оновлення

Повна заміна пакету карт є операційно витратною. Файл MBTiles розміром 15 ГБ масштабу країни не можна повторно завантажувати кожного разу, коли невелика область оновлюється. Стратегії часткового оновлення вирішують це за допомогою дельта-пакетів — файлів MBTiles, що містять лише змінені тайли.

Генерація дельта-пакету вимагає порівняння поточної версії кожного тайлу (ідентифікованого хешем його tile_data) з попередньою версією. Операція об'єднання на пристрої використовує синтаксис SQLite INSERT OR REPLACE INTO tiles, який оновлює наявні тайли за первинним ключем і вставляє нові в одній операції.

Інтеграція в Android та iOS

На Android MapLibre GL Native є стандартним рендером карт з відкритим кодом для застосунків, що вимагають підтримки офлайн-векторних тайлів. Він приймає джерела MBTiles через кастомну реалізацію LocalTilesSource. Запит тайлів з бази даних SQLite відбувається у фоновому потоці через пул потоків, що запобігає блокуванню потоку UI.

Злиття кількох джерел тайлів — відображення тайлів накладення з окремого джерела поверх базової карти з іншого — підтримується в MapLibre шляхом складання кількох джерел у стилі карти. Тактичний застосунок може одночасно відображати базовий растровий шар із супутникового знімка MBTiles, векторний шар накладення із рельєфних особливостей MBTiles та динамічний шар анотацій із власної бази даних SQLite застосунку.

Ключовий висновок: Найбільш операційно значуще рішення щодо пакування — вибір рівнів масштабування. Пакування рівнів масштабування 0–18 для розгортання масштабу країни дає файли у 10–50 разів більші, ніж рівні 6–16. Для піхотного використання рівні 8–17 є операційним діапазоном. Для операцій на транспортних засобах — 6–15. Ніколи не пакуйте більше рівнів масштабування, ніж вимагає оперативна необхідність.