<\/HEAD>
Heute wurde ein großartiger Blog von Paul Barker<\/A> zu den neuen FeatureSet-Funktionen gepostet: Was ist neu bei Arcade: Ein Spaziergang durch FeatureSets (Teil 1)<\/A> und auch Kelly Gerrow<\/A> hat ein großartiges Dokument zu diesem Thema geteilt: 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>
Ich wollte nicht zurückbleiben, also dachte ich, ich teile einige Beispiele mit Hydranten, der Wartungshistorie sowie Untersektoren und hydraulischen Sektoren, um zu zeigen, was man mit den neuen Arcade-Funktionen erreichen kann, die am 5. Dezember in ArcGIS Online veröffentlicht wurden.<\/P>
<\/P>
Angenommen, wir haben eine Webkarte mit mehreren Layern und einer Tabelle:<\/P>
<\/P>
<\/P>
- Hidrantes<\/EM> ist ein Punkt-Layer mit Hydranten<\/LI>Sub Sector<\/EM> ist ein Polygon-Layer mit einer Unterteilung des Interessengebiets<\/LI>Sector Hidraulico<\/EM> ist ein Polygon-Layer, der Untersektoren zu hydraulischen Sektoren zusammenfasst<\/LI>Hist Mantenimiento<\/EM> ist eine Tabelle mit den historischen Wartungsaufzeichnungen für jeden Hydranten<\/LI><\/UL><\/P>Zunächst wenden wir etwas Arcade an, um die Hydranten basierend auf ihrem Alter zu visualisieren. Dies war bereits in der vorherigen Version möglich, also hier noch nichts Neues. Wir haben das Installationsdatum im Feld FECHAINSTALACION gespeichert und können die Funktionen DateDiff<\/EM> und Now<\/EM> verwenden, um das Alter in Jahren zu bestimmen, was in den ersten beiden Zeilen geschieht. Danach klassifizieren wir den Wert in bedeutende Bereiche:<\/P>
<SPAN class="keyword token">var<\/SPAN> fecha_inst <SPAN class="operator token">=<\/><SPAN class="punctuation token">$feature.<\/><SPAN class="punctuation token">FECHAINSTALACION;<\/><\/>\n<SPAN class="keyword token">var<\/> edad <SPAN class="operator token">=<\/> DateDiff(Now(), fecha_inst, "years");\n<SPAN class="keyword token">var<\/> clase_edad <SPAN class="operator token">=<\/> "";\nif (edad > 50) {\n clase_edad = "Älter als 50 Jahre";\n} else if (edad > 40) {\n clase_edad = "Zwischen 40 und 50 Jahren";\n} else if (edad > 30) {\n clase_edad = "Zwischen 30 und 40 Jahren";\n} else if (edad > 20) {\n clase_edad = "Zwischen 20 und 30 Jahren";\n} else if (edad > 10) {\n clase_edad = "Zwischen 10 und 20 Jahren";\n} else if (edad > 5) {\n clase_edad = "Zwischen 5 und 10 Jahren";\n} else {\n clase_edad = "Jünger als 5 Jahre";\n}\nreturn clase_edad;\n\n<\/P>Das Ergebnis ist ein Text, der das Alter beschreibt, für den wir repräsentative Symbole definieren können (hier unter Verwendung der Firefly-Symbole):<\/P>
<\/P><\/P>Für die anderen beiden Polygon-Layer verwenden wir keine auffälligen Symbole, um nicht von den Hydranten abzulenken.<\/P><\/P>Wir möchten im Pop-up-Fenster jedes Hydranten die Liste aller durchgeführten Wartungen anzeigen. Sowohl die Wartungshistorientabelle als auch der Hydranten-Layer enthalten die ID des Hydranten. Die Tabelle enthält außerdem die Daten und Art der Wartung.<\/P><\/P>In der Konfiguration des Pop-ups der Hydranten können wir einen Arcade-Ausdruck wie diesen hinzufügen:<\/P>var tbl = FeatureSetByName($datastore,"Hist_Mantenimiento");\nvar codigo = $feature["COD_HIDRANTE"];\nvar sql = "COD_HIDRANTE = '" + codigo + "'";\nConsole(sql);\nvar mantenimientos = Filter(tbl, sql);\nvar cnt = Count(mantenimientos);\nvar historia = "";\nif (cnt > 0) {\n historia = cnt + " Wartung(en):";\n <SPAN class="keyword token">für</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/TT) '</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">sonst</span> <span class="punctuation token">{</span>
historia <span class="operator token">=</span> <span class="string token">"Keine Wartungen vorhanden"</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>Zunächst greifen wir auf die Tabelle mit der Wartungshistorie zu und weisen sie einer Variablen tbl zu. Dann lesen wir die ID des aktuellen Hydranten aus, für den wir das Pop-up erstellen möchten. Wir definieren einen SQL-Ausdruck unter Verwendung der Hydranten-ID, der dann verwendet wird, um die Historientabelle zu filtern. Das Ergebnis wird in einer Variablen namens mantenimientos gespeichert. Wir können eine Zählung durchführen, um die Anzahl der durchgeführten Wartungen am Hydranten zu erhalten. Wenn die Anzahl (cnt) größer als 0 ist, beginnen wir mit dem Auslesen der Details und erstellen eine Liste der Wartungen einschließlich Datum und Art der Wartung.
Das Ergebnis sieht nach der Konfiguration eines einfachen benutzerdefinierten HTMLs zur Anzeige der Attribute und des Ergebnisses des Arcade-Ausdrucks im Pop-up folgendermaßen aus:

Kommen wir nun dazu, mit diesen neuen Arcade-Funktionen etwas zu machen, um einige Daten über Hydranten auf Subsektorebene zu erhalten. Da die Anzahl der Wartungen offensichtlich vom Alter des Hydranten abhängt, wäre es schön, einige Details dazu auf Subsektorebene zu erhalten.
In der Pop-up-Konfiguration der Subsektoren können wir den folgenden Arcade-Ausdruck hinzufügen:
<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">für</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">wenn</SPAn>( cnt > 0 ) {
<SPAn class="keyword token">var</SPAn> edad_media <SPAn class="operator token">=</SPAn> edad_tot / cnt ;
resultado = "Es gibt " + cnt + " Hydranten im Subsektor" ;
resultado += TextFormatting.NewLine + "Das Durchschnittsalter der Hydranten beträgt " + Round( edad_media , 2 ) + " Jahre" ;
} sonst {
resultado = "Es gibt keine Hydranten im Subsektor" ;
}
<SPAn class="keyword token">return</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><<EMOJI_26>></spAN><spAN><<EMOJI_27>></spAN><spAN><<EMOJI_28>></spAN><spAN><<EMOJI_29>></spAN><spAN><<EMOJI_30>></spAN><spAN><<EMOJI_31>></spAN><spAN><<EMOJI_32>></spAN><spAN><<EMOJI_33>></spAN><spAN><<EMOJI_34>></spAN><spAN><<EMOJI_35>></spAN><spAN><<EMOJI_36>></spAN><spAN><<EMOJI_37>></spAN><spAN><<EMOJI_38>></spAN></span>
Druckt folgendes aus:
- Zugriff auf die Ebene Hydrants layer
- Macht eine Schnittmenge mit dem aktuellen Subsektor-Feature
- Zählt die Anzahl der Hydranten im Subsektor
- Berechnet das Alter für jeden Hydranten und summiert alle Alter
- Berechnet das Durchschnittsalter der Hydranten und formatiert den Text mit diesen Informationen
Das Ergebnis sieht so aus:

An diesem Beispiel gibt es 93 Hydranten im Subsektor und das Durchschnittsalter beträgt 20,64 Jahre.
Das macht Spaß, aber können wir auch die Namen der Subsektoren anzeigen, die von einem hydraulischen Sektor mit diesen neuen Arcade-Funktionen enthalten sind? Die Antwort ist ja. Fügen wir den folgenden Ausdruck zu den hydraulischen Sektoren hinzu:
<span class='keyword'>var</span> fs = FeatureSetByName($datastore,"Sub Sector");
<span class='keyword'>var</span> subsectores = Intersects(fs,$feature);
<span class='keyword'>var</span> cnt = Count(subsectores);
<span class='keyword'>var</span > resultado = "Liste der " + cnt + " Subsektoren:";
<span class="keyword token">for<\/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>
resultado <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> resultado<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>Zugriff einfach auf die Sub Sectors-Ebene und Schnittmenge mit dem aktuellen hydraulischen Sektor und voilà, richtig? Nein, nicht ganz richtig. Wenn Sie eine Schnittmenge zwischen zwei Polygon-Ebenen verwenden, wird wahrscheinlich zu viele Features zurückgegeben, da wenn zwei Polygone eine gemeinsame Grenze haben, diese wahrscheinlich im Ergebnis enthalten sind, was zu mehr Sub Sectors führt als gewünscht.<\/P><P><\/P><P>Eine Möglichkeit, dies zu vermeiden, besteht darin, einen kleinen negativen Puffer auf den hydraulischen Sektor anzuwenden und die Schnittmenge mit dieser gepufferten Geometrie wie folgt durchzuführen:<\/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');
var subsectores = Intersects(fs, feature_buf);
var cnt = Count(subsectores);
var resultado = "Listado de los " + cnt + " Subsectores:";
for (var subsector in subsectores) {
resultado += TextFormatting.NewLine + subsector.IDSAP;
}
return resultado;
<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><<EMOJI_20>></span></span>
Achten Sie auf den Puffer mit negativem Abstand, der in Zeile 2 erstellt und in Zeile 3 verwendet wird, um die richtigen Polygone zu erhalten.<\/P>
Das resultierende Pop-up wird wie folgt angezeigt:<\/P>

Ehrlich gesagt mag ich die unsortierte Liste der Sub Sectors nicht, also sortieren wir diese Liste mit OrderBy<\/EM>:<\/P>
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 resultado = "Listado de los " + cnt + " Subsectores:";
for (var subsector in subsectores) {
resultado += TextFormatting.NewLine + subsector.IDSAP;
}
return resultado;
<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><<EMOJI_26>></span><span><<EMOJI_27>></span><span><<EMOJI_28>></span><span><<EMOJI_29>></span><span><<EMOJI_30>></span><span><<EMOJI_31>></span></span>
Was zu einer sortierten Liste von Sub Sectors führt:<\/P>

Ich hoffe, diese Beispiele helfen Ihnen zu verstehen, was mit Arcade und dem neuesten Update in ArcGIS Online möglich ist. Aber bevor Sie loslegen und großartige Arcade-Ausdrücke erstellen, möchte ich kurz Onkel Ben (Spider-Man) zitieren:<\/P>
Mit großer Macht kommt große Verantwortung...<\/EM>
Wie Paul Barker in seinem Blog erwähnt, seien Sie vorsichtig und validieren Sie stets, dass die Leistung Ihrer Ausdrücke eine akzeptable Reaktionszeit für Ihre Endbenutzer liefert.<\/>