← Zpět na mapu

Open Mapa

Technická dokumentace – vrstvy, POI, barvy, ikony, architektura

Architektura

Data se jednorázově naimportují do úložišť (MBTiles, PostGIS, Valhalla tiles). Běžící služby z těchto úložišť servírují obsah do frontendu.

Import dat (jednorázové pipeline)

Vrstva mapyPipelineÚložiště
Podkladová mapaGeofabrik PBF → PlanetilerMBTiles
Overlay (trasy, POI)Geofabrik PBF → osmium filter → osm2pgsqlPostGIS
VrstevniceCopernicus DEM → gdal_contourPostGIS
RoutingCopernicus DEM + Geofabrik PBF → valhalla_build_tilesValhalla tiles

Běžící služby

Martin čte dvě úložiště (MBTiles + PostGIS); frontend konzumuje tři služby.

MBTiles ──┐ ├──► Martin ───────┐ PostGIS ──┘ │ ├──► Frontend Valhalla ────────────────────┤ │ MapProxy ────────────────────┘
SlužbaÚčel
MartinTile server – čte MBTiles (podklad) a PostGIS (overlay + vrstevnice), servíruje vektorové dlaždice a fonty
PostGISJedna databáze – overlay vrstvy (trasy, POI) i vrstevnice
ValhallaRouting engine – plánování tras (pěší, kolo, auto), výškový profil
MapProxyCache leteckých snímků ČÚZK – servíruje ortofoto jako WMS
Frontendnginx + MapLibre GL JS – konzumuje Martin, Valhalla i MapProxy

Frontend – ES moduly

Frontend používá nativní ES moduly (type="module") bez bundleru. Jeden entry point app.js, MapLibre GL JS z CDN jako klasický <script>.

config.js ← standalone (konstanty: URL, barvy, POI_DEFS, ZOOM) state.js ← config.js (sdílený stav: map, activePoi, activeGroups) icons.js ← config.js (SVG ikony → MapLibre sprite) track.js ← standalone (geolokace, haversineMeters) layers.js ← config.js, state.js (skupiny vrstev, viditelnost, profily) hash.js ← config.js, state.js, layers.js (URL hash parsing) ui.js ← config.js, state.js, layers.js, icons.js (legenda, popup) routing.js ← config.js, track.js, dom.js (Valhalla routing UI) layers-setup.js ← config.js, state.js, layers.js, hash.js, icons.js, track.js poi-handlers.js ← poi-wiki.js, poi-transit.js (skládá interakce POI) poi-wiki.js ← config.js, wiki.js (hover preview, long-press, klik) poi-transit.js ← config.js, dom.js (zastávky → linky → zvýraznění trasy) dom.js ← standalone (el(), clear() – tvorba DOM) app.js ← všechno (entry point – inicializace mapy)

Wiki hover preview

Při najetí na POI s Wikidata/Wikipedia odkazem se zobrazí náhled článku.

FázePopis
Debounce300 ms zpoždění před fetch požadavkem – zabraňuje zbytečným dotazům při pohybu myši
Wikidata APIwbgetentities (sitelinks + labels + claims/P18) → sitelink, label, obrázek
Wikipedia API/api/rest_v1/page/summary/ → shrnutí článku + thumbnail
FallbackPokud Wikipedia článek neexistuje → Wikidata label + P18 obrázek
CacheIn-memory JS Map: wikidataCache (ID → data), summaryCache (lang:title → data)
Race conditionGenerační čítač (hoverGen) zabraňuje zobrazení zastaralého popupu
Kliknutí na POI s wiki odkazem otevře příslušný Wikipedia článek v nové záložce. Jazyky: cs → sk → en (priorita).

POI – Body zájmu

Generováno z POI_DEFS (config.js) + obarveno přes icons.js

Barevná paleta

Turistické trasy (KČT)

TrasaBarvaKód

Vrstevnice

TypBarvaKódInterval

Ikony

ParametrHodnota
Velikost výstupního obrázku32 × 32 px
Velikost symbolu (s pozadím)16 px (uvnitř kruhu)
Velikost symbolu (bez pozadí)20 px
Poloměr kruhu pozadí14 px
MapLibre icon-size0.8 (globální)
Zdroj ikonopenstreetmap-carto (CC0) – frontend/symbols/

Podkladová mapa (hiking-base.json)

Styl podkladové mapy + vrstevnice + lanovky. Servírováno přes Martin (MBTiles + PostGIS).

Datové zdroje

DataZdrojLicence
Podkladová mapa + overlay (trasy, POI)OpenStreetMap (Geofabrik PBF)ODbL 1.0
VrstevniceCopernicus DEM GLO-30 (AWS S3)Copernicus DEM licence
Ortofoto (letecké snímky)ČÚZK – Ortofoto ČR (WMS)CC BY 4.0
Polygony oceánůosmdata.openstreetmap.deODbL 1.0
Středové osy jezerosm-lakelinesODbL 1.0
Hranice, pobřeží (nízké zoomu)Natural EarthPublic Domain
Ikonyopenstreetmap-cartoCC0
FontOpen SansApache 2.0

Použité technologie

NástrojÚčelLicence
MapLibre GL JSKlientský renderer mapy (WebGL)BSD-3-Clause
MartinVektorové dlaždice – podkladová mapa (MBTiles) + overlay (PostGIS) + fontyApache 2.0
PlanetilerGenerování MBTiles z OSM datApache 2.0
osm2pgsqlImport OSM dat do PostGIS (trasy, POI)GPL-2.0
osmium-toolFiltrování a slučování PBF souborůGPL-3.0
GDALZpracování Copernicus DEM (vrstevnice + elevation HGT pro Valhalla)MIT
ValhallaRouting engine – plánování tras (pěší, kolo, auto), výškový profil trasMIT
MapProxyCache leteckých snímků z ČÚZK WMS (ortofoto podklad)Apache 2.0
PostGIS / PostgreSQLProstorová databáze overlay vrstevGPL-2.0 / PostgreSQL
nginxWebový server a reverzní proxyBSD-2-Clause

Zoom tier systém

TierZoomMěřítkoCo se zobrazí
Z00VždyTerén, voda, hranice, parky, NP/CHKO, města, dálnice
Z17KrajHlavní silnice, železnice, transit linky, obce, vodní toky
Z210OkresDůležité POI (vrcholy, hrady, stanice, rozhledny), transit, landuse
Z312ObecTuristické a cyklistické trasy, většina POI, budovy, cesty, vrstevnice, popisky silnic
Z414DetailDrobné POI (lavičky, bariéry, stromy), popisky cest

Použití podkladové mapy v jiném projektu

Martin tile server poskytuje vektorové dlaždice, fonty i overlay vrstvy přes HTTP. Lze je použít v libovolném MapLibre / Mapbox GL projektu.

Endpointy

Base URL: __TILER__ (Martin tile server)

EndpointPopisFormát
__TILER__/openmaptiles/{z}/{x}/{y}Podkladová mapa (OpenMapTiles schéma)PBF (vector tiles)
__TILER__/contours/{z}/{x}/{y}Vrstevnice (10 m vedlejší, 50 m hlavní)PBF (vector tiles)
__TILER__/font/{fontstack}/{range}.pbfPBF fonty (Open Sans Regular/Bold/Italic)PBF (SDF glyphs)
__TILER__/{tabulka}/{z}/{x}/{y}Overlay vrstvy (routes, peaks, tourism, ...)PBF (vector tiles)

Minimální MapLibre příklad

const TILER = '__TILER__'; const map = new maplibregl.Map({ container: 'map', style: { version: 8, sources: { openmaptiles: { type: 'vector', tiles: [`${TILER}/openmaptiles/{z}/{x}/{y}`], maxzoom: 14, // Planetiler generuje do z14, MapLibre overzoomuje }, }, glyphs: `${TILER}/font/{fontstack}/{range}.pbf`, layers: [] // vlastní styl, nebo načíst hiking-base.json }, center: [15.5, 49.8], zoom: 7, });

Použití kompletního stylu (hiking-base.json)

const TILER = '__TILER__'; const resp = await fetch('__FRONTEND__/hiking-base.json'); const style = await resp.json(); // Přepsat zdroje a fonty na tiler URL style.sources = { openmaptiles: { type: 'vector', tiles: [`${TILER}/openmaptiles/{z}/{x}/{y}`], maxzoom: 14, }, contours: { type: 'vector', tiles: [`${TILER}/contours/{z}/{x}/{y}`], minzoom: 12, maxzoom: 14, }, }; style.glyphs = `${TILER}/font/{fontstack}/{range}.pbf`; const map = new maplibregl.Map({ container: 'map', style: style, center: [15.5, 49.8], zoom: 7, });

Dostupné overlay tabulky (PostGIS → Martin)

TabulkaObsahZoom rozsah
routesTuristické a cyklistické trasy (s line-offset pro souběžné)12–14
peaksVrcholy a sedla10–14
railway_stopsVlakové stanice a zastávky10–14
tourismTuristické POI (rozhledny, kempy, muzea, ...)10–14
historicHistorické objekty (hrady, zříceniny, památníky, ...)10–14
amenitiesObčanská vybavenost (restaurace, WC, lavičky, ...)12–14
leisure_pointsVolnočasové POI (koupaliště, hřiště, ...)12–14
natural_featuresPřírodní prvky (prameny, jeskyně, vodopády, ...)12–14
barriersBariéry (brány, závory)14
parking_areasParkovací plochy (polygony)12–14
poi_centroidsCentroidy z POI polygonů10–14
transit_linesLinie hromadné dopravy (bus, tram, metro, přívoz)10–14
aerialwaysLanovky a vleky (stanice)10–14
shopsObchody (supermarket, kolo, lékárna)12–14
contoursVrstevnice (PostGIS, 10/50 m interval)12–14

Ortofoto (ČÚZK) – alternativní rastrový podklad

Letecké snímky ČR jako cachovaná WMS služba (MapProxy, zdroj ČÚZK Ortofoto ČR). MapProxy konzumuje veřejnou WMS službu ČÚZK a cachuje dlaždice na disk.

EndpointPopisFormát
__ORTOFOTO__/mapproxy/serviceWMS GetMap / GetCapabilities (vrstva ortofoto)WMS 1.1.1 / 1.3.0

MapLibre raster source (ortofoto)

const map = new maplibregl.Map({ container: 'map', style: { version: 8, sources: { ortofoto: { type: 'raster', // MapLibre dosadí za {bbox-epsg-3857} hranice dlaždice tiles: ['__ORTOFOTO__/mapproxy/service' + '?service=WMS&version=1.1.1&request=GetMap&layers=ortofoto' + '&styles=&format=image/jpeg&srs=EPSG:3857' + '&width=256&height=256&bbox={bbox-epsg-3857}'], tileSize: 256, }, }, layers: [{ id: 'ortofoto', type: 'raster', source: 'ortofoto' }], }, center: [15.5, 49.8], zoom: 7, });

Přehled zoom rozsahů

Svislé pruhy znázorňují zoom úrovně, na kterých je vrstva viditelná. Zvýrazněné sloupce = zoom tiery.

Open Mapa · Technická dokumentace