Mapy.cz v OpenLayers
Pokud jste se někdy zamýšleli nad tím, jakým způsobem lze použít mapy Seznamu (aka mapy.cz) v opensource knihovně OpenLayers, možná jste přišli na to, že to není tak jednoduché, jak se na první pohled zdá. Seznam sice poskytuje ke svým mapám API, ale to je, ačkoliv vcelku povedené, co do možností poněkud omezené oproti OpenLayers.
Souřadný systém
Základním problémem je ovšem Seznamem používaný souřadný systém.
Jak je uvedeno zde,
jedná se o mírně upravenou projekci WGS84/UTM v zóně 33. Netuším,
proč Seznam zmíněné zobrazení upravuje k obrazu svému; možná to má
souvislost s rozdělením zájmového území do dlaždic (a systémem jejich
číslování), možná ne
Tak či onak, Google a podobné služby používají
dlaždice i souřadný systém rozdílně, což překryv dat ze Seznamu a
těchto služeb prakticky znemožnuje. Ještě dlužno podotknout, že
formální definice projekce, na kterou zmíněný článek odkazuje (najdete ji
na http://www.spatialreference.org/…-projection/),
mi bohužel nedávala správné výsledky. Testoval jsem v prostředí ESRI,
kde jsem programově (ArcObjects) vytvořil kýženou transformaci pomocí WKT
popisu a převedené souřadnic porovnával s tím, co ukazovalo webové
prostředí Mapy.cz. Zda je chyba na mé straně, na straně autora definice
souř. systému, či „na straně Seznamu“ (souř. systém se mohl od té
doby změnit), netuším.
OpenLayers.Layer.Seznam
Nicméně, chceme-li pouze data v prostředí OpenLayers zobrazit a potíže
s integrací dat jiných služeb nás tolik netrápí, žádný závažnější
problém již v podstatě neexistuje. Soubor seznam.js obsahuje třídu
OpenLayers.Layer.Seznam, která data umí zobrazit. (Poznámka:
zdrojový kód chápejte jen jako čistě testovací a
demonstrační). Kód je životně závislý na předpokladu, že
Seznam stahování dlaždic přímým URL ze svých nijak neomezuje, což je
premisa v době psaní tohoto článku pravdivá. V budoucnosti lze ale podle
mého názoru očekávat v tomto ohledu nějakou změnu
Základní příklad použití kódu je zde:
// volano z onload
function initOpenLayersMap() {
var map = new OpenLayers.Map('map'); // predpokladame div s id "map"
var seznamLyr = new OpenLayers.Layer.Seznam("Seznam");
map.addLayers([seznamLyr]);
map.addControl(new OpenLayers.Control.LayerSwitcher());
map.addControl(new OpenLayers.Control.MousePosition());
map.setCenter(new OpenLayers.LonLat(134801968, 138286528), 7);
}
Všimněte si toho, že se zde tedy souřadnice v metodě
setCenter uvádějí v souřadném systému Seznamu (tyto jsou
zhruba v oblasti Liberce a Jablonce nad Nisou), nikoliv v souřadnicích
zeměpisných.
Overlay mapy
Další příklad ukazuje využití jiné podkladové mapy a též demonstruje přidání další překryvné vrstvy:
function initOpenLayersMap() {
var map = new OpenLayers.Map('map');
var seznamLyr = new OpenLayers.Layer.Seznam("Seznam", "ophoto");
var popisyLyr = new OpenLayers.Layer.Seznam("Popisy", "hybrid");
popisyLyr.isBaseLayer = false;
var turistTrasyLyr = new OpenLayers.Layer.Seznam("Turistické trasy", "ttur");
turistTrasyLyr.isBaseLayer = false;
map.addLayers([seznamLyr, popisyLyr, turistTrasyLyr]);
map.addControl(new OpenLayers.Control.LayerSwitcher());
map.addControl(new OpenLayers.Control.MousePosition());
map.setCenter(new OpenLayers.LonLat(134801968, 138286528), 10);
}
Výsledek by mohl vypadat nějak takto (ortofoto mapa s popisy a turistickými trasami):
Všimněte si parametru následujícího název vrstvy. Ten udává zdroj dat na serverech Seznamu a přímo se promítne do URL stahovaných dlaždic. Jako podkladové mapy lze použít:
- base základní mapa (nemusí se uvádět)
- turist turistická mapa
- ophoto ortofotomapa
- army2 historická 1836–52
- ophoto0203 ortofotomapa 2002–3
Jako překryvné mapy pak můžete specifikovat:
- hybrid popisy (sídel, silnic ap.)
- relief-h stínování
- tturist turistické trasy
- tcyklo cyklostezky
Pochopitelně ne všechny kombinace mají smysl a ne všechna data jsou
dostupná ve všech měřítcích. Je potřeba s tím trochu
experimentovat ![]()
Zeměpisné souřadnice
Výše uvedené je samo o sobě hezké, ale bez alespoň minimální podpory
uživateli blízkých zeměpisných souřadnic to, přiznejme si, není to
pravé ořechové. Při pohybu kurzorem nad mapou se prvek
OpenLayers.Control.MousePosition o zobrazení souřadnic postará,
nicméně se pochopitelně jedná o souřadnice zdrojových dat. Proto jsem
též vedle třídy samotné vrstvy připojil i požadované zobrazení pro
Mapy.cz – třída OpenLayers.Projection.Seznam. Umí převod z a
do WGS84 (EPSG kód 4326). Toto zobrazení je „seznamáckým“ vrstvám
přiřazeno automaticky, stačí tedy jen adekvátně specifikovat projekci, se
kterou mají pracovat k mapě připojené ovládací prvky. Důležité je, že
toto se musí stát ještě před přidáním ovl. prvků do mapy. Konkrétní
příklad viz níže
:
function initOpenLayersMap() {
var map = new OpenLayers.Map('map');
var seznamLyr = new OpenLayers.Layer.Seznam("Seznam");
map.addLayers([seznamLyr]);
map.projection = new OpenLayers.Projection("EPSG:4326");
map.displayProjection = map.projection;
map.addControl(new OpenLayers.Control.LayerSwitcher());
map.addControl(new OpenLayers.Control.MousePosition());
map.setCenter(new OpenLayers.LonLat(134801968, 138286528), 7);
}
Ende
Pevně věřím, že bude kód někomu užitečný. I tak ho prosím ale berte s rezervou, není pochopitelně nijak oficiálně spojen se Seznamem samotným, ani s poskytovateli relevantních dat. Může se snadno stát, že jakákoliv změna ze strany Seznamu bude mít za následek jeho nefunkčnost. Také bych chtěl upozornit na to, že v žádném případě nejsem expert na OpenLayers, proto patrně budou některé věci neošetřené a některé jsou naopak ošetřované dost možná zbytečně. Seeya.

Velice zajímavé dík.
funguje to:) pridam si to do porovnani map, pokud proti tomu nic nemas.
Je to paráda a stále funguje:)
Povedlo se někomu mít na jedné mapě Seznam i Google vrstvu?
Chyba pri transformaci je pravdepodne zpusobena nekompatibilitou WKT definice mezi ESRI produkty a Proj4. Pokud pouzijete jakykoliv Proj4-based open-source projekt tak vam transformace bude fungovat korektne.