Xmap.cz
Jak na to

Práce s mapami na webu

Stažená vrstva bývá v S-JTSK, rozdělená po listech a v cizím formátu. Tady je cesta od surových dat k funkční mapě: formáty, reprojekce, PostGIS, dlaždice a knihovny. Vychází to z reálné praxe (import SHP do databáze, dotazy v polygonech, výpočty vzdáleností).

Formáty a kdy který použít

Geodata žijí v desítkách formátů. Pár, které v praxi potřebujete nejčastěji:

  • SHP (Shapefile) – starý de-facto standard pro výměnu. Ne jeden soubor (jde s ním DBF, SHX, PRJ), limit 2 GB, názvy atributů max. 10 znaků. Většina českých dat chodí takto.
  • GeoJSON – standard webu a API (RFC 7946), vždy ve WGS84. Čitelný, ale objemný. Ideální na menší vrstvy přímo do mapy.
  • TopoJSON – kóduje sdílené hrany, takže je menší než GeoJSON. Skvělý na hranice a choropleth mapy.
  • GeoPackage (.gpkg) – moderní náhrada SHP, jeden SQLite soubor s více vrstvami. ČÚZK ho používá pro ZABAGED.
  • GeoTIFF / COG – rastr (DEM, snímky). Cloud Optimized GeoTIFF umí čtení po částech přes HTTP range, bez stažení celku.
  • MVT / PMTiles – vektorové dlaždice pro web. PMTiles je jeden soubor na object storage, klient čte jen potřebné byty (viz sekce o dlaždicích).

Souřadnicové systémy a reprojekce

Nejčastější zdroj chyb u českých dat. Tři systémy, které musíte znát:

  • EPSG:4326 (WGS84) – zeměpisné stupně (lat/lon), formát GeoJSON a GPS. Nehodí se na měření v metrech.
  • EPSG:3857 (Web Mercator) – metry, standard webových dlaždic (Leaflet, MapLibre, Google, OSM).
  • EPSG:5514 (S-JTSK / Křovák) – národní český systém, který používá ČÚZK a katastr. Pozor: souřadnice jsou záporné. Používejte moderní variantu 5514 (East-North).

Data z ČÚZK a většiny úřadů jsou v S-JTSK, pro web je vždy reprojektujte do 4326 nebo 3857. Definice kódů najdete na epsg.io. Pro webové zobrazení je standardní PROJ transformace 5514 na 4326 dostatečná (metrové odchylky).

PostGIS: import a prostorové dotazy

PostGIS je rozšíření Postgresu pro geodata. Tohle je jádro práce s mapami na serveru: naimportovat vrstvy, dát na ně index a dotazovat polygony a vzdálenosti.

-- zapnutí rozšíření
CREATE EXTENSION postgis;

Import dat (s reprojekcí)

# Shapefile v S-JTSK -> PostGIS, rovnou do WGS84 a s indexem (-I)
shp2pgsql -I -s 5514:4326 hranice.shp public.hranice | psql "$DATABASE_URL"

# Univerzálně přes ogr2ogr (GeoJSON/GPKG/SHP -> PostGIS)
ogr2ogr -f PostgreSQL PG:"$DATABASE_URL" data.gpkg \
  -nln obce -t_srs EPSG:4326 -lco GEOMETRY_NAME=geom -nlt PROMOTE_TO_MULTI

# OpenStreetMap extrakt -> PostGIS
osm2pgsql -d gis --create --slim -G czech-republic.osm.pbf

Prostorový index (nutný pro výkon)

CREATE INDEX idx_obce_geom ON obce USING GIST (geom);

Typické dotazy

-- Je bod v polygonu (parcela v chráněném/záplavovém území)
SELECT ch.nazev FROM chranena_uzemi ch
WHERE ST_Contains(ch.geom, ST_SetSRID(ST_MakePoint(14.42, 50.08), 4326));

-- Body uvnitř oblasti (inzeráty v obci)
SELECT * FROM inzeraty i JOIN obce o ON ST_Within(i.geom, o.geom)
WHERE o.nazev = 'Beroun';

-- Vše do 5 km od bodu (ST_DWithin je indexovatelné, rychlé)
SELECT * FROM pobocky
WHERE ST_DWithin(geom::geography, ST_MakePoint(14.42, 50.08)::geography, 5000);

-- Vzdálenost v metrech (cast na geography = počítá na elipsoidu)
SELECT nazev, ST_Distance(geom::geography, ST_MakePoint(14.42, 50.08)::geography) AS m
FROM pobocky ORDER BY m LIMIT 10;

Klíč k výkonu: vždy mějte GiST index na geometrii a pro metrické výpočty castujte na geography (WGS84) místo geometry ve stupních. Preferujte ST_DWithin před ST_Distance v podmínce WHERE, jen ten první umí využít index.

GDAL/OGR: převody formátů a projekcí

GDAL je švýcarský nůž na konverze. Pár příkazů, které pokryjí 90 % potřeb:

# Konverze formátu (SHP -> GeoJSON)
ogr2ogr -f GeoJSON out.geojson in.shp

# Reprojekce vektoru (S-JTSK -> WGS84)
ogr2ogr -f GeoJSON out.geojson in.shp -s_srs EPSG:5514 -t_srs EPSG:4326

# Zjednodušení geometrie pro web (menší soubor)
ogr2ogr -f GeoJSON out.geojson in.shp -simplify 20

# Ořez na bbox ČR
ogr2ogr -f GeoJSON cz.geojson in.geojson -clipsrc 12.0 48.5 18.9 51.1

# Reprojekce rasteru / DEM
gdalwarp -s_srs EPSG:5514 -t_srs EPSG:3857 dmr.tif dmr_3857.tif

# GeoTIFF -> Cloud Optimized GeoTIFF
gdal_translate in.tif out_cog.tif -of COG -co COMPRESS=DEFLATE

# Stínovaný reliéf (hillshade) z DEM
gdaldem hillshade dem.tif hillshade.tif -z 1.5

# Info o souboru (CRS, rozsah, vrstvy)
ogrinfo -so -al data.gpkg

Mapové služby (WMS, WFS, WMTS)

Standardy OGC, kterými úřady publikují data online, takže je nemusíte stahovat:

  • WMS – server vrátí hotový obrázek mapy (PNG/JPEG). Podklady z ČÚZK, AOPK. Rychlé na zobrazení, nedotazovatelné.
  • WMTS – dlaždicová varianta WMS s pevnou pyramidou, cacheovatelná. Nejrychlejší na podkladové mapy (třeba ortofoto).
  • WFS – server vrátí vektorová data (GML/GeoJSON), která si stáhnete a dotazujete. Pro hranice, parcely, zóny.
  • OGC API Features – moderní REST/JSON nástupce WFS, vrací rovnou GeoJSON. Postupně nahrazuje WFS na geoportálech.

Tip: u WMS/WFS začněte dotazem GetCapabilities, vrátí seznam všech dostupných vrstev pro přímé napojení.

Frontend knihovny

  • Leaflet – lehká (~40 kB), rastrové dlaždice a jednoduché vektory. Nejsnazší start, horší na velké vektorové vrstvy.
  • MapLibre GL JS – open-source fork Mapbox GL, WebGL, vektorové dlaždice a styl JSON, plynulý zoom. Nativní podpora PMTiles. Doporučená volba pro moderní mapy.
  • OpenLayers – nejrobustnější na OGC služby a reprojekce na klientu. Pro GIS-heavy aplikace.
  • deck.gl – WebGL vizualizace (heatmapy, hexbiny, miliony bodů, 3D) nad MapLibre podkladem.
  • Turf.js – geoprostorové výpočty přímo v prohlížeči (point-in-polygon, buffer, vzdálenosti) bez serveru.

Vektorové dlaždice a serverless hosting

Když máte hodně vektorových dat, nenacpete je do mapy jako jeden GeoJSON. Vygenerujte dlaždice nástrojem tippecanoe, který data chytře ředí podle zoomu:

# GeoJSON -> PMTiles (jeden soubor)
tippecanoe -o obce.pmtiles -zg --drop-densest-as-needed \
  --extend-zooms-if-still-dropping obce.geojson

PMTiles workflow je nejlevnější cesta k mapě bez běžícího tile serveru:

  • vygenerujte jeden soubor .pmtiles,
  • nahrajte ho na statické object storage (Cloudflare R2, S3, i obyčejný web s podporou HTTP Range),
  • v MapLibre zaregistrujte pmtiles:// protokol a klient čte jen potřebné byty přes Range hlavičky.
import { Protocol } from 'pmtiles';
const protocol = new Protocol();
maplibregl.addProtocol('pmtiles', protocol.tile);
// zdroj: { type: 'vector', url: 'pmtiles://https://<r2>/cz.pmtiles' }

Žádný backend, žádný běžící proces. Alternativy: martin (Rust tile server nad PostGIS), tileserver-gl, MapTiler Cloud.

Typické use-casy

  • Je bod v oblasti – na klientu turf.booleanPointInPolygon (pár polygonů), na serveru ST_Contains v PostGIS (masově, s indexem).
  • Filtr podle záplavové/chráněné zóny – zóny (DIBAVOD, AOPK) do PostGIS, při ukládání záznamu spočítat příznak ST_Intersects a uložit boolean. Filtrování v katalogu pak běží bez opakovaného geo-dotazu.
  • Vzdálenostní filtr – „do 5 km" přes ST_DWithin(geom::geography, bod, 5000) s GiST indexem.
  • Heatmapy – deck.gl HeatmapLayer/HexagonLayer, nebo agregace v PostGIS (grid, H3) a předrenderované dlaždice.
  • Izochrony (dojezdové oblasti) – vlastní OSRM nebo Valhalla nad OSM vrátí polygon dojezdu, se kterým pak pracujete jako s každou jinou oblastí.
  • Geokódování adres – našeptávač přes Photon nebo Mapy.com, dávkové přes vlastní Nominatim (veřejný má tvrdé limity).
Konkrétní zdroje dat (odkud brát vrstvy zmíněné výše) najdete v katalogu. U každého je formát, licence i souřadnicový systém.