<\/HEAD>
Dnes byl zveřejněn skvělý blog od Paul Barker<\/A> o nových funkcích FeatureSet: Co je nového v Arcade: Procházka skrz FeatureSets (Část 1)<\/A> a také Kelly Gerrow<\/A> sdílela skvělý dokument na toto téma: https:\/\/community.esri.com\/community\/gis\/web-gis\/arcgisonline\/blog\/2018\/12\/10\/overlapping-features-in-pop-ups-quick-introduction-to-using-featuresets-with-arcade<\/A> . <\/P><\/P>
Nechtěl jsem zůstat pozadu, tak jsem si řekl, že sdílím několik příkladů s použitím hydrantů, historie údržby a podsektorů a hydraulických sektorů, abych ukázal, co můžete dosáhnout s novými funkcemi Arcade vydanými v ArcGIS Online 5. prosince.<\/P>
<\/P>
Předpokládejme, že máme webovou mapu s několika vrstvami a tabulkou:<\/P>
<\/P>
<\/P>
- Hidrantes<\/EM> je bodová vrstva s hydrantySub Sector<\/EM> je polygonová vrstva s podrozdělením oblasti zájmuSector Hidraulico<\/EM> je polygonová vrstva slučující podsektory do hydraulických sektorůHist Mantenimiento<\/EM> je tabulka s historickými záznamy údržby pro každý hydrant<\/LI><\UL><\P>Nejprve aplikujme Arcade pro vizualizaci hydrantů na základě jejich stáří. To již bylo možné v předchozím vydání, takže zde zatím nic nového. Máme datum instalace uložené ve sloupci FECHAINSTALACION a můžeme použít funkce DateDiff<\EM> a Now<\EM>, abychom určili stáří v letech, což se děje v prvních dvou řádcích. Poté klasifikujeme hodnotu do významných rozsahů:<\P>
<SPAN class="keyword token">var<\SPAN> fecha_inst <SPAN class="operator token">=<\SPAN> $feature<SPAN class="punctuation token">.<\SPAN>FECHAINSTALACION<SPAN class="punctuation token">;<\SPAN>
<SPAN class="keyword token">var<\SPAN> edad <SPAN class="operator token">=<\SPAN> <SPAN class="token function">DateDiff<\SPAN>(<SPAN class="token function">Now<\SPAN>(<SPAN class="punctuation token">)<\SPAN>, fecha_inst, <SPAN class="string token">"years"<\SPAN>)<SPAN class="punctuation token">;<\SPAN>
<SPAN class="keyword token">var<\SPAN> clase_edad <SPAN class="operator token">=<\SPAN> <SPAN class="string token">""<\SPAN>;<\SPAN>
<SPAN class="keyword token">if<\SPAN> (edad > 50) {
clase_edad = "Více než 50 let";
} else if (edad > 40) {
clase_edad = "Mezi 40 a 50 lety";
} else if (edad > 30) {
clase_edad = "Mezi 30 a 40 lety";
} else if (edad > 20) {
clase_edad = "Mezi 20 a 30 lety";
} else if (edad > 10) {
clase_edad = "Mezi 10 a 20 lety";
} else if (edad > 5) {
clase_edad = "Mezi 5 a 10 lety";
} else {
clase_edad = "Méně než 5 let";
}
return clase_edad;
<span class="line-numbers-rows"><span><<EMOJI_0>><\span><span><<EMOJI_1>><\span><span><<EMOJI_2>><\span><span><<EMOJI_3>><\span><span><<EMOJI_4>><\span><span><<EMOJI_5>><\span><span><<EMOJI_6>><\span><span><<EMOJI_7>><\span><span><<EMOJI_8>><\span><span><<EMOJI_9>><\span><span><<EMOJI_10>><\span><span><<EMOJI_11>><\span><span><<EMOJI_12>><\span><span><<EMOJI_13>><\span><span><<EMOJI_14>><\span><span><<EMOJI_15>><\span><span><<EMOJI_16>><\span><span><<EMOJI_17>><\span><span><<EMOJI_18>><\span><span><<EMOJI_19>><\span></pre><p></p><p>Výsledkem je text popisující stáří, pro který můžeme definovat reprezentativní symboly (zde používáme symboly Firefly):</p><p><img class="image-2 jive-image" src="https://us.v-cdn.net/6038851/uploads/legacyfs/online/431467_pastedImage_10.png" /></p><p></p><p>Pro ostatní dvě polygonové vrstvy nejsou použity žádné efektní symboly, aby nebyla odváděna pozornost od hydrantů.</p><p></p><p>Chtěli bychom zobrazit v pop-up okně každého hydrantu seznam veškeré údržby provedené na hydrantu. Jak tabulka historie údržby, tak vrstva hydrantů obsahují ID hydrantu. Tabulka také obsahuje data a typ údržby.</p><p></p><p>V konfiguraci pop-up okna hydrantů můžeme přidat Arcade výraz jako tento:</p><pre class="lia-code-sample line-numbers language-none"><code>var tbl = FeatureSetByName($datastore,"Hist_Mantenimiento");
var codigo = $feature["COD_HIDRANTE"];
var sql = "COD_HIDRANTE = '" + codigo + "'";
Console(sql);
var mantenimientos = Filter(tbl, sql);
var cnt = Count(mantenimientos);
var historia = "";
if (cnt > 0) {
historia = cnt + " Údržba(y):";
<SPAN class="keyword token">pro <\/SPAN> <SPAN class="punctuation token">(<\/SPAN><SPAN class="keyword token">var<\/SPAN> mantenimiento <SPAN class="keyword token">v<\/SPAN> mantenimientos<SPAN class="punctuation token">)<\/SPAN> <SPAN class="punctuation token">{<\/SPAN>\n <SPAN class="keyword token">var<\/SPAN> txt_fecha <SPAN class="operator token">=<\/SPAN> <SPAN class="token function">Text<\/SPAN><SPAN class="punctuation token">(<\/SPAN>mantenimiento<SPAN class="punctuation token">.<\/SPAN>Fecha_Mantenimiento<SPAN class="punctuation token">,<\/SPAN> <SPAN class="string token">' - (Y\/MM\/DD) '<\/SPAN><SPAN class="punctuation token">)<\/SPAN><SPAN class="punctuation token">;<\/SPAN>\n <SPAN class="keyword token">var<\/SPAN> txt_man <SPAN class="operator token">=<\/SPAN> txt_fecha <SPAN class="operator token">+<\/SPAN> mantenimiento<SPAN class="punctuation token">.<\/SPAN>Mantenimiento<SPAN class="punctuation token">;<\/SPAN>\n historia <SPAN class="operator token">+<\/SPAN><SPAN class="operator token">=<\/SPAN> TextFormatting<SPAN class="punctuation token">.<\/SPAN>NewLine <SPAN class="operator token">+<\/SPAN> txt_man<SPAN class="punctuation token">;<\/SPAN>\n <SPAN class="punctuation token">}<\/SPAN>\n<SPAN class="punctuation token">}<\/SPAN> <SPAN class="keyword token">jinak<\/SPAN> <SPAN class="punctuation token">{<\/SPAN>\n historia <SPAN class="operator token">=<\/SPAN> <SPAN class="string token">"Žádné údržby nejsou"<\/SPAN><SPAN class="punctuation token">;<\/SPAN>\n<SPAN class="punctuation token">}<\/SPAN>\n\n<SPAN class="keyword token">vrátit<\/SPAN> historia<SPAN class="punctuation token">;<\/SPAN> \n<SPAN class="line-numbers-rows"><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/span><span></span><span>></span><span>></span><span>></span><span>></span><span>></span><span>></span><span>></span><span>></span><span>></span></span>Především přistupujeme k tabulce s historií údržby a přiřazujeme ji do proměnné tbl. Poté čteme ID aktuálního hydrantu, pro který chceme vytvořit pop-up. Definujeme SQL výraz pomocí ID hydrantu, který se pak použije k filtrování tabulky historie. Výsledek je uložen v proměnné nazvané mantenimientos. Můžeme provést Count, abychom získali počet údržeb provedených na hydrantu. Pokud je počet (cnt) větší než 0, začneme číst podrobnosti a sestavovat seznam údržby včetně data a typu údržby.
Výsledek bude vypadat takto poté, co nakonfigurujeme jednoduchý vlastní HTML pro zobrazení atributů a výsledku Arcade výrazu v pop-upu:

Nyní pokračujme s využitím těchto nových funkcí Arcade k získání dat o hydrantech na úrovni podsektoru. Jelikož počet údržeb samozřejmě závisí na stáří hydrantu, bylo by hezké získat nějaké podrobnosti o tom na úrovni podsektoru.
V konfiguraci pop-upu podsektorů můžeme přidat následující Arcade výraz:
<span class="keyword token">var</span> fs <span class="operator token">=</span> <span class="token function">FeatureSetByName</span>( $datastore , "Hidrantes" ) ;
<span class="keyword token">var</span> hidrantes <span class="operator token">=</span> <span class="token function">Intersects</span>( fs , $feature ) ;
<span class="keyword token">var</span> cnt <span class="operator token">=</span> <span class="token function">Count</span>( hidrantes ) ;
<span class="keyword token">var</span> edad_tot <span class="operator token">=</span> 0 ;
<span class="keyword token">pro</span>( var hidrante in hidrantes ) {
var edad = DateDiff( Now() , hidrante.FECHAINSTALACION , "years" ) ;
edad_tot += edad ;
}
<span class="keyword token">var</span> resultado = "" ;
<span class="keyword token">pokud</span>( cnt > 0 ) {
var edad_media = edad_tot / cnt ;
resultado = "Je zde " + cnt + " hydrantů v podsektoru" ;
resultado += TextFormatting.NewLine + "Průměrný věk hydrantů je " + Round(edad_media, 2) + " let" ;
} jinak {
resultado = "V podsektoru nejsou žádné hydranty" ;
}
<span class="keyword token">vrátit</span> resultado ;
<span class="line-numbers-rows"><Span><<EMOJI_19>></Span><Span><<EMOJI_20>></Span><Span><<EMOJI_21>></Span><Span><<EMOJI_22>></Span><Span><<EMOJI_23>></Span><Span><<EMOJI_24>></Span><Span><<EMOJI_25>></Span><Span>.<. ></Span><. ></Span><. ></Span><. ></Span><. ></Span><. ></Span><. ></Span><. ></Span><. ></Span><. ></Span><. ></Span><. ></Span>
Tento výraz udělá:<p>- Přístup k vrstvě Hydrants<p>- Provede průnik s aktuálním prvkem podsektoru<p>- Spočítá počet hydrantů v podsektoru<p>- Vypočítá věk každého hydrantu a sečte všechny věky<p>- Vypočítá průměrný věk hydrantů a formátuje text s touto informací<p>
Výsledek bude vypadat takto:<p>
<img src='https://us.v-cdn.net/6038851/uploads/legacyfs/online/431475_pastedImage_15.png' alt='Výsledek' />
<p>
V tomto případě je v podsektoru 93 hydrantů a průměrný věk je 20,64 let.
<p>
To je zábava, ale můžeme také zobrazit názvy podsektorů, které jsou obsaženy v hydraulickém sektoru pomocí těchto nových funkcí Arcade? Odpověď je ano. Přidáme následující výraz do hydraulických sektorů:<pre>
var fs = FeatureSetByName($datastore, "Sub Sector");
var subsectores = Intersects(fs, $feature);
var cnt = Count(subsectores);
var resultado = "Seznam " + cnt + " Podsektorů:";
<span class="keyword token">for<\/SPAN> <SPAN class="punctuation token">(<\/SPAN><SPAN class="keyword token">var<\/SPAN> subsektor <SPAN class="keyword token">in<\/SPAN> subsectores<SPAN class="punctuation token">)<\/SPAN> <SPAN class="punctuation token">{<\/SPAN>
vysledek <SPAN class="operator token">+<\/SPAN><SPAN class="operator token">=<\/SPAN> TextFormatting<SPAN class="punctuation token">.<\/SPAN>NewLine <SPAN class="operator token">+<\/SPAN> subsektor<SPAN class="punctuation token">.<\/SPAN>IDSAP<SPAN class="punctuation token">;<\/SPAN>
<SPAN class="punctuation token">}<\/SPAN>
<SPAN class="keyword token">return<\/SPAN> vysledek<SPAN class="punctuation token">;<\/SPAN>
<SPAN class="line-numbers-rows"><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><\/SPAN><\/CODE><\/PRE><P><\/P><P>Stačí přistoupit k vrstvě sub sektorů a provést Intersect s aktuálním hydraulickým sektorem a voilà3, správně? Ne, ne tak docela. Když použijete Intersect mezi dvěma polygonovými vrstvami, pravděpodobně vrátí příliš mnoho prvků kvůli tomu, že když dva polygony mají společnou hranici, pravděpodobně budou zahrnuty ve výsledku, což vede k více sub sektorům, než chceme.<\/P><P><\/P><P>Způsob, jak tomu předejít, je použít malý záporný buffer na hydraulický sektor a provést Intersect s touto bufferovanou geometrií takto:<\/P><PRE class="lia-code-sample line-numbers language-none"><CODE><SPAN class="keyword token">var<\/SPAN> fs <SPAN class="operator token">=<\/SPAN> <SPAN class="token function">FeatureSetByName<\/SPAN><SPAN class="punctuation token">(<\/SPAN>$datastore<SPAN class="punctuation token">,<\/SPAN><SPAN class="string token">"Sub Sector"<\/SPAN><SPAN class="punctuation token">)<\/SPAN><SPAN class="punctuation token">;<\/SPAN>
<SPAN class="keyword token">var<\/SPAN> feature_buf <SPAN class="operator token">=<\/SPAN> <SPAN class="token function">Buffer<\/Span>(<$feature>, -100, 'meters');
<span class="keyword token">var</span> subsectores = Intersects(fs, feature_buf);
<span class="keyword token">var</span> cnt = Count(subsectores);
<span class="keyword token">var</span> vysledek = "Listado de los " + cnt + " Subsectores:";
<span class="keyword token">for</span> (<span class="keyword token">var</span> subsektor in subsectores) {
vysledek += TextFormatting.NewLine + subsektor.IDSAP;
}
<span class="keyword token">return</span> vysledek;
<span class="line-numbers-rows"><span><<EMOJI_10>></span><span><<EMOJI_11>></span><span><<EMOJI_12>></span><span><<EMOJI_13>></span><span><<EMOJI_14>></span><span><<EMOJI_15>></span><span><<EMOJI_16>></span><span><<EMOJI_17>></span><span><<EMOJI_18>></span><span><<EMOJI_19>></span></span>
Pozorujte Buffer se zápornou vzdáleností, který je vytvořen na řádku 2 a použit na řádku 3 pro získání správných polygonů.<\/P>
Výsledný pop-up se zobrazí takto:<\/P>

Abych byl upřímný, nelíbí se mi neuspořádaný seznam sub sektorů, takže tento seznam seřadíme pomocí OrderBy<\/EM>:<\/P>
<span class="keyword token">var</span> fs = FeatureSetByName($datastore,"Sub Sector");
<span class="keyword token">var</span> feature_buf = Buffer($feature, -100, 'meters');
<span class="keyword token">var</span> subsectores = OrderBy(Intersects(fs, feature_buf), 'IDSAP ASC');
<span class="keyword token">var</span> cnt = Count(subsectores);
<span class="keyword token">var</span> vysledek = "Listado de los " + cnt + " Subsectores:";
<span class="keyword token">for</span> (<span class="keyword token">var</span> subsektor in subsectores) {
vysledek += TextFormatting.NewLine + subsektor.IDSAP;
}
<span class="keyword token">return</span> vysledek;
<span class="line-numbers-rows"><span><<EMOJI_21>></span><span><<EMOJI_22>></span><span><<EMOJI_23>></span><span><<EMOJI_24>></span><span><<EMOJI_25>></span></span>
Který bude mít za následek seřazený seznam sub sektorů:<\/P>

Doufám, že tyto příklady vám pomohou pochopit, co je možné pomocí Arcade s nejnovější aktualizací v ArcGIS Online, ale než začnete vytvářet úžasné Arcade výrazy, chci na chvíli citovat strýčka Bena (Spider-Man):<\/P>
S velkou mocí přichází velká odpovědnost...<\/EM>
Jak zmiňuje Paul Barker<\/A> ve svém blogu, buďte opatrní a vždy ověřte, že výkon vašich výrazů přináší přijatelnou dobu odezvy pro vašeho koncového uživatele.<\/>