<\/HEAD>
本日、Paul Barker<\/A>による新しいFeatureSet関数に関する素晴らしいブログが投稿されました: Arcadeの新機能:FeatureSetsを散策(パート1)<\/A> また、Kelly Gerrow<\/A>もこのトピックに関する素晴らしいドキュメントを共有しました: 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>
取り残されたくなかったので、消火栓、メンテナンス履歴、サブセクターおよびハイドローリックセクターを使用して、2023年12月5日にArcGIS Onlineでリリースされた新しいArcade関数で何ができるかを示すいくつかの例を共有しようと思いました。<\/P>
<\/P>
複数のレイヤーとテーブルを含むWebマップがあると仮定します:<\/P>
<\/P>
<\/P>
- Hidrantes<\EM>は消火栓のポイントレイヤーです<\LI>Sub Sector<\EM>は対象エリアのサブディビジョンを示すポリゴンレイヤーです<\LI>Sector Hidraulico<\EM>はサブセクターを統合してハイドローリックセクターにしたポリゴンレイヤーです<\LI>Hist Mantenimiento<\EM>は各消火栓の過去のメンテナンス記録を含むテーブルです<\LI><\UL><\P>まず最初に、消火栓の設置年数に基づいて視覚化するためにArcadeを適用しましょう。これは前回のリリースでも可能でしたので、新しいことはまだありません。設置日がFECHAINSTALACIONフィールドに保存されており、DateDiff<\EM>とNow<\EM>関数を使って年数で年齢を計算できます。これは最初の2行で行われています。その後、この値を重要な範囲に分類します:<\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>( ) , fecha_inst, "years") ;
var clase_edad = "";
if (edad > 50) {
clase_edad = "50年以上";
} else if (edad > 40) {
clase_edad = "40〜50年";
} else if (edad > 30) {
clase_edad = "30〜40年";
} else if (edad > 20) {
clase_edad = "20〜30年";
} else if (edad > 10) {
clase_edad = "10〜20年";
} else if (edad > 5) {
clase_edad = "5〜10年";
} else {
clase_edad = "5年未満";
}
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></SPAN>
結果は年齢を表すテキストであり、それに対して代表的なシンボル(ここではFireflyシンボル)を定義できます:

他の2つのポリゴンレイヤーには派手なシンボルは使わず、消火栓から注意をそらさないようにしています。
各消火栓のポップアップウィンドウには、その消火栓で実施されたすべてのメンテナンスの一覧を表示したいと思います。メンテナンス履歴テーブルと消火栓レイヤーの両方に消火栓IDが含まれています。テーブルにはメンテナンスの日付と種類も含まれています。
消火栓のポップアップ設定では、次のようなArcade式を追加できます:
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 + " メンテナンス(s):";
<SPAN class="keyword token">for</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">else</span> <span class="punctuation token">{</span>
historia <span class="operator token">=</span> <span class="string token">"No hay mantenimientos"</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>まず最初に、メンテナンス履歴のテーブルにアクセスし、それを変数 tbl に割り当てます。次に、ポップアップを作成したい現在の消火栓のIDを読み取ります。消火栓IDを使用してSQL式を定義し、それを履歴テーブルのフィルタリングに使用します。結果は mantenimientos という変数に格納されます。Count を使って消火栓で行われたメンテナンスの数を取得できます。カウント (cnt) が0より大きければ、詳細を読み取り始め、日付とメンテナンスの種類を含むメンテナンスリストを構築します。
結果は、ポップアップで属性とArcade式の結果を表示するために簡単なカスタムHTMLを設定した後、次のように表示されます:

次に、これらの新しいArcade関数を使ってサブセクター単位で消火栓のデータを取得することを続けましょう。メンテナンスの回数は明らかに消火栓の年齢に依存するため、サブセクター単位でこの詳細情報を得ると良いでしょう。
サブセクターのポップアップ設定には以下のArcade式を追加できます:
<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">for</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">if</SPAn>( cnt > 0 ) {
<SPAn class="keyword token">var</SPAn> edad_media = edad_tot / cnt ;
resultado = "Hay " + cnt + " hidrantes en el sub sector" ;
resultado += TextFormatting.NewLine + "La edad media de los hidrantes es de " + Round(edad_media, 2) + " años" ;
} else {
resultado = "No hay hidrantes en el sub sector" ;
}
return 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></PRE>
<P></P>
<Pこの式は以下のことを行います:</P>
<ul>
<liHydrantsレイヤーにアクセスすること<li現在のサブセクターフィーチャーと交差すること<liサブセクター内の消火栓数をカウントすること<li各消火栓の年齢を計算し、すべての年齢を合計すること<li消火栓の平均年齢を計算し、この情報でテキストをフォーマットすること
<ul>
<P></P>
<P結果は次のように表示されます:</P>
<P<img src='https://us.v-cdn.net/6038851/uploads/legacyfs/online/431475_pastedImage_15.png' alt='' /></P>
<P></P>
<Pこの場合、サブセクターには93個の消火栓があり、平均年齢は20.64歳です。</P>
<P></P>
<Pこれは面白いですが、新しいArcade関数を使って水圧区画に含まれるサブセクター名も表示できますか?答えはイエスです。水圧区画に以下の式を追加しましょう:</P>
<PREclass='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 = "Listado de los " + cnt + " Subsectores:";
<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>単にサブセクターのレイヤーにアクセスして、現在のhydraulic sectorとIntersectすれば、はい出来上がり…ですよね?いいえ、そう簡単ではありません。2つのポリゴンレイヤー間でIntersectを使用すると、2つのポリゴンが境界を共有している場合、それらも結果に含まれる可能性が高いため、望むよりも多くのsub sectorsが返されることがあります。<\/P><P><\/P><P>これを避ける方法の一つは、hydraulic sectorに小さな負のバッファをかけ、そのバッファされたジオメトリとIntersectを行うことです。以下のように:<\/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> 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>
2行目で作成され、3行目でrights polygonsを取得するために使用されている負の距離のBufferに注目してください。
結果として表示されるポップアップは次のようになります:

正直なところ、私はソートされていないsub sectorsのリストが好きではないので、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 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>
これにより、ソートされたsub sectorsのリストが得られます:

これらの例がArcGIS Onlineの最新アップデートでArcadeを使って何が可能か理解する助けになれば幸いですが、素晴らしいArcade式を作成し始める前に、少しだけUncle Ben(スパイダーマン)の言葉を引用したいと思います:
大いなる力には大いなる責任が伴う...
AESRIコミュニティのPaul Barkerさんがブログで述べているように、注意深く行い、常に式のパフォーマンスがエンドユーザーにとって許容できる応答時間内であることを検証してください。