Ú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ů.