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.pbfProstorový 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.gpkgMapové 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.geojsonPMTiles 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 serveruST_Containsv 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_Intersectsa 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).