WHERE
CODE

WHERE

Cała Europa w kieszeni — mapa, wyszukiwanie, trasy i nawigacja głosowa bez ani jednego bajtu z sieci.

PROJECT
CODE-059
APLIKACJA
KOTLIN · COMPOSE · MATERIAL 3
MAPA
MAPLIBRE · PMTILES
DANE
SQLITE FTS5 + R-TREE
PAKIET POLSKI
5,4 GB · OSM 2026-08-31
STATUS
W TRAKCIE
DATA
06 września 2026

Aplikacja Android, która zamienia 35 GB surowych danych OpenStreetMap w pakiet jednego kraju i od tej chwili nie potrzebuje internetu. Mapa wektorowa, szukanie bez ogonków, trasy liczone lokalnie, nawigacja z lektorem i przeliczanie trasy po zjechaniu — wszystko w trybie samolotowym.

WHERE.BUILDEROSM PBF → PAKIET KRAJU → APLIKACJA OFFLINE
PIPELINE PC + ANDROID
WEJŚCIEDECYZJANARZĘDZIEPRZETWARZANIEMAGAZYNKONTROLAWYJŚCIE01EUROPE.OSM.PBF35 GB, format źródłowy02WYBÓR REGIONUkraj albo wycinek03PLANETILERkafle wektorowe04PYOSMIUMekstrakcja POI05GRAF DRÓGprofile auto/pieszo/rower06PMTILESmapa w jednym pliku07SQLITE FTS5szukanie bez diakrytyków08R-TREEPOI w kadrze09POZIOMICECopernicus DEM10SZLAKIrelacje OSM11MANIFESTSHA-256, rozmiary, data12QA PAKIETUplany zapytań, czasy13PAKIET KRAJUAPK albo import SAF14MAPA + SZUKAJMapLibre, FTS515TRASA I GŁOSA*, TTS, rerouting
ŹRÓDŁO 35 GB NIGDY NIE TRAFIA NA TELEFON · MANIFEST Z SUMĄ SHA-256 JEST KONTRAKTEM MIĘDZY BUILDEREM A APLIKACJĄ
01

PROBLEM

Każda popularna aplikacja mapowa zakłada zasięg. W górach, na granicy, w podziemnym parkingu albo za granicą bez roamingu ta sama aplikacja pokazuje szarą planszę. Tryb offline, jeśli w ogóle istnieje, obejmuje zwykle sam podgląd mapy — bez wyszukiwania, bez wyznaczania trasy, bez nawigacji.

Drugi problem jest cichszy: mapa online to strumień zapytań o to, gdzie dokładnie jesteś i czego szukasz. Przy codziennym używaniu to kompletny dziennik przemieszczeń oddany na zewnątrz.

02

POMYSŁ

Odwrócić zależność. Zamiast telefonu odpytującego serwer — komplet danych na urządzeniu, przygotowany raz na mocnym komputerze i wgrany jako pakiet kraju. Telefon liczy wszystko sam: dopasowuje nazwy, przeszukuje graf dróg, mówi w zakręt.

Warunek brzegowy był twardy: to ma być pełna aplikacja, a nie mapa poglądowa. Jeśli działa, to w trybie samolotowym ma znaleźć restaurację po nazwie z literówką, poprowadzić do niej trasą i przeliczyć ją po skręcie w złą ulicę.

03

PROJEKT

Podział przebiega między komputerem a telefonem. Na komputerze pracuje WHERE DATA BUILDER — pipeline w Pythonie, który przyjmuje europe-latest.osm.pbf o objętości około 35 GB i tnie go na pakiety. Plik źródłowy nigdy nie trafia na urządzenie; jest formatem wejściowym, nie dystrybucyjnym.

Builder ma kilkanaście numerowanych kroków. Planetiler robi kafle wektorowe w schemacie OpenMapTiles i zapisuje je jako jeden plik PMTiles. Osobna ścieżka na pyosmium wyciąga punkty użyteczne do bazy SQLite z indeksem pełnotekstowym FTS5 i przestrzennym R-Tree. Trzecia buduje graf dróg dla trzech profili — samochód, pieszy, rower.

FTS5 jest skonfigurowany z usuwaniem znaków diakrytycznych, dlatego wpisane „zlota kaczka" odnajduje „Złotą Kaczkę". R-Tree odpowiada za to, że markery w kadrze pojawiają się natychmiast, bez przeszukiwania całego kraju.

Wynik spina manifest.json z sumami SHA-256, rozmiarami i datą danych OSM. To kontrakt między builderem a aplikacją: telefon nie ufa katalogowi plików, tylko manifestowi.

04

REALIZACJA

Aplikacja jest napisana w Kotlinie na Jetpack Compose, mapę rysuje MapLibre Native. Bazy POI czyta bezpośrednio, w trybie tylko do odczytu — bez warstwy ORM, bo zapytanie ma trafiać w indeks, a nie w abstrakcję.

Routing liczy własny silnik A* na grafie z buildera. Nawigacja ma panel manewrów, syntezę mowy, wykrywanie zejścia z trasy i przeliczanie trasy offline. Doszła funkcja „szukaj na trasie" — korytarz czterystu metrów wokół wyznaczonej drogi, z wynikami opisanymi jako „przed tobą", oraz reverse geocoding: przytrzymanie palca stawia pinezkę z adresem i pozwala poprowadzić do niej trasę.

Pakiety krajów rozwiązano nietypowo — jako osobne aplikacje APK. Po instalacji WHERE wykrywa nośnik danych i proponuje import, a paczkę można potem odinstalować. Alternatywą jest import strumieniowy przez systemowy wybór plików, ze stagingiem i atomową zamianą, żeby przerwane kopiowanie nie zostawiło uszkodzonego pakietu.

Dołożone są warstwy turystyczne: szlaki z relacji OSM i poziomice liczone z modelu terenu Copernicus DEM.

05

EFEKT

Zbudowane pakiety pokazują skalę: Polska 5,4 GB, Szwajcaria 1,7 GB, Rumunia 1,5 GB, Portugalia 1,4 GB, Słowacja 1019 MB, Słowenia 602 MB, Chorwacja 213 MB mapy plus 42 MB punktów użytecznych. Katalog build-work zawiera dziś kilkadziesiąt krajów, budowanych seryjnie skryptem.

Scenariusze potwierdzono na urządzeniu w trybie samolotowym: mapa z etykietami po polsku, wyszukiwanie kategorii z odległościami i godzinami otwarcia, parser opening_hours ze statusem otwarte/zamknięte, trasa Zagrzeb–Zadar policzona lokalnie na 463 km i 265 minut, nawigacja z lektorem i przeliczaniem.

Stoi też serwer dystrybucji ze stroną wyboru regionu i warstw, obsługujący pobieranie wznawiane.

06

GALERIA

04 ZDJĘĆ
07

WNIOSKI

Najciekawsza okazała się nie sama mapa, tylko granica między komputerem a telefonem. Wszystko, co da się policzyć raz na mocnej maszynie, zostało z niej zdjęte: indeksy, graf, kafle, poziomice. Telefonowi zostało odpytywanie gotowych struktur — dlatego wyszukiwanie w bazie całego kraju jest natychmiastowe mimo braku sieci.

Druga lekcja dotyczy emulatora i kosztowała sporo czasu: przy programowym renderowaniu grafiki etykiety mapy po prostu się nie rysują. Geometria jest, napisów nie ma i nic nie trafia do logu. Trzeba wymusić akcelerację GPU hosta, inaczej godzinami szuka się błędu w danych, których nie ma.

Otwarte fronty: pobieranie pakietów bezpośrednio z aplikacji i trasy międzymiastowe wykraczające poza jeden pakiet.