Vektorové mapy pro Locus

Z Milan Kerslager
Verze z 4. 2. 2015, 00:17, kterou vytvořil Milan.Kerslager (diskuse | příspěvky) (Hotové OSM mapy pro Locus: http://osm.paws.cz)
Přejít na: navigace, hledání

Locus je program pro Android, který umožňuje v terénu pracovat s různými mapovými podklady a používat další mapové funkce (navigace, body zájmu, zaznamenávání trasy atd.). Pro některé funkce je nutné on-line připojení (tj. Wi-Fi, v terénu pak GSM-data). Pro offline použití se hodí vektorové mapy, protože zabírají velmi málo místa. Projekt http://OpenStreetMap.org (dále OSM) volně poskytuje vektorové mapové podklady celého světa, které jsou vytvářeny z otevřených zdrojů dobrovolníky z celého světa. Pro Českou republiku obsahují OSM silnice, lesy, ale například i digitalizovaný katastr (tj. půdorysy a adresy budov) a turistické cesty.

Hotové OSM mapy pro Locus

Data z OSM lze snadno konvertovat do formátu používaného programem Locus. Hotové jsou k dispozici jsou na těchto adresách:

Nainstalujte si do Androidu Locus (placenou Pro verzi nebo free verzi z adresy https://play.google.com/store/apps/details?id=menion.android.locus&hl=cs) a alespoň jednou ho spusťte. Locus si vytvoří adresářovou strukturu. Soubor s vektorovou mapou nahrajte do adresáře Locus/mapsVector, který naleznete ve svém telefonu. Pak spusťe Locus a vyberte si nahranou vektorovou mapu.

Pokud Locus vytvoří svůj adresář na interním disku telefonu a chtěli byste ho mít na rozšiřující MicroSD kartě, stačí Locus ukončit a pak pomocí správce souborů celý adresář přesunout na kartu. Locus si svůj adresář při dalším spuštění najde a bude spokojeně pracovat dál.

Vlastní výroba OSM mapy pro Locus

Návod od 31.7.2013 obsahuje zahrnutí vrstevnic. Zatím se nevykreslují turistické cesty :-(

Aktuálně používaný kód (včetně skriptu bin/osm-create.sh pro kompletaci map) najdete v adresáři http://ftp.pslib.cz/pub/users/Milan.Kerslager/OSM-Locus/osmosis/

Osmosis

Pro konverzi OSM dat do formátu používaného programem Locus je potřeba program Osmosis (http://wiki.openstreetmap.org/wiki/Osmosis). Zde je použita verze 0.40.1, kterou lze stáhnout z adresy http://bretth.dev.openstreetmap.org/osmosis-build/. Novější verze 0.43.1 nefunguje. Osmosis rozbalte do vhodného adresáře.

Plugin map-writer

Pro zajištění výstupu do formátu používaného programem Locus je potřeba program mapsforge-map-writer ze stránky https://code.google.com/p/mapsforge/. Zde je použita verze 0.3.0 (soubor mapsforge-map-writer-0.3.0-jar-with-dependencies.jar). Stažený JAR soubor vložte do Osmosis adresáře lib/default. V Osmosis adresáři vytvořte konfigurační soubor config/osmosis-plugins.conf s řádkem:

org.mapsforge.map.writer.osmosis.MapFileWriterPluginLoader

tag-mapping.xml

Stáhněte si XML soubor tag-mapping.xml, který řídí výběr a konverzi mapových dat z adresy https://mapsforge.googlecode.com/git/mapsforge-map-writer/src/main/config/tag-mapping.xml (bude potřeba ho mírně změnit).

Do XML souboru tag-mapping.xml vložte následující řádky (v souboru je více sekcí <ways>, tuto sekci do XML souboru přidejte jako další <ways> sekci, tj. například na konec souboru před řádek se značkou </tag-mapping>):

   <!-- Elevation TAGS -->
   <ways>
      <osm-tag key="contour_ext" value="elevation_minor" zoom-appear="12" force-polygon-line="true" />
      <osm-tag key="contour_ext" value="elevation_medium" zoom-appear="12" force-polygon-line="true" />
      <osm-tag key="contour_ext" value="elevation_major" zoom-appear="12" force-polygon-line="true" />
      <osm-tag key="ele" value="100" zoom-appear="14" />
      <osm-tag key="ele" value="200" zoom-appear="14" />
      <osm-tag key="ele" value="300" zoom-appear="14" />
      <osm-tag key="ele" value="400" zoom-appear="14" />
      <osm-tag key="ele" value="500" zoom-appear="14" />
      <osm-tag key="ele" value="600" zoom-appear="14" />
      <osm-tag key="ele" value="700" zoom-appear="14" />
      <osm-tag key="ele" value="800" zoom-appear="14" />
      <osm-tag key="ele" value="900" zoom-appear="14" />
      <osm-tag key="ele" value="1000" zoom-appear="14" />
      <osm-tag key="ele" value="1100" zoom-appear="14" />
      <osm-tag key="ele" value="1200" zoom-appear="14" />
      <osm-tag key="ele" value="1300" zoom-appear="14" />
      <osm-tag key="ele" value="1400" zoom-appear="14" />
      <osm-tag key="ele" value="1500" zoom-appear="14" />
      <osm-tag key="ele" value="1600" zoom-appear="14" />
      <osm-tag key="ele" value="1700" zoom-appear="14" />
      <osm-tag key="ele" value="1800" zoom-appear="14" />
      <osm-tag key="ele" value="1900" zoom-appear="14" />
      <osm-tag key="ele" value="2000" zoom-appear="14" />
      <osm-tag key="ele" value="2100" zoom-appear="14" />
      <osm-tag key="ele" value="2200" zoom-appear="14" />
      <osm-tag key="ele" value="2300" zoom-appear="14" />
      <osm-tag key="ele" value="2400" zoom-appear="14" />
      <osm-tag key="ele" value="2500" zoom-appear="14" />
      <osm-tag key="ele" value="2600" zoom-appear="14" />
      <osm-tag key="ele" value="2700" zoom-appear="14" />
      <osm-tag key="ele" value="2800" zoom-appear="14" />
      <osm-tag key="ele" value="2900" zoom-appear="14" />
      <osm-tag key="ele" value="3000" zoom-appear="14" />
      <osm-tag key="ele" value="3100" zoom-appear="14" />
      <osm-tag key="ele" value="3200" zoom-appear="14" />
      <osm-tag key="ele" value="3300" zoom-appear="14" />
      <osm-tag key="ele" value="3400" zoom-appear="14" />
      <osm-tag key="ele" value="3500" zoom-appear="14" />
      <osm-tag key="ele" value="3600" zoom-appear="14" />
      <osm-tag key="ele" value="3700" zoom-appear="14" />
      <osm-tag key="ele" value="3800" zoom-appear="14" />
      <osm-tag key="ele" value="3900" zoom-appear="14" />
      <osm-tag key="ele" value="4000" zoom-appear="14" />
      <osm-tag key="ele" value="4100" zoom-appear="14" />
      <osm-tag key="ele" value="4200" zoom-appear="14" />
      <osm-tag key="ele" value="4300" zoom-appear="14" />
      <osm-tag key="ele" value="4400" zoom-appear="14" />
      <osm-tag key="ele" value="4500" zoom-appear="14" />
      <osm-tag key="ele" value="4600" zoom-appear="14" />
      <osm-tag key="ele" value="4700" zoom-appear="14" />
      <osm-tag key="ele" value="4800" zoom-appear="14" />
      <osm-tag key="ele" value="4900" zoom-appear="14" />
      <osm-tag key="ele" value="5000" zoom-appear="14" />
       <!-- .... etc ....  -->
   </ways>

Data z OSM

Stáhněte si export dat z OSM z adresy http://download.geofabrik.de, kde pro ČR stahujte z adresy http://download.geofabrik.de/europe/czech-republic.html:

poly2bb.pl

Výslednou mapu pro Locus je potřeba vložit do boxu, jehož definice není součástí standardního PBF exportu z OSM. Správné koordináty lze zjistit z výše staženého POLY souboru pomocí skriptu poly2bb.pl (https://trac.openstreetmap.org/browser/applications/utils/osm-extract/polygons/poly2bb.pl), ve kterém nahraďte poslední příkaz (na dvou řádcích) tímto příkazem:

printf "%f,%f,%f,%f\n", $miny, $minx, $maxy, $maxx;

Spusťte a výsledné souřadnice použijte dále při generování:

poly2bb.pl czech_republic.poly
48.540841,12.085860,51.054381,18.862533

XML pro styl mapy

Podobu výstupní mapy je možné ovlivnit XML soubory. Standardní stáhněte z adresy http://osm.gpsfreemaps.net/config/locus/modded_style/osmarendermapsforge/ a smažte nepotřebné soubory index:

mkdir style
cd style
wget -e robots=off --wait 0.25 -np -r http://osm.gpsfreemaps.net/config/locus/modded_style/osmarendermapsforge/
mv osm.gpsfreemaps.net/config/locus/modded_style/osmarendermapsforge/* .
find . -name index\* -exec rm {} \;

Do souboru style/osmarender-orgmapsforge.xml přidejte před pravidla pro „waterways“ pravidla pro vrstevnice:

        <!-- contour lines level 12 -->
        <rule e="way" k="contour_ext" v="*" zoom-min="12" zoom-max="12">   
           <rule e="way" k="contour_ext" v="elevation_minor">   
              <line stroke="#60800000" stroke-width="0.3"/>
           </rule>
           <rule e="way" k="contour_ext" v="elevation_medium|elevation_major">   
              <line stroke="#60800000" stroke-width="0.6"/>
           </rule>
        </rule>
        <!-- contour lines level 13 -->
        <rule e="way" k="contour_ext" v="*" zoom-min="13" zoom-max="13">
           <rule e="way" k="contour_ext" v="elevation_minor">   
              <line stroke="#60800000" stroke-width="0.2"/>
           </rule>
           <rule e="way" k="contour_ext" v="elevation_medium|elevation_major">   
              <line stroke="#60800000" stroke-width="0.5"/>
           </rule>
        </rule>
        <!-- contour lines level 14-->
        <rule e="way" k="contour_ext" v="*" zoom-min="14" zoom-max="14">
           <rule e="way" k="contour_ext" v="elevation_minor">   
              <line stroke="#60800000" stroke-width="0.15"/>
           </rule>
           <rule e="way" k="contour_ext" v="elevation_medium|elevation_major">   
              <line stroke="#60800000" stroke-width="0.4"/>
              <rule e="way" k="*" v="*">
                 <pathText k="ele" font-style="bold" font-size="10" fill="#000000" stroke="#ffffff" stroke-width="2.0" />
              </rule>              
           </rule>   
        </rule>
        <!-- contour lines level 15-->
        <rule e="way" k="contour_ext" v="*" zoom-min="15" zoom-max="15">
           <rule e="way" k="contour_ext" v="elevation_minor" zoom-max="15">   
              <line stroke="#60800000" stroke-width="0.12"/>
           </rule>
           <rule e="way" k="contour_ext" v="elevation_medium|elevation_major">   
              <line stroke="#60800000" stroke-width="0.3"/>
              <rule e="way" k="*" v="*">
                 <pathText k="ele" font-style="bold" font-size="10" fill="#000000" stroke="#ffffff" stroke-width="2.0" />
              </rule>
           </rule>
        </rule>
        <!-- contour lines level 16 -->
        <rule e="way" k="contour_ext" v="*" zoom-min="16" zoom-max="16">
           <rule e="way" k="contour_ext" v="elevation_minor">   
              <line stroke="#60800000" stroke-width="0.08"/>
           </rule>
           <rule e="way" k="contour_ext" v="elevation_medium|elevation_major">   
              <line stroke="#60800000" stroke-width="0.2"/>
              <rule e="way" k="*" v="*">
                 <pathText k="ele" font-style="bold" font-size="10" fill="#000000" stroke="#ffffff" stroke-width="2.0" />
              </rule>
           </rule>
        </rule>   
        <!-- contour lines level 17 and above -->
        <rule e="way" k="contour_ext" v="*" zoom-min="17">
           <rule e="way" k="contour_ext" v="elevation_minor">   
              <line stroke="#60800000" stroke-width="0.06"/>
           </rule>
           <rule e="way" k="contour_ext" v="elevation_medium|elevation_major">   
              <line stroke="#60800000" stroke-width="0.15"/>
              <rule e="way" k="*" v="*">
                 <pathText k="ele" font-style="bold" font-size="10" fill="#000000" stroke="#ffffff" stroke-width="2.0" />
              </rule>
           </rule>
        </rule>

phyghtmap

Nástroj phyghtmap slouží ke stažení dat pro vrstevnice ze serverů NASA. Nástroj naleznete na adrese http://katze.tfiu.de/projects/phyghtmap/. V distribuci Fedora je připraven jako balíček, takže stačí jako uživatel root zadat příkaz:

yum -y install python-phyghtmap.noarch

srtmfill

Pro korekci výškových dat od NASA je potřeba nástroj SRTMFill z adresy http://3dnature.com/srtmfill.html, který dopočítá data, která v HGT souborech chybí (NASA poskytuje zadarmo jen surová data z družice, za vyčištěná data od NASA se musí zaplatit). Nástroj SRTMFill je program pod Windows, který před zpracováním každého souboru chvíli čeká a nabízí licenci asi za 25 dolarů. V Linuxu lze tento program spustit pomocí Wine, takže zde není problém. Před spuštěním v Linuxu mu přidejte oprávnění pro spuštění příkazem chmod, a pak SRTMFill spusťte (v aktuálním adresáři včetně cesty):

chmod +x SRTMFill.exe
./SRTMFill.exe

Výšková data od NASA a jejich korekce

Nejprve spusťte program phyghtmap s parametrem omezujícím okraje potřebné plochy. Program phyghtmap stáhne ze serverů NASA potřebné soubory. Když začne počítat, přerušte ho pomocí CTRL+c a proveďte korekci dat programem srtmfill.exe. Poté spusťte program phyghtmap znovu a on použije korigovaná data.

phyghtmap --polygon=czech-republic.poly -o czech_srtm6 --source=view1,view3,srtm1,srtm3  -s 20 -c 200,100 --start-node-id=20000000000 --start-way-id=10000000000 --write-timestamp --max-nodes-per-tile=0
# po stažení všech souborů (a zahájení výpočtu) bylo stisknuto CTRL+c pro přerušení programu
for i in $(find . -name \*.hgt); do ./SRTMFill.exe $i; done
# nyní bude potřeba 48 krát potvrdit, že chcete program spustit zdarma (s čekacími prodlevami)
for i in $(find . hgt -name \*.hgt); do echo mv -fv $i $(echo $i | sed -e 's/_fill//'); done | sh
# výše uvedený příkaz přejmenoval nové soubory s názvem _fill na původní jména
phyghtmap --polygon=czech-republic.poly -o czech_srtm6 --source=view1,view3,srtm1,srtm3  -s 20 -c 200,100 --start-node-id=20000000000 --start-way-id=10000000000 --write-timestamp --max-nodes-per-tile=0

Výstupem je soubor, v jehož názvu jsou zaneseny krajní souřadnice, takže se mohou lišit podle aktuálního stavu staženého POLY souboru. V tomto případě to bylo: czech_srtm6_lon12.08_18.86lat48.54_51.06_view3.osm. Tento výsledný soubor má skoro 800 MB a není ho potřeba při každém generování nové mapy z aktuálních OSM dat znovu vytvářet, protože vrstevnice zůstávají (až do dalšího měření od NASA) stejné. Pomocí osmosis převedeme soubor do zkomprimovaného PBF tvaru (17 MB):

osmosis --rx czech_srtm6_lon12.08_18.86lat48.54_51.06_view3.osm --wb czech_srtm.osm.pbf

Nekomprimovaná data v souboru OSM je možné smazat, dále bude použit komprimovaný PBF tvar.

Sloučení dat

Nyní je potřeba sloučit vrstevnice a mapový podklad z OSM:

osmosis --read-pbf czech-republic-latest.osm.pbf --read-pbf czech_srtm.osm.pbf --merge --wb omitmetadata=true czech-merged.osm.pbf

Prostředí pro Javu

Nadefinujte proměnné prostředí pro Javu, která zvětší maximální hranici velikosti paměti pro haldu. Zde je použita 64bitová Java, konkrétně jre-1.7.0-openjdk.x86_64, takže lze požadovat hodnotu 6 Gigabajtů. Pokud používáte 32bitový systém, bude maximální hranice pod 4GB (resp. pod 2GB na MS Windows), což může být pro vytvoření mapy málo (pokud uvedete příliš velký požadavek, aplikace se nespustí, protože to běhové prostředí Javy odmítne). V Linuxu tedy nastavte:

export JAVACMD_OPTIONS=-Xmx6G

V prostředí MS Windows by příkaz vypadal takto:

set JAVACMD_OPTIONS=-Xmx6G

Vytvoření souboru .map

Vytvoření mapy pro Českou republiku vyžaduje přes 4,5 GB volného místa v adresáři /tmp, kam si osmosis odkládá dočasná data, aby uspořil místo v paměti (odkládání dat na disk zapíná parametr type=hd). Zkontrolujte si příkazem df -h, že tolik volného místa máte. V uvedeném příkladu výstupu je adresář /tmp typu tmpfs, což znamená sdílená paměť v RAM (tj. RAMdisk, viz https://cs.wikipedia.org/wiki/Ramdisk), kde je k dispozici celkem 7,4 GB a běžící osmosis zabralo zmíněných 4,2 GB. Pokud v /tmp tolik volného místa nemáte, je potřeba parametrem programu osmosis změnit umístění dočasných souborů nebo do adresáře /tmp připojit nějaké volné místo na disku (např. pomocí mount -o bind).

$ df -h
Souborový systém               Velikost Užito Volno Uži% Připojeno do
/dev/mapper/fedora_velkej-root      50G   13G   34G  28% /
devtmpfs                           7,4G     0  7,4G   0% /dev
tmpfs                              7,4G   11M  7,4G   1% /dev/shm
tmpfs                              7,4G  936K  7,4G   1% /run
tmpfs                              7,4G     0  7,4G   0% /sys/fs/cgroup
tmpfs                              7,4G  4,2G  3,2G  58% /tmp
/dev/sda3                          477M  162M  286M  37% /boot
/dev/mapper/fedora_velkej-home     1,6T  388G  1,1T  26% /home

Spusťte konverzi (parametrem bbox jsou čísla, která vystupují z výše zmíněného příkazu poly2bb.pl):

osmosis --read-pbf czech-merged.osm.pbf --buffer --mapfile-writer file=Czech.map bbox=48.540841,12.085860,51.054381,18.862533 type=hd tag-conf-file=tag-mapping.xml

Podle rychlosti počítače bude výsledná mapa asi za jednu až tři hodiny vygenerována do souboru Czech.map. Průběh vytváření mapy je programem Osmosis průběžně indikován (v procentech).

Externí odkazy