<\/HEAD>
Vandaag werd een geweldige blog gepost door Paul Barker<\/A> over de nieuwe FeatureSet-functies: Wat is er nieuw met Arcade: Een wandeling door FeatureSets (Deel 1)<\/A> en ook Kelly Gerrow<\/A> deelde een geweldig document over dit onderwerp: 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>
Ik wilde niet achterblijven, dus ik dacht dat ik wat voorbeelden zou delen met hydranten, de onderhoudsgeschiedenis en sub sectoren en hydraulische sectoren om te laten zien wat je kunt bereiken met de nieuwe Arcade-functies die op 5 december in ArcGIS Online zijn uitgebracht.<\/P>
<\/P>
Stel dat we een webkaart hebben met verschillende lagen en een tabel:<\/P>
<\/P>
<\/P>
- Hidrantes<\/EM> is een puntlaag met hydranten<\/LI>Sub Sector<\/EM> is een polygoonlaag met een onderverdeling van het interessegebied<\/LI>Sector Hidraulico<\/EM> is een polygoonlaag die sub sectoren samenvoegt tot hydraulische sectoren<\/LI>Hist Mantenimiento<\/EM> is een tabel met de historische onderhoudsgegevens voor elke hydrant<\/LI><\/UL><\/P>Allereerst passen we wat Arcade toe om de hydranten te visualiseren op basis van hun leeftijd. Dit was al mogelijk in de vorige release, dus hier nog geen nieuwe dingen. We hebben de installatiedatum opgeslagen in het veld FECHAINSTALACION en we kunnen de DateDiff<\/EM> en Now<\/EM> functies gebruiken om de leeftijd in jaren te bepalen, wat gebeurt in de eerste twee regels. Daarna classificeren we de waarde in significante bereiken:<\/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="punctuation token">,</SPAN> <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> <SPAN class="punctuation token">(<\/<SPAN>edad <SPAN class="operator token">><\/<SPAN> <SPAN class="number token">50<\/<SPAN>) {\n clase_edad <SPAN class="operator token">=<\/<SPAN> <SPAN class="string token">"Ouder dan 50 jaar"<\/<SPAN>;\n} else if (edad > 40) {\n clase_edad = "Tussen 40 en 50 jaar";\n} else if (edad > 30) {\n clase_edad = "Tussen 30 en 40 jaar";\n} else if (edad > 20) {\n clase_edad = "Tussen 20 en 30 jaar";\n} else if (edad > 10) {\n clase_edad = "Tussen 10 en 20 jaar";\n} else if (edad > 5) {\n clase_edad = "Tussen 5 en 10 jaar";\n} else {\n clase_edad = "Jonger dan 5 jaar";\n}\nreturn 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>
Het resultaat is een tekst die de leeftijd beschrijft, waarvoor we representatieve symbolen kunnen definiëren (hier met behulp van de Firefly-symbolen):

Geen opvallende symbolen voor de andere twee polygoonlagen om te voorkomen dat de aandacht wordt afgeleid van de hydranten.
We willen in het pop-upvenster van elke hydrant graag de lijst tonen van alle onderhoud dat aan de hydrant is uitgevoerd. Zowel de onderhoudsgeschiedenistabel als de hydrantlaag bevatten het ID van de hydrant. De tabel bevat ook de data en het type onderhoud.
In de configuratie van de pop-up van de hydranten kunnen we een Arcade-expressie toevoegen zoals deze:
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 + " Onderhoud(s):";
<SPAN class="keyword token">voor</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="keyword token">var</SPAN> mantenimiento <SPAN class="keyword token">in</SPAN> mantenimientos<SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">{</SPAN>
<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>
<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>
historia <SPAN class="operator token">+=</SPAN> TextFormatting<SPAN class="punctuation token">.</SPAN>NewLine <SPAN class="operator token">+</SPAN> txt_man<SPAN class="punctuation token">;</SPAN>
<span class="punctuation token">}</span>
<span class="punctuation token">}</span> <span class="keyword token">anders</span> <span class="punctuation token">{</span>
historia <span class="operator token">=</span> <span class="string token">"Geen onderhoud"</span><span class="punctuation token">;</span>
<span class="punctuation token">}</span>
<span class="keyword token">return</span> historia<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></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span>Eerst openen we de tabel met de onderhoudsgeschiedenis en wijzen deze toe aan een variabele tbl. Vervolgens lezen we de id van de huidige brandkraan waarvoor we de pop-up willen maken. We definiëren een SQL-expressie met behulp van de hydrant ID die vervolgens wordt gebruikt om de geschiedenis tabel te filteren. Het resultaat wordt opgeslagen in een variabele genaamd mantenimientos. We kunnen een Count doen om het aantal onderhoudsbeurten aan de brandkraan te verkrijgen. Als de count (cnt) groter is dan 0, beginnen we met het uitlezen van de details en construeren we een lijst van onderhoud inclusief de datum en het type onderhoud.
Het resultaat zal er zo uitzien nadat we een eenvoudige aangepaste html hebben geconfigureerd om de attributen en het resultaat van de Arcade-expressie in de pop-up te tonen:

Laten we nu verder gaan met het gebruiken van deze nieuwe Arcade-functies om wat data over brandkranen op subsectorniveau te krijgen. Aangezien het aantal onderhoudsbeurten uiteraard afhangt van de leeftijd van de brandkraan, zou het fijn zijn om hier wat details over te krijgen op subsectorniveau.
In de pop-up configuratie van de sub sectoren kunnen we de volgende Arcade-expressie toevoegen:
<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">voor</SPAn>( <SPAn class="keyword token">var</SPAn> hidrante <SPAn class="keyword token">in</SPAn> hidrantes ) {
<SPAn class="keyword token">var</SPAn> edad <SPAn class="operator token">=</SPAn> <SPAn class="token function">DateDiff</SPAn>( <SPAn class="token function">Now</SPAn>( ), hidrante.FECHAINSTALACION , "years" ) ;
edad_tot += edad ;
}
<SPAn class="keyword token">var</SPAn> resultado <SPAn class="operator token">=</SPAn> "" ;
<SPAn class="keyword token">als</SPAn>( cnt > 0 ) {
<SPAn class="keyword token">var</SPAn> edad_media <SPAn class="operator token">=</SPAn> edad_tot / cnt ;
resultado = "Er zijn " + cnt + " brandkranen in de sub sector" ;
resultado += TextFormatting.NewLine + "De gemiddelde leeftijd van de brandkranen is " + Round( edad_media , 2 ) + " jaar" ;
} anders {
resultado = "Er zijn geen brandkranen in de sub sector" ;
}
<span class='keyword'>return</span> resultado;<br>
<spanclass='line-numbers-rows'><spanspan><<EMOJI_19>></spanspan><<EMOJI_20>><<EMOJI_21>><<EMOJI_22>><<EMOJI_23>><<EMOJI_24>><<EMOJI_25>><<EMOJI_26>><<EMOJI_27>><<EMOJI_28>><<EMOJI_29>><<EMOJI_30>><<EMOJI_31>><<EMOJI_32>><<EMOJI_33>><<EMOJI_34>><<EMOJI_35>><<EMOJI_36>><<EMOJI_37>><<EMOJI_38>></spanspan></PRE><P></P><P>DDeze expressie zal:<br><ul><li>Aanroepen van de laag Hydrants<br><li>EEN intersect uitvoeren met het huidige sub sector object<br><li>Tellen hoeveel brandkranen er in de sub sector zijn<br><li>Berekent voor elke brandkraan de leeftijd en telt alle leeftijden op<br><li>Berekent de gemiddelde leeftijd van de brandkranen en formatteert de tekst met deze informatie<br><ul><P></P><P></P><P>PHet resultaat zal er zo uitzien:<br><P></P><P> <img alt='' src='https://us.v-cdn.net/6038851/uploads/legacyfs/online/431475_pastedImage_15.png' /></p><P>PIn dit geval zijn er 93 brandkranen in de sub sector en is de gemiddelde leeftijd 20,64 jaar.<br><P>PDit is leuk, maar kunnen we ook de namen tonen van de sub sectoren die worden omvat door een hydraulische sector met behulp van deze nieuwe Arcade functies? Het antwoord is ja. Laten we volgende expressie toevoegen aan hydraulische sectoren:<br><P></P><P> <pre style='white-space: pre-wrap;'>var fs = FeatureSetByName($datastore, "Sub Sector");
var subsectores = Intersects(fs, $feature);
var cnt = Count(subsectores);
var resultado = "Lijst van de " + cnt + " Subsectoren:";
<span> class="keyword token">voor<\/SPAN> <SPAN class="punctuation token">(<\/SPAN><SPAN class="keyword token">var<\/SPAN> subsector <SPAN class="keyword token">in<\/SPAN> subsectores<SPAN class="punctuation token">)<\/SPAN> <SPAN class="punctuation token">{<\/SPAN>
resultaat <SPAN class="operator token">+<\/SPAN><SPAN class="operator token">=<\/SPAN> TextFormatting<SPAN class="punctuation token">.<\/SPAN>NewLine <SPAN class="operator token">+<\/SPAN> subsector<SPAN class="punctuation token">.<\/SPAN>IDSAP<SPAN class="punctuation token">;<\/SPAN>
<SPAN class="punctuation token">}<\/SPAN>
<SPAN class="keyword token">return<\/SPAN> resultaat<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>Toegang krijgen tot de sub sectoren laag en Intersect met het huidige hydraulische sector en voila, toch? Nee, niet zo juist. Wanneer je een Intersect gebruikt tussen twee polygonen lagen, zal het waarschijnlijk te veel features teruggeven vanwege het feit dat wanneer twee polygonen een overeenkomende grens hebben, ze waarschijnlijk in het resultaat worden opgenomen, wat leidt tot meer sub sectoren dan we willen.<\/P><P><\/P><P>Een manier om dit te vermijden is door een kleine negatieve buffer te gebruiken op de hydraulische sector en de Intersect uit te voeren met die gebufferde geometrie zoals dit:<\/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> resultaat = "Listado de los " + cnt + " Subsectores:";
<span class="keyword token">voor</span> (<span class="keyword token">var</span> subsector <span class="keyword token">in</span> subsectores) {
resultaat += TextFormatting.NewLine + subsector.IDSAP;
}
<span class="keyword token">return</span> resultaat;
<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>
Let op de Buffer met een negatieve afstand die wordt gemaakt op regel 2 en gebruikt op regel 3 om de juiste polygonen te krijgen.
De resulterende pop-up zal er zo uitzien:

Eerlijk gezegd vind ik de ongesorteerde lijst van sub sectoren niet leuk, dus laten we deze lijst ordenen met behulp van OrderBy:
var fs = FeatureSetByName($datastore, "Sub Sector");
var feature_buf = Buffer($feature, -100, 'meters');
var subsectores = OrderBy(Intersects(fs, feature_buf), 'IDSAP ASC');
var cnt = Count(subsectores);
var resultaat = "Listado de los " + cnt + " Subsectores:";
voor (var subsector in subsectores) {
resultaat += TextFormatting.NewLine + subsector.IDSAP;
}
return resultaat;
<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>
Wat zal resulteren in een gesorteerde lijst van sub sectoren:

Ik hoop dat deze voorbeelden je zullen helpen te begrijpen wat mogelijk is met Arcade met de laatste update in ArcGIS Online, maar voordat je erin duikt en begint met het maken van fantastische Arcade expressies wil ik even Uncle Ben (Spider-Man) citeren:
Met grote kracht komt grote verantwoordelijkheid...
Zoals Paul Barker vermeldt in zijn blog, wees voorzichtig en valideer altijd dat de prestaties van je expressies resulteren in een acceptabele reactietijd voor je eindgebruiker.