Mapy offline nie są opcjonalne w aplikacjach taktycznych. Operatorzy w środowiskach spornych lub odległych nie mogą polegać na serwerach kafelków. Pakiet mapy musi znajdować się na urządzeniu, być odpytywalny bez dostępu do internetu i wystarczająco mały, aby zmieścić się w dostępnej pamięci. Dwa formaty pakowania kafelków dominują w zastosowaniach taktycznych: MBTiles — ugruntowany standard oparty na SQLite, i PMTiles — nowszy format pojedynczego pliku zaprojektowany do zoptymalizowanego w chmurze dostępu losowego.
Format MBTiles: struktura kontenera SQLite
MBTiles to otwarta specyfikacja utrzymywana przez Mapbox, która pakuje kafelki mapy — rastrowe lub wektorowe — w bazie danych SQLite. Schemat bazy danych jest minimalny: dwie wymagane tabele i jedna opcjonalna.
Tabela tiles przechowuje rzeczywiste dane kafelków: zoom_level INTEGER, tile_column INTEGER, tile_row INTEGER i tile_data BLOB. System współrzędnych kafelków używa konwencji TMS, gdzie oś Y jest odwrócona względem bardziej powszechnej konwencji XYZ: tile_row = (2^zoom - 1) - y. To odwrócenie jest częstym źródłem błędów podczas integracji MBTiles z bibliotekami map używającymi współrzędnych XYZ.
Złożony indeks na (zoom_level, tile_column, tile_row) to kluczowy indeks wydajności — bez niego wyszukiwanie pojedynczych kafelków degeneruje się do pełnych skanów tabeli w miarę wzrostu bazy danych.
PMTiles: format pojedynczego pliku z dostępem losowym
PMTiles został opracowany przez Protomaps jako zoptymalizowana w chmurze alternatywa dla MBTiles. Pojedynczy plik PMTiles zawiera wszystkie kafelki plus wewnętrzny indeks, który pozwala zlokalizować dowolny kafelek przy użyciu co najwyżej dwóch żądań zakresu HTTP, niezależnie od całkowitego rozmiaru pliku.
Wewnętrzna struktura PMTiles składa się z nagłówka o stałej długości 127 bajtów, katalogu głównego i katalogów liściowych. Każdy wpis katalogu odwzorowuje współrzędną kafelka (zakodowaną jako indeks krzywej Hilberta dla lokalności przestrzennej) na przesunięcie bajtów i długość w pliku.
Kompromis: PMTiles jest z projektu niemutowalny. Dodawanie lub zastępowanie pojedynczych kafelków wymaga przepisania pliku. Dla aplikacji taktycznych, gdzie pakiet mapy jest zastępowany jako całość — co jest właściwym przypadkiem użycia — nie jest to problemem.
Generowanie kafelków: tippecanoe, MapTiler, GDAL
tippecanoe to standardowe narzędzie do generowania kafelków wektorowych z danych GeoJSON, FlatGeobuf lub GeoPackage. Dla zastosowań taktycznych kluczowe parametry tippecanoe to: --maximum-zoom (zazwyczaj 16 dla użytku piechoty, 12–14 dla operacji pojazdowych) i --minimum-zoom (0 dla przeglądu obszaru, 6–8 aby uniknąć niepotrzebnie dużych plików).
MapTiler Engine obsługuje generowanie kafelków rastrowych: ortofotografia, raster satelitarny, rzeźba terenu DTED. Kluczowe parametry to format wyjściowych kafelków (PNG dla obrazów z przezroczystością, JPEG dla czystego rastra przy jakości 75–85, WebP dla mniejszego rozmiaru pliku).
GDAL zapewnia podobne możliwości generowania kafelków rastrowych za pośrednictwem skryptu gdal2tiles.py. Dla dużych rastrów źródłowych czas generowania jest znaczący — 8–16 godzin dla pełnego zestawu kafelków kraju na jednej stacji roboczej.
Strategie częściowej aktualizacji
Pełna wymiana pakietu mapy jest kosztowna operacyjnie. Strategie częściowej aktualizacji rozwiązują to problemem za pomocą pakietów delta — plików MBTiles zawierających tylko zmodyfikowane kafelki. Operacja scalania na urządzeniu używa składni SQLite INSERT OR REPLACE INTO tiles.
Integracja w Androidzie i iOS
Na Androidzie MapLibre GL Native to standardowy renderer map z otwartym kodem dla aplikacji wymagających obsługi kafelków wektorowych offline. Obsługuje źródła MBTiles za pośrednictwem niestandardowej implementacji LocalTilesSource. Aplikacja taktyczna może jednocześnie wyświetlać podstawową warstwę rastrową ze zdjęć satelitarnych MBTiles, wektorową warstwę nakładki z cech terenowych MBTiles i dynamiczną warstwę adnotacji z własnej bazy danych SQLite aplikacji.
Kluczowy wniosek: Najważniejszą decyzją dotyczącą pakowania jest wybór poziomów powiększenia. Pakowanie poziomów 0–18 dla wdrożenia w skali kraju daje pliki 10–50 razy większe niż poziomy 6–16. Dla użytku piechoty poziomy 8–17 to zakres operacyjny. Nigdy nie pakuj więcej poziomów powiększenia, niż wymaga potrzeba operacyjna.