
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.
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.
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ę.
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.
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.
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.
GALERIA
04 ZDJĘĆ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.


