Home > Uncategorized > Mapy.cz v OpenLayers

Mapy.cz v OpenLayers

November 1st, 2008

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.La­yer.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.La­yer.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):

Podkladová mapa s překryvnými rastry

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.Con­trol.MousePosi­tion 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.Pro­jection.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.

petr k. Uncategorized , , , ,

  1. January 5th, 2009 at 09:13 | #1

    Velice zajímavé dík.

  2. August 5th, 2009 at 11:53 | #2

    funguje to:) pridam si to do porovnani map, pokud proti tomu nic nemas.

  1. No trackbacks yet.