Chmelej's Blog

OSM Vlastní Tile Server

Published 28 Nov 20213 min read0 comments
header-image

1. Instalace tile serveru (apache + mapnik)

Podle návodů na OSM jsem celkem bez problémů stáhnul data celé ČR a v Dockeru spustil instanci pro generování vlastních tiles.

Zpracování celé ČR trvalo asi 1h, vstupní soubor má 750MB a výsledná databáze zabere 22GB, to se mi zdálo pro mé účely zbytečné moc, čili jsem zredukoval vstupní soubor, na malou oblast kolem Čelákovic:

sudo apt install osmium-tool
osmium extract -b 14.641,50.109,14.835,50.195 czech-republic-latest.osm.pbf -o celakovice-a-okoli.osm.pbf

Výsledný soubor má 3MB a import do databáze trvá 20s :-)

2. Test zobrazování v prohlížeči

Po spuštění dockeru je možné se dívat na generovanou mapu , mapa vypadá +- stejně jako na OSM jen oblast je drasticky zmenšena. Aplikace po načtení ukáže prázdnou mapu světa a až když se správně zazoomuje, tak jsou vidět detaily v okolí. proto jsem upravil index.html aby a) zamířil rovnou v detailu na město b) aby šlo zoomovat až na úroveň 22.

3. Zobrazení našich dat

Podle předpokladů data schovaná pod zemí se standardně na mapu nevykreslují!

V docker instanci jsem našel, kde je umístěný soubor mapnik.xml, což je hlavní a jediný konfigurační soubor, který je potřeba změnit. Je to poměrně masivní a chaotické XML. Pro jednoduší práci existuje CartoCSS, což je jazyk/nástroj pro nastavení vzhledu mapy. Soubory s CartoCSS se pak zkonvertují pomocí nástroje Carto do XML. Ještě jsem zkoušel magnaCarto (alternativa v Go), ale to mi padalo takže vyhrál JavaScript a Carto.

  • Sosnul jsem si celý projekt openstreetmap-carto z běžícího dockeru a trochu se v tom šťoural. Je zajímavé, že od oficiální verze na github se to liší.
docker cp <instance>: /home/renderer/src/openstreetmap-carto .
  • Nakonec jsem v project.mml našel část, která se týká námořní dopravy ‘ferry-routes’ a jelikož se u nás námořní doprava nepěstuje, tak jsem rozšířil SQL dotaz tak, aby vracel i naše chráničky.
  • Současně jsem trochu upravil data v databázi a ručně nastavil příznak pro rychlejší hledání:
update planet_osm_line set man_made = 'dataline' where tags -> 'operator' = 'czela.net'
  • Potom už stačilo je vygenerovat nový mapnik.xml
npm init
npm install carto
.node_modules/.bin/carto project.mml > my-mapnik.xml
  • Po vrácení XML souboru (resp namounvovani do dockeru) se objevili i naše chráničky (zatím jsou úzké a modré). Ale cíl cvičení je splněn! Další hraní se styly už je brnkačka.
  • Pokud změním styl, stačí restartovat docker image a začnou se generovat tiles podle nových pravidel.

4. Naše tiles a externí aplikace

  • Našel jsem docela hezkou mobilní free aplikaci OsmApp, která mimo jiné má možnost nastavit si dlaždice. Zkusil jsem tam dát naší url a nic.
      1. chyba: Server musí vracet v hlavičce Access-Control-Allow-Origin: *, k tomu se musí do kontaineru nastavit -e ALLOW_CORS=1
      1. chyba: Aplikace používá https a naše aplikace to musí podporovat taky, jinak to browser zamítne co by mixed content
  • Objevil jsem projekt fieldpapers, ktery má možnost definovat vlastní tiles a vytvoří PDF s mapou připravenou pro tisk. Takže pokud bych si chtěl mapu vytisknout, ručně dokreslit, naskenovat a zanést zpět do OSM tak to nenížádný problém.

URL Template

https://maptiles.chmelej-dev-docker.czela.net/tile/{z}/{x}/{y}.png

TODO

  • lepší styly pro chráničky a případně nastavit další zajímavé objekty co chceme vidět.
  • automatický upgrade databáze pro generování dat
  • potřeba ručního zásahu do SQL po importu dat není úplně ideální řešení
  • možnost rychle malovat/měřit čáry a následně je ukládat v KML pro další zpracování
  • varianta mapy pro černobílý tisk