Úloha 3 – Základy ArcGIS JavaScript API. Práce s WebMap. Mapová aplikace pomocí ArcGIS API
ArcGIS API for JavaScript – základy
ArcGIS API for JavaScript je výkonný nástroj pro vytváření interaktivních webových mapových aplikací. V dalších cvičeních se naučíme základy práce s tímto API, od vytvoření jednoduché mapy a vložení do HTML stránky až po pokročilejší customizace.
Úvod – potřebné stránky
- Začneme vytvořením základní HTML stránky (soubor 
index.html), do které chceme vložit mapu. - Vytvoříme 
<div>element s identifikátorem "mapDiv", který bude sloužit jako kontejner pro mapu. - Přidáme JavaScript kód, který vytvoří mapu.
 - Použijeme modul esri/Map k vytvoření instance mapy.
 - Nastavíme základní mapu (basemap) pomocí vlastnosti basemap.
 - Vytvoříme instanci esri/views/MapView a nastavíme kontejner mapy pomocí vlastnosti container.
 - Nastavíme střed mapy (center) a úroveň přiblížení (zoom).
 - Vložíme JavaScript kód do souboru 
script.js. - Přidáme odkaz na ArcGIS API for JavaScript a na soubor se skriptem v 
<head>elementu HTML stránky. 
Po otevření HTML souboru ve webovém prohlížeči se zobrazí interaktivní mapa.
Stav kódu po vložení mapy do stránky a její inicializaci
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Pěkná mapa č. I</title>
    <link rel="stylesheet" href="https://js.arcgis.com/4.28/esri/themes/light/main.css">
    <script src="https://js.arcgis.com/4.28/"></script>     <!-- odkaz na knihovny a skripty Esri   -->
    <script src="script.js"></script>
    <style>
        #mapDiv {
            width: 60%;
            height: 600px;
        }
    </style>
</head>
<body>
    <h1>První mapa vytvořená v ArcGIS API for JavaScript</h1>
    <div id="mapDiv"></div>
</body>
</html>
require(["esri/Map", "esri/views/MapView"], function(Map, MapView) {
    const map = new Map({
        basemap: "streets"      // rastrová basemapa, lze jinak volit např. topo, satellite, hybrid, gray, oceans atd.
                                // nebo vektorové např. streets-vector, topo-vector, gray-vector apod.
    });
    const view = new MapView({
        container: "mapDiv",
        map: map,
        center: [14.42, 50.09], // souřadnice Prahy
        zoom: 10
    });
});
Tento kód vytvoří jednoduchou mapu s podkladovou mapou streets a zobrazí Prahu.
Podívejme se nyní na sekci require. Zde jsou běžně definovány moduly, které mapová aplikace vyžaduje ke svému běhu. Mezi důležité moduly patří např.:
| Modul | Popis | Příklad použití | 
|---|---|---|
esri/Map | 
Vytvoření mapy | var map = new Map({ basemap: "streets" }); | 
esri/views/MapView | 
Zobrazení 2D mapy | var view = new MapView({ container: "viewDiv", map: map }); | 
esri/views/SceneView | 
Zobrazení 3D scény | var view = new SceneView({ container: "viewDiv", map: map }); | 
esri/layers/FeatureLayer | 
Zobrazení vektorové vrstvy prvků | var layer = new FeatureLayer({ url: "https://.../FeatureServer/0" }); | 
esri/layers/MapImageLayer | 
Zobrazení dynamické mapové služby | var layer = new MapImageLayer({ url: "https://.../MapServer" }); | 
esri/layers/ImageryLayer | 
Zobrazení rastrové vrstvy snímků | var layer = new ImageryLayer({ url: "https://.../ImageServer" }); | 
esri/layers/GraphicsLayer | 
Zobrazení grafických prvků | var layer = new GraphicsLayer(); | 
esri/geometry/* | 
Práce s geometriemi (body, linie, polygony) | var point = new Point({ x: 10, y: 20 }); | 
esri/symbols/* | 
Nastavení symbolů pro prvky | var symbol = new SimpleMarkerSymbol({ color: "red" }); | 
esri/widgets/* | 
Přidání widgetů pro ovládání mapy | var legend = new Legend({ view: view }); | 
esri/tasks/* | 
Geoprocessingové úlohy | var task = new GeoprocessingTask({ url: "https://.../GPServer/Buffer" }); | 
esri/Graphic | 
Vytvoření grafického prvku | var graphic = new Graphic({ geometry: point, symbol: symbol }); | 
esri/PopupTemplate | 
Vytvoření popup okna | var template = new PopupTemplate({ title: "Atributy", content: "{*}" }); | 
esri/core/watchUtils | 
Sledování změn vlastností objektů | watchUtils.when(view, "stationary", function() { ... }); | 
dojo/domReady! | 
Zajistí, že se kód spustí až kompletním načtení DOM | –– | 
Přidání rastrové vrstvy
Přidání vrstvy do mapy:
V JavaScriptovém kódu aplikace používáme modul esri/layers/MapImageLayer pro načtení dynamické mapové služby nebo modul esri/layers/FeatureLayer pro načtení vektorové vrstvy prvků.
Zde je příklad kódu pro načtení dynamické mapové služby ortofota ČÚZK:
Vložení dynamické rastrové vrstvy
require([
"esri/Map",
"esri/views/MapView",
"esri/layers/MapImageLayer",
], function(Map, MapView, MapImageLayer) {
var map = new Map({
    basemap: "streets"     // rastrová basemapa, lze jinak volit např. topo, satellite, hybrid, gray, oceans atd.
                           // nebo vektorové např. streets-vector, topo-vector, gray-vector apod.
});
var view = new MapView({
    container: "viewDiv",
    map: map,
    center: [14.42, 50.09], // souřadnice Prahy
    zoom: 12
});
var Ortofoto = new MapImageLayer({
    url: "https://ags.cuzk.cz/arcgis1/rest/services/ORTOFOTO_WM/MapServer"
});
map.add(Ortofoto);          // přidání k vykreslení do mapy
});
Nyní bychom rádi vytvořili mapu, která bude obsahovat jako basemap vrstvu ortofota např. s obcemi z ArcČR. Můžeme využít toho, že lze v aplikacích pracovat i s vrstvami v ArccGIS Online nebo Portal for ArcGIS. Tyto vrstvy voláme pomocí tzv. Portal ID, které lze zjistit přes REST rozhraní dané vrstvy.
Kód bude vypadat následovně:
Vložení vlastní basemapy
require([
"esri/Map",
"esri/views/MapView",
"esri/layers/MapImageLayer",
"esri/layers/FeatureLayer", //nově: importujeme vektorovou vrstvu
"esri/Basemap", // nově: importujeme Basemap
"esri/portal/PortalItem" //nově: importujeme položku z ArcGIS Online
], function(Map, MapView, MapImageLayer, FeatureLayer, Basemap) {
// Vytvoření rastrové vrstvy pro ortofoto
const ortofoto = new MapImageLayer({
    url: "https://ags.cuzk.cz/arcgis1/rest/services/ORTOFOTO_WM/MapServer",
    title: "Ortofoto ČR"
});
// Vytvoření vektorové vrstvy obcí pomocí ItemID
const obce = new FeatureLayer({
    portalItem: {
    id: "1838754f565b47658477ab75ea2eced0"
    },
    title: "Obce ČR"
});
// Vytvoření vlastní basemapy
const vlastniBasemap = new Basemap({
    baseLayers: [ortofoto, obce], // Vložíme obě vrstvy do baseLayers
    title: "Ortofoto + hranice obcí", // Název naší vlastní basemapy
    id: "ortofoto-obce" // Unikátní ID basemapy
});
// Vytvoření mapy a nastavení vlastní basemapy
const map = new Map({
    basemap: vlastniBasemap // Použijeme naši vlastní basemapu
});
var view = new MapView({
    container: "mapDiv",
    map: map,
    center: [14.42, 50.09], // souřadnice Prahy
    zoom: 12
});
});
Abychom uživateli umožnili si podkladovou mapu přepnout na jinou, než jsme mu právě načetli, je možné vložit kus kódu pro přepínač basemap.
"esri/widgets/BasemapGallery"
...
// Vytvoření instance BasemapGallery
const basemapGallery = new BasemapGallery({
    view: view,
        source: [ // nastavení zdroje basemap – můžeme přidat naši vlastní
        vlastniBasemap,
        "topo-vector",
        "satellite",
        "streets"
        // můžete přidat další předdefinované basemapy nebo instance Basemap
    ]
  });
  // přidání BasemapGallery widgetu do zobrazení (například do pravého horního rohu)
  view.ui.add(basemapGallery, {
    position: "top-right"
  });
Případně pokud chceme využít výchozí galerii basemap, stačí deklarovat jen
"esri/widgets/BasemapGallery"
...
// Vytvoření instance BasemapGallery
const basemapGallery = new BasemapGallery({
    view: view
    });
  // přidání BasemapGallery widgetu do zobrazení (například do pravého horního rohu)
    view.ui.add(basemapGallery, {
    position: "top-right"
    });
Grafika v mapě
Pojďme nyní zkusit do mapy přidat pár stacionárních bodů, nad kterými se zobrazí nějaký základní bodový symbol.
Budeme potřebovat další moduly, a to esri/Graphic, esri/layers/GraphicsLayer a esri/symbols/SimpleMarkerSymbol.
Následující kus kódu přidá do mapy několik bodů definovaných v poli coordinates – několik měst:
// Vytvoření vrstvy pro grafiku (body)
  const graphicsLayer = new GraphicsLayer();
  map.add(graphicsLayer);
  // Definování symbolu pro body
  const pointSymbol = new SimpleMarkerSymbol({
    color: [0, 0, 255], // Modrá barva
    outline: {
      color: [255, 255, 255], // Bílá obrys
      width: 1
    },
    size: 8
  });
  // pole souřadnic bodů (longitude, latitude)
  const coordinates = [
    [14.42, 50.09],   // Praha
    [16.61, 49.20],   // Brno
    [18.21, 49.59],   // Ostrava
    [15.77, 49.09],   // Jihlava
    [12.91, 50.08]    // Plzeň
  ];
  // iterování pole souřadnic a vytvoření grafických objektů
  coordinates.forEach(function(coords) {
    // vytvoření geometrie bodu
    const point = {
      type: "point",
      longitude: coords[0],
      latitude: coords[1]
    };
    // vytvoření grafického objektu
    const pointGraphic = new Graphic({
      geometry: point,
      symbol: pointSymbol
    });
    // přidání grafického objektu do vrstvy grafiky
    graphicsLayer.add(pointGraphic);
  });
Přidání vrstev z ArcGIS Serveru
Můžeme přidávat jako obsah samozřejmě nejen vrstvy ArcGIS Online, ale i z ArcGIS Serveru, dostupné přes REST rozhraní.
Zde je příklad s vrstvou silnic z DATA50 přidanou do mapy:
    const silnice = new FeatureLayer({
    url: "https://ags.cuzk.cz/arcgis/rest/services/DATA50/MapServer/41"  // vrstva silnic z DATA50
    });
    // přidání vrstvy z ArcGIS Serveru do mapy
    map.add(silnice);
Vyzkoušejte si práci s různými druhy vrstev (rastrové, vektorové; z ArcGIS Online, ze serveru).
Další kroky
- Naučíme se přidávat interaktivní prvky do mapy – např. popup okna.
 - Přidáme kompoziční prvky (legendu, galerii podkladových map apod.).
 - Naučíme se pracovat s geometriemi a symboly pro vizualizaci dat na mapě.
 - Přidáme geoprocessingové nástroje pro analýzu dat na mapě.
 - Funkcionalitu mapové aplikace rozšíříme pomocí widgetů.