<\/HEAD>
Aujourd'hui, un excellent blog a été publié par Paul Barker<\/A> sur les nouvelles fonctions FeatureSet : Quoi de neuf avec Arcade : Une promenade à travers FeatureSets (Partie 1)<\/A> et aussi Kelly Gerrow<\/A> a partagé un excellent document sur ce sujet : 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>
Je ne voulais pas rester à la traîne, alors j'ai pensé partager quelques exemples utilisant des hydrants, l'historique de maintenance ainsi que les sub sectors et hydraulic sectors pour montrer ce que vous pouvez réaliser avec les nouvelles fonctions Arcade publiées dans ArcGIS Online le 5 décembre.<\/P>
<\/P>
Considérons que nous avons une carte web avec plusieurs couches et une table :<\/P>
<\/P>
<\/P>
- Hidrantes<\/EM> est une couche ponctuelle avec des hydrants<\/LI>Sub Sector<\/EM> est une couche polygonale avec une subdivision de la zone d'intérêt<\/LI>Sector Hidraulico<\/EM> est une couche polygonale fusionnant les sub sectors en hydraulic sectors<\/LI>Hist Mantenimiento<\/EM> est une table contenant les enregistrements historiques de maintenance pour chaque hydrant<\/LI><\/UL><\/P>Tout d'abord, appliquons un peu d'Arcade pour visualiser les hydrants en fonction de leur âge. Cela était déjà possible dans la version précédente, donc rien de nouveau ici pour l'instant. Nous avons la date d'installation stockée dans le champ FECHAINSTALACION et nous pouvons utiliser les fonctions DateDiff<\/EM> et Now<\/EM> pour déterminer l'âge en années, ce qui se fait dans les deux premières lignes. Ensuite, nous classons la valeur en plages significatives :<\/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">edad > 50)<SPAn class="punctuation token">{</SPAn>
clase_edad = "Plus de 50 ans";
} else if (edad > 40) {
clase_edad = "Entre 40 et 50 ans";
} else if (edad > 30) {
clase_edad = "Entre 30 et 40 ans";
} else if (edad > 20) {
clase_edad = "Entre 20 et 30 ans";
} else if (edad > 10) {
clase_edad = "Entre 10 et 20 ans";
} else if (edad > 5) {
clase_edad = "Entre 5 et 10 ans";
} else {
clase_edad = "Moins de 5 ans";
}
return clase_edad;
<span class="line-numbers-rows"><span><<EMOJI_0>><span><<EMOJI_1>><span><<EMOJI_2>><span><<EMOJI_3>><span><<EMOJI_4>><span><<EMOJI_5>><span><<EMOJI_6>><span><<EMOJI_7>><span><<EMOJI_8>><span><<EMOJI_9>><span><<EMOJI_10>><span><<EMOJI_11>><span><<EMOJI_12>><span><<EMOJI_13>><span><<EMOJI_14>><span><<EMOJI_15>><span><<EMOJI_16>><span><<EMOJI_17>><span><<EMOJI_18>><span><<EMOJI_19>></span></PRE><P><\/P><P>Le résultat est un texte décrivant l'âge, pour lequel nous pouvons définir des symboles représentatifs (ici en utilisant les symboles 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>Aucun symbole fantaisie pour les deux autres couches polygonales afin d'éviter de détourner l'attention des hydrants.<\\/P><P><\\/P><P>Nous souhaitons afficher dans la fenêtre pop-up de chaque hydrant la liste de toutes les maintenances effectuées sur cet hydrant. La table historique de maintenance ainsi que la couche hydrant contiennent l'ID de l'hydrant. La table contient également les dates et types de maintenance.<\\/P><P><\\/P><P>Dans la configuration du pop-up des hydrants, nous pouvons ajouter une expression Arcade comme celle-ci :<\\/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 + " Maintenance(s) :";
<SPAN class="keyword token">pour</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="keyword token">var</SPAN> mantenimiento <SPAN class="keyword token">dans</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/JJ) '</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">sinon</span> <SPAN class="punctuation token">{</span>
historia <SPAN class="operator token">=</SPAN> <SPAN class="string token">"Pas de maintenances"</span><span class="punctuation token">;</span>
<span class="punctuation token">}</span>
<SPAN class="keyword token">retourner</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>
Tout d'abord, nous accédons à la table contenant l'historique des maintenances et l'assignons à une variable tbl. Ensuite, nous lisons l'id de l'hydrant actuel pour lequel nous voulons créer le pop-up. Nous définissons une expression SQL utilisant l'ID de l'hydrant qui est ensuite utilisée pour filtrer la table d'historique. Le résultat est stocké dans une variable appelée mantenimientos. Nous pouvons faire un Count pour obtenir le nombre de maintenances effectuées sur l'hydrant. Si le compte (cnt) est supérieur à 0, nous commençons à lire les détails et construisons une liste de maintenances incluant la date et le type de maintenance.
Le résultat apparaîtra ainsi après avoir configuré un simple html personnalisé pour afficher les attributs et le résultat de l'expression Arcade dans le pop-up :

Poursuivons maintenant avec ces nouvelles fonctions Arcade pour obtenir des données sur les hydrants au niveau du sous-secteur. Puisque le nombre de maintenances dépend évidemment de l'âge de l'hydrant, il serait intéressant d'obtenir quelques détails à ce sujet au niveau du sous-secteur.
Dans la configuration du pop-up des sous-secteurs, nous pouvons ajouter l'expression Arcade suivante :
<SPAn class="keyword token">var</SPAn> fs <SPAn class="operator token">=</SPAn> <SPAn class="token function">FeatureSetByName</SPAn>( $datastore , <SPAn class="string token">"Hidrantes"</SPAn>) ;
<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">pour</SPAn>( var hidrante <SPAn class="keyword token">dans</SPAn> hidrantes ) {
var edad = DateDiff( Now() , hidrante.FECHAINSTALACION , "years" ) ;
edad_tot += edad ;
}
var resultado = "" ;
if ( cnt > 0 ) {
var edad_media = edad_tot / cnt ;
resultado = "Il y a " + cnt + " hydrants dans le sous-secteur" ;
resultado += TextFormatting.NewLine + "L'âge moyen des hydrants est de " + Round( edad_media , 2 ) + " ans" ;
} else {
resultado = "Il n'y a pas d'hydrants dans le sous-secteur" ;
}
return resultado ;
<Spanclass=\"line-numbers-rows\"><Span></Span></Span></Span></Span></Span></Span></Span></Span></Span></Span></Span></Span></Span></Span></Span></Span></Span></Span></Span></Span>
Cette expression va : </P>
<ul>
<li>Accéder à la couche Hydrants </li>
<li>Etablir une intersection avec la géométrie du sous-secteur courant </li>
<li>Compter le nombre d'hydrants dans le sous-secteur </li>
<li>Calculer l'âge de chaque hydrant et sommer tous les âges </li>
<li>Calculer l'âge moyen des hydrants et formater le texte avec cette information </li>
</ul>
<p></p>
<p>Le résultat apparaîtra ainsi :</p>
<p><img src='https://us.v-cdn.net/6038851/uploads/legacyfs/online/431475_pastedImage_15.png' alt=''/></p>
<p>Cet exemple montre qu'il y a 93 hydrants dans le sous-secteur et que l'âge moyen est de 20,64 ans.</p>
<p>C'est amusant, mais peut-on aussi afficher les noms des sous-secteurs contenus dans un secteur hydraulique en utilisant ces nouvelles fonctions Arcade ? La réponse est oui. Ajoutons l'expression suivante aux secteurs hydrauliques :</p>
<pre class='lia-code-sample line-numbers language-none'><code>
var fs = FeatureSetByName($datastore, "Sub Sector");
var subsectores = Intersects(fs, $feature);
var cnt = Count(subsectores);
var resultado = "Liste des " + cnt + " Sous-secteurs :";
<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>\n 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>\n<SPAN class="punctuation token">}<\/SPAN>\n\n<SPAN class="keyword token">return<\/SPAN> resultado<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><\/CODE><\/PRE><P><\/P><P>Accédez simplement à la couche des sub sectors et faites un Intersect avec le secteur hydraulique actuel et voilà..., n'est-ce pas ? Non, pas si simple. Lorsque vous utilisez un Intersect entre deux couches de polygones, il retournera probablement trop d'entités car lorsque deux polygones ont une frontière commune, ils seront probablement inclus dans le résultat, ce qui conduit à plus de sub sectors que souhaité.<\/P><P><\/P><P>Une façon d'éviter cela est d'utiliser un petit buffer négatif sur le secteur hydraulique et de faire l'Intersect avec cette géométrie tamponnée comme ceci :<\/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>\n<SPAN class="keyword token">var<\/SPAN> feature_buf <SPAN class="operator token">=<\/SPAN> <SPAN class="token function">Buffer<\/Span>(<$feature>, -100, 'meters');\nvar subsectores = Intersects(fs, feature_buf);\nvar cnt = Count(subsectores);\n\nvar resultado = "Listado de los " + cnt + " Subsectores:";\nfor (var subsector in subsectores) {\n resultado += TextFormatting.NewLine + subsector.IDSAP;\n}\n\nreturn resultado;\n<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>Remarquez le Buffer avec une distance négative qui est créé à la ligne 2 et utilisé à la ligne 3 pour obtenir les polygones corrects.<\/P>
Le pop-up résultant s'affichera ainsi :<\/P>

Pour être honnête, je n'aime pas la liste non triée des sub sectors, alors ordonnons cette liste en utilisant OrderBy<\/EM>:<\/P>var fs = FeatureSetByName($datastore,"Sub Sector");\nvar feature_buf = Buffer($feature, -100, 'meters');\nvar subsectores = OrderBy(Intersects(fs, feature_buf), 'IDSAP ASC');\nvar cnt = Count(subsectores);\n\nvar resultado = "Listado de los " + cnt + " Subsectores:";\nfor (var subsector in subsectores) {\n resultado += TextFormatting.NewLine + subsector.IDSAP;\n}\n\nreturn resultado;\n<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>
Cela donnera une liste triée des sub sectors :<\/P>

J'espère que ces exemples vous aideront à comprendre ce qui est possible avec Arcade grâce à la dernière mise à jour d'ArcGIS Online, mais avant que vous ne commenciez à créer des expressions Arcade fabuleuses, je veux citer Oncle Ben (Spider-Man) un instant :<\/P>
Un grand pouvoir implique de grandes responsabilités...<\/EM>
Comme le mentionne Paul Barker dans son blog, soyez prudent et validez toujours que les performances de vos expressions offrent un temps de réponse acceptable pour votre utilisateur final.<\/P>