Mapové servery hýbou světem. Snad každý z vás již zabrousil na některý ze serverů zobrazujících mapy, ať již na některém z českých porálů (Atlas.cz, Centrum.cz nebo například Seznam.cz), a nebo na specializované weby, jako jsou mapové servery Ústavu pro hospodářskou úpravu lesů, komerční data firem Geodis nebo společnosti T-Mapy a v neposlední řadě v poslední době se objevivší servery Google maps, kde lze najít některé mapové listy ve slušném rozlišení i na území ČR, a nebo Virtual Earth společnosti Microsoft. V tomto seriálu bych vás rád seznámil se základy tvorby mapových serverů krok za krokem. Průvodce by měl umožnit potenciálním uživatelům snazší nástup do této problematiky.
Úvod k mapovým serverům
Velmi krátce: mapové servery jsou programy pracující na architektuře klient-server, zpracovávající data s geografickým vztahem. Mohli bychom také říci, že jsou to v podstatě geografické informační systémy, které jsou ovšem ovládány pouze pomocí parametrů – textově – a neinteraktivně. Spolupracují s některým z webových serverů, který jim předá potřebné parametry z webového formuláře. Ty jsou zpracovány a zpět je vrácen buď soubor s mapou, a nebo výsledek dotazu.
Mapových serverů je celá řada – některé jsou komerční (na příklad od firem ESRI, TopoL nebo T-Mapy), některé jsou uvolněny pod některou z licencí umožňující jejich svobodné užívání. Mezi ty druhé patří asi nejoblíbenější mapový server – MapServer univerzity v Minnesotě. Tento program sice není uvolněn pod oblíbenou GNU GPL, jeho licence je ale dostatečně ,,svobodá`` na to, aby umožňovala kolektivní vývoj a další věci z toho plynoucí. Původně vznikl jako školní projekt, jak už to ale u podařených projektů bývá, začal žít svým životem. Budu-li v budoucnosti hovořit o mapovém serveru, budu tím mít na mysli právě mapový server z Minnesoty.
Princip fungování
Existují v zásadě tři možnosti, jak používat program mapserver
:
- Buď jako CGI-program vracející za základě vstupních parametrů obrázek mapy (map)
- Nebo jako CGI-program vracející na základě vstupních parametrů a šablony hotovou internetovou stránku s mapou
- Nebo můžeme použít celou řadu rozhraní k různým programovacím jazykům – MapScript, jako jsou Python, PHP či můj oblíbený Perl.

Pokus o zobrazení schématu fungování mapserveru
Na obrázku jsem se pokusil znázornit schéma, jak mapserver pracuje. Z pracovní stanice přijde dotaz na server s požadovanými mapovými vrstavami a souřadnicemi zájmového území. MapServer vyrobí z daného území obrázek mapy se všemi vrstavmi, legendu, referenční mapu a tak dále. Vše je definováno v konfigurančím souboru. Zpět ke klientovi je v závislosti na požadavku vrácen obrázek mapy, celá HTML stránka nebo výsledek dotazu do databáze. Jednotlivé servery spolu mohou komunikovat pomocí služeb WMS, WFS a dalších a poskytovat si tak na vzájem mapy.
Rád bych se postupně zmínil o prvních dvou možnostech. Pokročilejší uživatel by již měl být schopen napsat si požadovanou aplikaci na základě dokumentace. Aby člověk mohl skutečně naplno využít veškeré možnosti mapserveru, je potřeba umět následující jazyky nebo se alespoň trochu vyznat v jejich základech:
- HTML slouží k vytváření výsledné aplikace. Není na škodu umět CSS, pomocí kterých lze efektivě dosáhnout požadovaného vzhledu. Z funkčního hlediska jsou nejvíce používány formulářová pole, pomocí nichž se předávají parametry mapserveru.
- JavaScript je programovací jazyk, který z duše nemám rád. S jeho pomocí lze ovšem výslednou aplikaci rozpohybovat, nastavit ty správné hodnoty do těch správných formulářových polí, zapnout ty správné funkce a nakonec i ,,zmáčknout
` tlačítko tvořené obrázkem, aby bylo ,,vidět
`, jaký nástroj je právě aktivní. Naštěstí existuje již celá řada příkladů, které stačí pouze zkopírovat z výborné dokumentace a případně je jen maličko přiohnout tak, aby dělaly, co mají. - Pokročilejší uživatelé a programátoři jistě uvítají možnost ,,jít o úroveň níže`` – vzít věci pěkně do vlastních rukou a pomocí svého oblíbeného programovacího (skriptovacího) jazyka napsat celou mapovou aplikaci podle sebe – s mapserverem pouze v pozadí. Perl, Python a PHP jsou ty základní. Velká výhoda je, že funkce jsou pro všechny jazyky stejné, takže dokumentace je jednotná.
- Komu skriptovací jazyky nestačí a chtěl by se podívat aplikaci přímo na střeva, využije samozřejmě znalost Cčka…
- V Javě jsou psány některé rozšiřující applety, o kterých se zmíníme také. Ačkoliv sám jsem zastáncem co nejjednodušších stránek, JBox rozšiřuje vlastnosti webové mapy natolik, že mi za to stojí.
- Budete-li mít uložena některá vektorová data v databázi PostgreSQL, asi tušíte, jaký jazyk budete potřebovat znát.
Instalace
Existuje několik možností, jak Mapserver nainstalovat: klasickou cestou ze zdrojových kódů a nebo z připravených balíčků. Ať již tak, nebo tak, připravte se na poměrně hodně závislostí, z nichž jako nejzákladnější bych rád zmínil:
- Knihovna GDAL/OGR slouží k načítání vektorových a rastrových dat v různých formátech. Formátů pro rastry a vektory je skutečně požehnaně. Většina svobodných GISů (na příklad GRASS nebo QGIS) využívají právě tyto knihovny pro svou práci – v systému jsou tedy tak jako tak přítomny.
- Knihovna Proj se stará o převody mezi různými souřadnými systémy. Kartografická projekce je, velmi zjednodušeně řečeno, způsob, jak 3D povrch zemského tělesa (Geoidu) převést na 2D plochu – mapu. Jsou různé způsoby vedoucí k různým zkreslením. Každá kartografická projekce má navíc ještě trochu jiný souřadnicový systém s různými počátky, z nichž jeden z nejobskurnějších je v České republice dosud hojně používaný S-JTSK, který má nejen ,,prohozené osy`` x a y, ale jejich kladný směr je směrem doleva-dolů. Kromě tohoto systému se v České republice používá systém WGS-84, S-42 a nebo prostý Latitude-Longitude udávající pozice ve sférických souřadnicích. O všechny převody se ale stará právě knihovna Proj. Stačí pouze vědět, v jakém systému je mapa uložena, a všechny vrstvy budou zobrazeny na jednom místě. Není problém mít mapy uloženy v jakémsi obecném systému X,Y a všem těmto probémům se vyhnout za předpokladu, že znáte rozlišení rastrů a můžete je zohlednit.
Instalace ze zdrojových kódů probíhá klasickou trojicí configure; make; make install
. V každém případě by měla vznikout jedna binárka, kterou byste měli mít umístěnu v adresáři s CGI skripty vašeho webového serveru, tedy například /usr/lib/cgi-bin/
. Instalaci ověříte tak, že svůj webový prohlížeč nasměrujete na adresu http://localhost/cgi-bin/mapserv, a měli byste v okně prohlížeče dostat hlášku podobnou této:
Pokud se vám tento nápis objevil, pak gratuluji, můžete pokračovat dále. Pokud ne, zkuste se podívat například do logu webového serveru ( /var/log/apache/error.log
), problém asi bude někde v cestách či v právech.
Doporučená adresářová struktura
Data jsou dnes asi to nejcennější, co máte. Účelem mapového serveru není primárně data distribuovat v jejich původní formě, ale zprostředkovávat pouze náhled na ně. Proto musí být uložena někde bezpečně v systému tak, aby na ně sice ,,viděl ` uživatel, který na ně vidět má (uživatel, pod kterým běží webový server, na příklad @%&@<code>www-data</code>@%&@), ale aby se jen tak ,,nepovalovala
` na webu, aby si je kdokoliv mohl stáhnout. Proto vytvořme adresář s daty, např. ve /var/mapservdata
.
Tento adresář si rozdělíme na dva, v jednom budou vlastní data – mapy ve vektorovém a rastrovém formátu, ve druhém různé HTML šablony, například pro výsledky různých dotazů.
Někde v kořenovém adresáři webových stránek ( /var/www/
) doporučuji kvůli pořádku vytvořit ještě adresář pro mapserveří stránky, soubor s CSS styly, applety a podobně. Další adresář, který budeme potřebovat, je místo, do kterého si bude Mapserver ukládat všechny dočasné obrázky a ze kterého si je bude brát webový klient. Například /var/www/mapserver/temp/
.
Výsledná adresářová struktura by tedy měla vypadat asi následovně:
/var/mapservdata/ # adresář na data
/var/mapservdata/data/ # podadresář s vlastními daty
/var/mapservdata/tmpls/ # podadresář se šablonami a dalšími proprietamy
/var/www/mapserver/ # adresář s CSS, applety a podobně
/var/www/mapserver/temp/ # dočasné a výsledné obrázky pro klienta
/usr/lib/cgi-bin/mapserv # vlastní CGI mapserver
Nikdo vám samozřejmě nebrání vytvořit si strukturu vlastní. Toto je pouze návrh, na kterém by mělo být na první pohled zřejmé, co je vidět pouze ,,ze systému ` a co také ,,z webu
`.
Data
Jak přijít k datům a jaký by měla mít formát? Data máme rastrová a vektorová. Rastrová data mohou být všechna, která jsou podporována knihovou GDAL, jedná se tedy zejména o standardní TIFFy, ale i o JPEGy, PNG, GIF a další již speciální formáty. Vektorová data mohou být ve všech formátech podporovaných knihovnou OGR. Jak je na tom váš systém, zjistíte prostě příkazy gdal-config --formats
a ogrinfo --formats
.
Pokud máte vlastní data, zvykovým standardem bývá formát TIFF (GeoTIFF) pro rastry a ESRI Shapefile pro vektory, uložte je nyní do vašeho adresáře na data pro mapový server, v našem případě tedy do /var/mapservdata/data/
. Nemáte-li zatím žádná data, stáhněte si připravený dataset a rozbalte jej do vašeho adresáře. Jedná s o data z tutoriálu ze stránek Mapserveru (resp. jsou vykopírovaná přímo z balíku Itasca-demo (zip):
cd /var/mapservdata/data/
tar -xvzf /cesta/k/souboru/s/daty/mapserv_data.tgz
ls -l
Všimněte si, že vedle rastrových souborů s koncovkou *.tif
(které jsou pouze dva) existují ještě textové soubory s koncovkou *.tfw
, ve kterém jsou uloženy informace o souřadném systému, souřadnice levého horního rohu, rozlišení ve směru x a y a případná rotace. Soubory ve formátu ESRI Shapefile jsou rozděleny do třech: *.shp, *.shx, *.dbf
. Musí být vždy pohromadě. Soubor *.dbf
můžete prohlížet a upravovat případně pomocí nějakého tabulkového kalkulátoru, ovšem pozor, některé programy načítají pouze prvních (oocalc) 32 000 řádků, což se může na první pohled jevit jako hodně vysoké číslo, na druhý ovšem můžete hořce zaplakat, neboť zbytek souboru bývá prostě odříznut.
Závěr
A to by bylo pro začátek všechno. Máme připravená data, připravenou adresářovou strukturu a nainstalovaný mapserver. Příště začneme psát náš konfigurančí soubor pro mapserver – Mapfile – a necháme jej vygenerovat první mapu.