Formát MAP pro zabalení velkého počtu mapových souborů v Map2X
Podrobný popis formátu MAP pro uložení mapových dlaždic pro navigaci Map2X, jeho vlastnosti a limity. Varování: pro někoho možná nestravitelné.
Důvod vytvoření formátu
S většími oblastmi mapy, větším rozsahem zoomu, různými typy mapového podkladu a překrytí nastává problém s velkým množstvím souborů. Projeví se to hlavně při kopírování několika desítek tisíc malých souborů na SD kartu. Nejenže to trvá hrozně dlouho (kopírování 10 000 souborů může trvat i hodinu), ale dlaždice zabírají až o 30% více místa (zaplňování necelých bloků paměti - dlaždice velká 8,1 kB ve skutečnosti zabírá 12 kB místa, rozdělená do 3 bloků velkých 4 kB).
Další problém je se zpomalením celého systému souborů - hledání souboru mezi několika desítkami tisíc souborů bude časově mnohem náročnější než hledání mezi stovkou souborů. Při načítání adresáře obsahující onen velký počet mapových dlaždic může dojít k vytuhnutí programu, ale i celého systému na pár minut. S počtem souborů souvisí i omezení souborového systému FAT32, kde může být maximálně 65534 souborů v adresáři (zdroj), takže byste s mapou Evropy s velikostí 600 MB a počtem něco přes 100 000 souborů měli smůlu. Na systému NTFS je maximální počet souborů 232-1 (4 294 967 295), u EXT3 je počet skoro neomezený.
Kvůli vyřešení problémů s velkým množstvím souborů jsem tedy stvořil souborový formát pro zabalení dlaždic. Všechny dlaždice v aktuálním zoomu jsou zabaleny do jednoho velkého souboru, přičemž se zrychlí i jejich načítání v aplikaci Map2X (posun na známou pozici v souboru trvá znatelně kratší dobu než nalezení souboru mezi desítkou tisíc jiných).
Vlastnosti formátu
Protože nechci s formátem dopadnout jako u M$ Word, kde jsou problémy při otevírání dokumentu i na různých instalacích stejné verze programu, dal jsem si s návrhem záležet a vychytal co se dalo:
- Formát ošetřuje problém chybějících dlaždic, takže pokud vám při balení pár dlaždic chybí, aplikace se s tím vypořádá.
- Ošteřil jsem i problém s velkými soubory a omezením maximální velikosti souboru na systému FAT32 - pokud velikost přesáhne 2 GB, bude mapa rozdělena do více souborů.
- U binárního formátu nastává problém s endianitou, pokud by chtěl někdy někdo aplikaci provozovat na Big-endian systému, nemusí mít obavy, formát je na endianu nezávislý.
Snad tedy formát obsahuje vše co potřebuje a nebudu v něm muset dělat změny, pokud by ovšem někdy v budoucnu (bohužel) nastala nějaká změna formátu (a vy byste museli všechny své mapy přebalit, abyste je otevřeli v nové aplikaci), je v souboru uvedeno číslo verze, aby aplikace věděla, jestli formát umí otevřít, nebo ne. To je zároveň i kontrola toho, jestli aplikaci někdo nepodstrčil nějaký neplatný soubor místo zabalených map.
Všude ale nějaké limity jsou, takže se nevyhnuly ani mému formátu. Velikost mapy není omezena, může růst do stovek GB, ale maximální počet dlaždic je 232-1, což je stejné jako maximální počet souborů u souborového systému NTFS. Pro srovnání, celý svět z Googlu při největším rozlišení má počet dlaždic 4 * 232, takže čtyřikrát více, než je limit. Na jejich uložení by vám ale nestačil ani terabajtový disk, takže toto omezení vás opravdu nemusí mrzet.
S formátem také souviselo jeho testování - postahoval jsem si něco málo přes 2 GB satelitních map, celkem 262144 souborů. Souborový manažer při načítání adresáře odmítl reagovat na zhruba pět minut, ale pak obsah poslušně načetl. Utilita map2x-dl si s balením hrála něco přes pět hodin, ale nakonec se jí to úspěšně povedlo.
Struktura formátu MAP
Pro ty, kteří by se chtěli ve formátu šťourat či vytvořit různé extraktory, prohlížeče a přebalovače, uvádím zde úplný popis struktury formátu (proč také ne, nemám co skrývat).
Dlaždice jsou baleny do souborů s příponou *.map, každý zoom je zabalený ve vlastním souboru. První soubor v zoomu má název např. 16.map, další soubory (pokud velikost prvního dosáhne 2 GB) jsou pojmenovány 16-1.map, 16-2.map atd. V souboru jsou uvedeny jen nejnutnější informace pro jeho zpracování (počet dlaždic a jejich pozice v souboru), vše ostatní (počáteční a koncové souřadnice mapy, typ...) je uvedeno v souboru map.conf. Tím jsem docílil stejného způsobu zpracování MAP souboru pro mapy ze Seznamu, Googlu a případně dalších mapových serverů.
| Bajt | Hodnota | Popis |
|---|---|---|
| 0 - 2 | 0x4d 0x41 0x50 | Znaky MAP - signatura pro ověření typu souboru | 3 | 0x02 | Číslo verze - 2 (1) |
| 4 - 7 | celočíselná hodnota | Celkový počet dlaždic v aktuálním zoomu |
| 8 - 11 | celočíselná hodnota | Počet dlaždic v předchozích souborech |
| 12 - 15 | celočíselná hodnota | Počet dlaždic i s tímto souborem (2) |
| 16 - (15+4n) | celočíselné hodnoty | Pozice jednotlivých dlaždic v souboru (3) |
| (16+4n) - (19+4n) | celočíselná hodnota | Pozice jednoho znaku za koncem souboru (4) |
| (20+4n) - konec | binární data | Obrazová data jednotlivých dlaždic |
(1) - Aktuální verze je druhá, v první verzi chyběla signatura a číslo verze, nebyla podpora souborů nad 2 GB a formát nebyl endianově nezávislý.
(2) - Odečením předchozí hodnoty od této vyjde počet dlaždic uložených v tomto souboru.
(3) - Odečtením ukazatele na dlaždici od ukazatele na následující dlaždici vyjde její velikost.
(4) - Odpovídá velikosti souboru, slouží pro zjištění velikosti poslední dlaždice (viz (3)).
Ukázkový soubor
Pro lepší pochopení ukázka jednoduchého map souboru. Soubor je zobrazen v hexadecimálním formátu, šedivá čísla kolem označují pozice znaků v souboru.
Soubor 8-1.map, velikost 183 bytů 0 1 2 3 4 5 6 7 8 9 a b c d e f +----------------------------------------------- 00000000|4d 41 50 02 00 00 00 10 00 00 00 05 00 00 00 0a 00000010|00 00 00 28 00 00 00 56 00 00 00 7e 00 00 00 7e 00000020|00 00 00 a7 00 00 00 b7 11 11 11 11 11 11 11 11 00000030|11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 00000040|11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 00000050|11 11 11 11 11 11 22 22 22 22 22 22 22 22 22 22 00000060|22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 00000070|22 22 22 22 22 22 22 22 22 22 22 22 22 22 44 44 00000080|44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 00000090|44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 000000a0|44 44 44 44 44 44 44 55 55 55 55 55 55 55 55 55 000000b0|55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 000000b0|55 55 55 55 55 55 55
Čísla jsou ve formátu uložena jako Big-endian, aplikace si je převádí podle potřeby na Little-endian.
V souboru je hned na začátku vidět signatura 0x4d4150 a číslo verze 0x02. Z následujícícho 32bitového čísla 0x00000010 lze zjistit celkový počet dlaždic v zoomu 8: 10HEX = 16DEC. V zoomu 8 je tedy 16 dlaždic, v tomto souboru 8-1.map je tedy uložena šestá až desátá dlaždice, což lze zjistit z následujících dvou 32bitových hodnot 0x00000005 (pět dlaždic v předchozích souborech), 0x0000000a (deset dlaždic včetně tohoto souboru).
Následující čísla již ukazují na jednotlivé dlaždice, na pozici 0x00000028 již začíná první dlaždice v tomto souboru, která je pro účely tohoto příkladu reprezentována samými jedničkami. Ze dvou sousedních hodnot se dá získat velikost dlaždice, což je důvod, proč je zde číslo 0x000000b7 ukazující za konec souboru, protože by jinak aplikace neměla z čeho získat velikost poslední dlaždice. Samozřejmě by šlo ověřit, zda se jedná o poslední dlaždici a následně její velikost počítat z velikosti souboru, ale to je zbytečná komplikace, kterou 4 byty navíc v souboru jednoduše vyřeší.
Ve výpisu souboru je vidět, že zde chybí třetí dlaždice. Jak jsem zmínil výše, formát je proti chybějícím dlaždicím (které nebyly při balení dostupné) odolný. Třetí ukazatel 0x0000007e, ukazuje na místo, kde by měla být třetí dlaždice, ale zde je již čtvrtá. S pomocí dalšího ukazatele (na čtvrtou dlaždici) 0x0000007e (který ukazuje na stejné místo) aplikace zjistí, že třetí dlaždice má nulovou velikost a místo ní zobrazí prázdný obrázek.
» Přidat komentářDiskuze: 0 komentářů
Tento článek ještě nikdo nekomentoval. Buďte první!

