ArcGIS Arcade を使用して別のレイヤーの属性にアクセス
設定
最初に、Map Viewer で Web マップを設定し、新しい Arcade 式を追加します。 既存の Web マップを使用して作業を開始します。既存の Web マップには、データ レイヤーと Arcade 式がすでに含まれています。 そのマップを ArcGIS Online アカウントにコピーして編集してから、新しいエレメントを追加します。
- Global Power Generation and Consumption Web マップを Web ブラウザーで開きます。
[凡例] ウィンドウが開いた状態で、マップが Map Viewer に表示されます。
[凡例] ウィンドウには 2 つのレイヤーが表示されます。
- [Global Power Plants] には、世界中の発電所の包括的な目録が含まれています。
- [World Countries Electricity Consumption] レイヤーには、世界各国の人口と電力消費量に関する情報が含まれています。
注意:
「はじめての ArcGIS Arcade」チュートリアルを完了している場合は、そのチュートリアルで作成したマップを代わりに使用できます。
- [サイン イン] ボタンをクリックします。
- 「ArcGIS の組織アカウント」にサイン インします。
注意:
組織アカウントがない場合は、ソフトウェア アクセスのオプションをご参照ください。
- [コンテンツ] (暗い背景の) ツールバーで、[保存と開く] をクリックしてから [名前を付けて保存] を選択します。
- [マップの保存] ウィンドウの [タイトル] で、タイトルの末尾に自分のイニシャルを追加して、必ず組織内で一意のタイトルになるようにし、[保存] をクリックします。
マップのコピーが表示され、編集できる状態になっています。 次に、新しい Arcade 式を [Global Power Plants] レイヤーのポップアップに使用するため、マップに追加します。
注意:
ArcGIS Arcade は、ArcGIS のデータを動的に処理するよう記述される、移植可能で軽量かつ安全な式言語です。 他のプログラミング言語と同様に、数学演算を実行し、テキストを操作し、論理ステートメントを評価することができます。 これにより、ユーザーは ArcGIS Pro、ArcGIS Runtime、ArcGIS Online、ArcGIS Enterprise、および ArcGIS API for JavaScript でカスタム式を作成、共有、実行して、既存のデータを操作したり、新たな見識を得たりすることができます。 Map Viewer では、ポップアップやラベルのデータを処理する際、およびレイヤーをスタイル設定する際に、Arcade が役に立ちます。 Arcade のその他のチュートリアルについては、この「Arcade 学習コース」をご参照ください。
- [コンテンツ] ツールバーの [レイヤー] をクリックします。
注意:
デフォルトでは、サイド ツールバーには、ツールの名前ではなく、ツール アイコンのみが表示されます。 名称を確認するには、各ツールバー下部の展開ボタンをクリックします。 チュートリアルの画像は、ツールバーが展開された状態です。
[レイヤー] ウィンドウが表示されます。
- [レイヤー] ウィンドウで、[Global Power Plants] レイヤーをクリックして選択します。
- [設定] (明るい背景の) ツールバーの [ポップアップ] をクリックします。
[ポップアップ] ウィンドウとポップアップのプレビューが表示されます。
これは SMN Barka 発電所 (サウジアラビア) のポップアップです。 このポップアップには、この特定の発電所に関して役立つ情報がすでに含まれています。 このチュートリアルで作成する Arcade 式により、ポップアップにテキストの段落がもう 1 つ追加されます。
- ポップアップを閉じます。
注意:
または、マップのいずれかの発電所のポップアップを開くこともできます。 マップ上で、マウスのホイール ボタンを使用して、たとえばスペインのセビージャなど、関心のある地域を拡大表示します。 次に発電所ポイントの 1 つをクリックします。
- [ポップアップ] ウィンドウで [属性式] をクリックします。
注意:
[Global Power Plants] レイヤーのポップアップには、すでに 2 つの式があります。 これらの式により、エネルギーの種類を示すテキストの色が決まり、発電所が電力を供給できる 60 ワットの電球の数が算出されます。いずれも、発電所の現時点のポップアップに表示されています。 Arcade では、これらの既存の式のすべてまたは一部を、新しい式で再利用できます。 その方法が、このチュートリアルで学ぶ項目の 1 つです。
[属性式] ウィンドウが表示されます。
- [属性式] ウィンドウで、[式の追加] をクリックし、Arcade 式エディターを開きます。
Arcade 式エディターが表示されます。 このエディターで、Arcade 式を作成および編集します。 最初にエディターの構成要素を確認します。
- [式] ウィンドウは、コードを記述する場所です。
- プロファイル変数タブには、レイヤー フィーチャの属性フィールドやジオメトリなど、あらかじめ定義された変数が一覧表示されています。
- 関数タブには、すべての Arcade 関数が一覧表示されています。 各関数の右にある情報ボタンをクリックして、その関数のパラメーター、構文、および使用方法に関する統合ヘルプにアクセスすることができます。
- [候補] タブでは、事前に定義された変数のリストから、レイヤーのフィーチャの属性およびジオメトリにアクセスできます。 また、Web マップの他のレイヤーのフィーチャにもアクセスできます。その操作は、このチュートリアルの後半で行います。
- ヘルプ タブに Arcade のヘルプ Web ページが開きます。
Arcade 式エディターでは、[実行] ボタンを使用して、式の開発中に式をテストすることもできます。
- [実行] をクリックします。
[出力] タブ、[コンソール] タブ、[ログ] タブが表示されます。 式を作成したら、[実行] ボタンを使用して、式の出力をテストすることができます。 この時点では、Arcade コードをまだ作成していないので、これらのタブにはあまり多くのデータが含まれていません。
- [出力] タブには、式の出力が表示されます。
- また、コードに [Console()] 関数を追加して、[コンソール] タブに値を表示することもできます。
変数の初期化
続いて、Arcade 式のコードの記述を開始します。 コードの記述は、3 つの部分で構成されます。
- 最初に、Arcade 式でこの後必要になる値を代入する、複数の変数を初期化 (作成) します。
- 次に、World Countries Electricity Consumption レイヤーから FeatureSet を作成し、式でそのレイヤーの属性を使用できるようにします。
- 最後に、そのデータをすべて使用して新しい情報を生成し、各発電所が電力を供給できる市民の数を算出します。
このセクションでは、主に変数の初期化とテストについて学びます。
- [式] ウィンドウに、「var countryName =」と入力します (またはコピーして貼り付けます)。
1 つ目の変数として [countryName] を作成します。この変数には、発電所が所在する国の名前が格納されます。 Arcade で、[Var <variableName> = <someValue>] という構文を使用して、式でこの後使用する変数を設定します。[Global Power Plants] レイヤーで対応する属性を取得して、変数の値を指定します。
- 必要に応じて、[プロファイル変数] タブをクリックします。 矢印をクリックして [$feature] アイテムを展開します。
[Global Power Plants] レイヤーの属性のリストが表示されます。
注意:
先に説明したように、Arcade 式は、ユーザーがマップ上の特定の発電所をクリックしたときに実行され、そのフィーチャの情報を提供するポップアップが表示されます。 $feature アイテムにより、[Global Power Plants] レイヤーのその発電所フィーチャに固有のデータにアクセスできます。 このデータには、フィーチャのすべての属性とジオメトリが含まれています。
このアイテムは、1 つのフィーチャではなくレイヤー内のすべてのフィーチャにアクセスする $layer とは異なります。 $layer を使用すると、たとえばフィーチャ レイヤーの全フィーチャの属性値の平均を取得することができます。
- 属性リストを下にスクロールし、$feature.country_long をクリックします。
コードの 1 行目が完成しました。
式には、発電所の名前と年間推定発電量を格納する変数も必要です。 2 つの変数を最初から作成する代わりに、既存の Arcade 式の 1 つから既存のコードをコピーします。
- Enter キーを押して、式の次の行を開始します。
- 以下の 2 行のコードをハイライト表示し、Ctrl + C キーを押してコピーします。
var plantName = $feature.name
var annualGenerationGwh = $feature["estimated_generation_gwh"]
注意:
ハイライト表示されたテキストを右クリックして [コピー] を選択して、それらの行をコピーできます。
- [式] ウィンドウで Ctrl + V キーを押してコードを貼り付けます。 行 3 をクリックし、Backspace キーを押します。
注意:
挿入ポイントを右クリックして [Paste] を選択しても、それらの行を貼り付けられます。
続いてこれらの変数ステートメントをテストして、適切に機能することを確認します。 そのために、コードの末尾に return ステートメントを追加して、1 つ目の変数から開始します。
- 行 3 の末尾をクリックし、Enter キーを押してコードの次の行を開始し、「return countryName」と入力します。 [実行] をクリックします。
[出力] ウィンドウに、スクリプトの最終出力が表示されます。 return ステートメントの値が出力され、[Afghanistan] と表示されます。
これは、テストの目的で、式エディターが属性テーブルの最初のフィーチャを使用するからです。 このレッスンでは、最初のフィーチャはアフガニスタンの発電所です。 続いて 2 つ目の変数の値をテストします。
- [式] ウィンドウで、スクリプトの最終行を return plantName と編集します。 [実行] をクリックします。
[出力] ウィンドウに Kajaki Hydroelectric Power Plant Afghanistan という値が表示されます。これは、同じデフォルトのアフガニスタンの発電所の名前です。
続いて 3 つ目の変数の値をテストします。
- [式] ウィンドウで、この行を再び編集して return annualGenerationGwh にし、[実行] をクリックします。
[出力] ウィンドウに値は表示されず、結果として NULL が表示されます。
これは、デフォルトの発電所である Kajaki Hydroelectric Power Plant Afghanistan には年間推定発電量のデータがないからです。 そのような場合は、テストの目的で異なる値を手動で指定できます。
- 行 return annualGenerationGwh の上に、関数 annualGenerationGwh = 10 を追加して [実行] をクリックします。
[出力] ウィンドウで、値 [10] (ギガワット時または GWh) が返されます。 このテスト値は、このチュートリアルの以降のセクションで使用します。
- [式] ウィンドウで、この後必要のない return annualGenerationGwh の行を削除します。
さらに式の作成を進める前に、式に名前を付けて保存します。 作成する式に名前を付け、式を識別してマップで使用しやすくすることが重要です。
- エディター ウィンドウの上部で、[新しい式] をクリックしてハイライトし、テキストを削除します。 「Number of Citizens the Power Plant can Supply Annually」と入力します。
- エディター ウィンドウの下部で、[完了] をクリックし、式エディターを閉じます。
[属性式] ウィンドウに式が表示されます。
- [コンテンツ] ツールバーで [保存と開く] をクリックし、[保存] を選択してマップと Arcade 式を保存します。
注意:
Arcade 式とマップを定期的に保存することをおすすめします。
別のレイヤーからのデータ取得
[Global Power Plants] のポップアップに表示する、発電所が電力を供給できる市民の数を検索するには、その発電所の年間推定発電量を、発電所がある国の 1 人当たりの電力消費量で除算する必要があります。
前のセクションで 1 つ目の数値はすでに取得され、[annualGenerationGwh] 変数に格納されています。 2 つ目の数値は、[World Countries Electricity Consumption] レイヤーの人口および総電力消費量の属性から得ることができます。 つまり、[Global Power Plants] ポップアップの [World Countries Electricity Consumption] 属性にアクセスする必要があります。 そのために FeatureSet を作成します。
FeatureSet を使用すると、マップ内の任意のレイヤーのフィーチャまたはマップ外のフィーチャ サービスのフィーチャにアクセスできます。 続いて、関連性の条件に基づいて、アクセスしたフィーチャをフィルタリングできます。 今回は、[World Countries Electricity Consumption] フィーチャ (つまり属性を含む世界各国のリスト) にアクセスし、現在の発電所が所在する国を探します。 たとえば、Kajaki Hydroelectric Power Plant の場合、リストを単一の [Afghanistan] フィーチャに絞り込みます。 そうすると、一致する国名属性の値により、[Global Power Plants] フィーチャは関連する [World Countries Electricity Consumption] フィーチャに接続されます。 FeatureSets の詳細は、Arcade のドキュメントをご参照ください。
注意:
大量のデータを返すクエリは処理に時間がかかるため、FeatureSet は、より大規模なデータセットでは適切に機能しない場合があります。
次に、[FeatureSetByName] を使用して FeatureSet を作成します。
注意:
[FeatureSetByName] は、[FeatureSet] を作成するためのオプションの 1 つです。
- [属性式] ウィンドウで [Number of Citizens the Power Plant can Supply Annually] をクリックし、Arcade 式エディターで式をもう一度開きます。
- [式] ウィンドウで、次の空の行に「var countriesGenFset =」と入力します。
- [プロファイル変数] タブをクリックします。 矢印をクリックして [$map] アイテムを展開します。
マップに含まれるすべてのレイヤーのリストが表示されます。
- [レイヤー] の下で、[World Countries Electricity Consumption] の矢印をクリックします。
- [World Countries Electricity Consumption の下の [FeatureSetByName($map, "World Countries Electricity Consumption")] をクリックします。
[FeatureSetbyName] 関数が [式] ウィンドウに追加されます。 [式] ウィンドウのステートメントはこのようになります。
var countriesGenFset = FeatureSetByName($map, "World Countries Electricity Consumption")
[FeatureSetByName()] は、最初のパラメーターに [$map] の値を使用し、実質的に現在のマップのこのレイヤーを探すよう指定します。 2 番目のパラメーターは、レイヤー自体の名前です。 これは、[レイヤー] ウィンドウのレイヤー名と一致する必要があります。
次に、[FeatureSetByName()] 関数にオプションの引数を追加して、[FeatureSet] の定義をより明確にします。
注意:
属性テーブル全体が読み込まれないよう、調べたい特定の属性を指定することができます。 たとえば、このチュートリアルでは、国名、総年間電力消費量、総人口のみが必要です。 必要なフィールドに限定してリクエストすると、送信を要するデータが少なくなるので、パフォーマンスが向上します。
また、[FeatureSet] にジオメトリを含むようリクエストして、各国のポリゴンにアクセスすることもできます。 これを行うには、ブール値 (True または False) を使用します。 このチュートリアルでは、ジオメトリは不要なため、ブール値は False に設定します。 ジオメトリをリクエストしないとパフォーマンスも向上するので、原則として、ジオメトリは式に必要な場合に限り使用してください。
これらのパラメーターを空白にすると、すべての属性およびジオメトリが FeatureSet に格納されます。
次に、[FeatureSetByName()] の行を、FeatureSet が 3 つのフィールドのみを含み、ジオメトリを含まないように変更します。
注意:
ステートメントが長いので、読みやすくするために複数行に分けることをおすすめします。 引数と引数の間 (各カンマの後) に改行を追加してください。
- FeatureSetByName() の行で、"World Countries Electricity Consumption" の後ろの閉じ括弧を削除してカンマを入力します。 次のテキストをコピーして貼り付けます。
['COUNTRY', 'Annual_Electricity_Consumption_', 'POP'], false)
return ステートメントを追加して、[FeatureSet] をテストし、調べます。
- [式] ウィンドウで、次の空の行に「return countriesGenFset」と入力します。
- [実行] をクリックします。
[出力] ウィンドウに FeatureSet が返されます。 これは、World Countries Electricity Consumption レイヤー内のすべてのフィーチャのセットであり、リクエストした属性のみが含まれています。
続いて [Filter()] 関数で [FeatureSet] の行をフィルタリングします。[countryName] 変数に代入された値を使用します。 [Filter()] は、フィルタリングの処理対象のレイヤーまたは [FeatureSet] と、処理を実行する SQL 式の 2 つのパラメーターがあります。
- [式] ウィンドウの return countriesGenFset ステートメントの上で Enter キーを押して新しい行を追加し、「var filteredCountryFSet =」と入力します。
- [関数] タブをクリックし、検索ボックスで「Filter」と入力します。 検索結果で Filter(features, sqlExpression) をクリックして、ステートメントに追加します。
Filter() が、2 つの引数プレースホルダー features および sqlExpression とともに、式エディターに追加されます。
注意:
[関数] タブで、関数名の横の矢印ボタンをクリックすると、その関数の詳細情報を表示できます。
- [Filter()] 引数プレースホルダーを編集して、次のステートメントを作成します。
var filteredCountryFSet = Filter(countriesGenFset, 'COUNTRY = @countryName')
[@countryName] の [@] は、[countryName] が式の前の部分で定義された変数であることを意味します。 この SQL 式は、FeatureSet のすべての行を検査し、[COUNTRY] 属性の値が [countryName] 変数 (たとえば [Afghanistan]) と同じ行のみを保持します。 検査に通った FeatureSet の行のみが、変数 [filteredCountryFSet] に格納されます。
- return ステートメントを編集して return filteredCountryFSet にし、[実行] をクリックします。
[出力] ウィンドウに、アフガニスタンの行のみが表示されるようになりました。
注意:
FeatureSet のフィーチャをフィルタリングする方法はほかにもあります。 FeatureSet にフィーチャのジオメトリが含まれている場合、Arcade 関数 [Intersects()] および [Contains()] は、[FeatureSet] のフィーチャを、ポップアップ レイヤーのフィーチャに接続するという同じ最終目標を達成できます。 これは、2 つのレイヤーが共通の属性を共有していないが、レイヤーのフィーチャが有意義な方法で空間的に交差している場合に有用です。
変数 [filteredCountryFset] の内容は 1 行のみですが、FeatureSet であることに変わりなく、その 1 行がテーブル構造で格納されています。 次に、テーブルからデータを抽出し、より簡単に使用できるようにします。 その場合、Arcade では、一般的に [First()] 関数が使用されます。 この関数は、FeatureSet の最初のフィーチャを取り出して返します。
- [式] ウィンドウで、return filteredCountryFSet ステートメントの上に新しい行を追加し、「var filteredCountry =」と入力します。
- [関数] タブの検索ボックスで「first」と入力します。 [FeatureSet 関数] の下で、[First(features)] -> [フィーチャ] の順にクリックし、式に追加します。
関数が、引数プレースホルダー [First(features)] とともに追加されます。
- 引数プレースホルダーを、次のように置き換えます。
var filteredCountry = First(filteredCountryFset)
- return ステートメントを編集して return filteredCountry にし、[実行] をクリックします。
[出力] ウィンドウに、データが単一フィーチャとして表示されるようになりました。
Arcade 式の次の複数のステートメントで、このデータを使用します。
電力供給量の計算
次に、FeatureSet から抽出した情報を使用して、発電所が電力を供給できる市民の数を計算します。 その後、計算結果の数字を書式設定します。
はじめに、発電所が所在する国の年間電力消費量を取得します。 このデータは、[filteredCountry] フィーチャの [Annual_Electricity_Consumption_] 属性フィールドに格納されています。 Arcade でフィーチャの属性にアクセスするには、[feature["attribute"]] 構文または [feature.attribute] 構文を使用します。
前のテスト結果で、この属性が [Annual_Electricity_Consumption_] と呼ばれていることがわかりました。 あるいは、[グローバル] ページでフィールドを対話形式で検索してこの情報を見つける方法もあります。
- [プロファイル変数] タブをクリックします。 必要に応じて [戻る] ボタンをクリックします。 矢印をクリックして [$map] アイテムを展開します。
- [レイヤー] グループの下で、[World Countries Electricity Consumption] の矢印をクリックします。
[Annual_Electricity_Consumption_] 属性を含む、レイヤーの属性リストが表示されます。
これで対象の属性の名前が確実に特定されたので、それを変数に追加するステートメントを記述します。
- [式] ウィンドウで、return filteredCountry 行の上に新しい行を追加し、次のように入力します。
var electricityConsumption = filteredCountry.Annual_Electricity_Consumption_
- return ステートメントを編集して return electricityConsumption にし、[実行] をクリックします。
テスト国はアフガニスタンなので、[出力] ウィンドウには、アフガニスタンの年間電力消費量の 5526000000 (キロワット時または kWh) が返されていることがわかります。
同様に、[filteredCountry] フィーチャに格納された人口データにアクセスします。
annualGenerationGwh = 10 に設定しているため、出力は 0 になります。 属性テーブルから割り当てられる値に基づいて実行するため、その値をコードから削除する必要があります。
- annualGenerationGwh = 10 の行を削除して [実行] をクリックします。
- [式] ウィンドウで、return ステートメントの上に新しい行を追加し、「var population = filteredCountry.POP;」と入力します。
- return ステートメントを編集して return population にし、[実行] をクリックします。
[出力] ウィンドウで、アフガニスタンの総人口が 37466414 であることを確認できます。
次に、推定年間消費量を人口で除算して 1 人当たりの消費量を計算します。
- [式] ウィンドウで、return ステートメントの上に新しい行を追加し、次のように入力します。
var consumptionPerCapita = electricityConsumption / population
- return ステートメントを編集して return consumptionPerCapita にし、[実行] をクリックします。
[出力] ウィンドウで、1 人当たりの消費量が 147.4920978559624 (kWh) であることを確認できます。
発電所が 1 年間に電力を供給できる市民の推定数を算出するには、その発電所の推定年間発電データ (1000000 を乗算して gWh から kWh に変換) を、計算した国の 1 人当たりの電力消費量 (kWh) で除算します。
これに相当する式は annualGenerationGwh * 1000000) / consumptionPerCapita になります。
次に、人数は整数で表されるので [Round()] 関数を使用して小数ではなく整数を返します。
- [式] ウィンドウで、return ステートメントの上に新しい行を追加し、「var numCitizensAnnually =」と入力します。
- [関数] タブで、[Round] 関数を検索してクリックし、ステートメントに挿入します。
この関数と引数プレースホルダー Round(value, ) が追加されます。 value の位置に、先に定義した計算式を挿入します。
- [Round] 関数の括弧内の [value] を「(annualGenerationGwh * 1000000) / consumptionPerCapita」に置き換えます。
[Round()] 関数の 2 番目の引数 [numPlaces] は、数値を四捨五入する小数点以下の桁数を示します。
- 式の後にカンマとスペースを入力し、「0」と入力します。
- return ステートメントを編集して return numCitizensAnnually にし、[実行] をクリックします。
注意:
結果が 0 の場合、var NumCitizensAnnually = Round 行の上に annualGenerationGwh = 10 を追加します。
[出力] ウィンドウで、この式の計算結果として 67800 (市民数) を確認できます。
次に、[Text()] 関数により、この四捨五入された値を書式設定して桁区切り記号を追加します。
- [式] ウィンドウで、return ステートメントの上に新しい行を追加し、「var displayNumCitizensAnnually =」と入力してスペースを追加します。
- [関数] タブで、[Text] 関数を検索してクリックし、ステートメントに挿入します。
この関数が、引数プレースホルダー value とともに追加されます。
- value を numCitizensAnnually に置き換えてから、最大 9 桁の値に対応するため 「, '###,###,###'」 と入力します。
- return ステートメントを編集して return displayNumCitizensAnnually にし、[実行] をクリックします。
[結果] ウィンドウの [67800] が、目的の書式設定が適用された [67,800] に変わります。
[Kajaki Hydroelectric Power Plant Afghanistan] 発電所は、1 年間で推定 [67,800] 人のアフガニスタン市民に電力を供給できます。
これで、発電所が 1 年間に電力を供給できる市民の推定数が算出されたので、この値を、ポップアップに表示される文章に返します。 この操作を実行するには、テンプレート リテラルを使用して、テキストの書式を組み込みます。 テンプレート リテラルはバッククォート (`) で定義され、${variableName} 構文を使用して変数または式を文字列に挿入します。 これは、マップの各発電所の変数の値に応じてさまざま文章が返されることを意味します。
- [式] ウィンドウで、return ステートメントの上に新しい行を追加し、次の行をコピー/貼り付けします。
var dataTL = `On average, a citizen in ${ countryName } consumes ${ text(round(consumptionPerCapita, 0), '###,###,###,###') } kilowatt-hours of electricity per year. ${ plantName } supplies electricity for ${ displayNumCitizensAnnually } citizens in ${ countryName } annually.`
注意:
出力に表示されてしまうため、改行を追加しないでください。
- return ステートメントを編集して return dataTL にし、[実行] をクリックします。
[出力] ウィンドウで、出力される文章を確認できます。変数は、評価された値に置き換えられています。
欠損値の管理
Arcade 式はほぼ使用できる状態になりました。 ただし、まれに属性値の一部が欠落した状況があり、対応が必要です。 注意すべき状況は 3 つあります。
- 発電所フィーチャに、推定年間発電量のデータがない可能性があります。
- [Global Power Plants] レイヤーの発電所フィーチャが、World Countries Electricity Consumption レイヤーに存在しない国を扱う可能性があります。
- World Countries Electricity Consumption レイヤーに、電力消費量データがない可能性があります。
最初に、発電所に推定年間発電量のデータがない場合に対応します。 このチュートリアルの前半の、テスト発電所フィーチャである Kajaki Hydroelectric Power Plant Afghanistan のところで、この状況が発生しました。 既存の式である [Estimated Annual Generation in Lightbulbs] で行った操作をもう一度行って、これらの欠損値に対応します。
- [候補] タブをクリックします。 [Estimated Annual Generation in Lightbulbs] の矢印をクリックして、コードのプレビューを展開し、表示します。
- 先頭が var generationCheck で、末尾の return noGenerationTL の後に閉じ括弧がある式以外の式を、ハイライト表示します。 CTRL + C キーを押してコピーします。
- [式] ウィンドウで、[annualGenerationGwh] 変数を宣言している行のところに新しい行を追加し、Ctrl + V キーを押してコピーしたテキストを貼り付けます。
注意:
// で始まる数行はコメントです。式の振舞いには影響しません。 それらの行は必要に応じて削除できます。
挿入したコードは、[IsEmpty()] 関数の値から Boolean 変数 (true または false) を作成します。 [IsEmpty()] は、変数が空または NULL かどうかをチェックし、該当する場合は [True] を返します。 したがってここでは、推定年間発電量フィールドの値が格納される [annualGenerationGwh] 変数が空かどうかをチェックします。 空の場合は、[if] ステートメントが、問題を説明した文章を返します。 今再利用したコードの詳細については、「ArcGIS Arcade の基本操作」のチュートリアルで学習できます。
Arcade 式が対応している特定シナリオをより反映するように、テンプレート リテラルを変更します。
- 今貼り付けたテキストで、var noGenerationTL = の後のテキストをハイライト表示し、次のテキストと置き換えます。
`${ plantName } does not have estimated annual generation data. Unable to calculate the number of citizens the power plant can supply electricity for annually.`
この状況をテストするため、[$feature.estimated_annual_generation] 属性に追加したテスト値「10」を削除します。
- コードで「annualGenerationGwh = 10」行を見つけ、その前に「//」と入力してコメントアウトします。
- [実行] をクリックします。
結果には、データがないことを示す文章が表示されます。これは、テスト フィーチャに推定年間発電データがないからであり、理にかなっています。
- コードで、annualGenerationGwh = 10 行のコメントを削除します。
最後に、値が欠落した 3 番目の状況、つまり World Countries Electricity Consumption レイヤーに電力消費量データがない状況に対応します。 その国に推定年間電力消費量データがない場合、[electricityConsumption] 変数が [null] になるという知識を活用します。
- [式] ウィンドウで、electricityConsumption 変数を宣言している行の後に新しい行を追加し、次のように入力します。
if (electricityConsumption == null) {
var noConsumptionTL = `There is no annual electricity consumption data for ${ countryName }. Unable to calculate the number of citizens the power plant can supply electricity for annually.`
return noConsumptionTL
}
注意:
[IsEmpty()] 関数を使用しても適切に処理されますが、[== null] は特に変数が null かどうかをテストします。
この状況をテストするため、World Countries Electricity Consumption レイヤーにある国で、年間電力消費量データがない Boulaos, in Djibouti の例を使用します。
- 式ウィンドウで [完了] をクリックします。
- マップ上で [検索] ボタンをクリックして「Djibouti」を検索し、[Global Power Plant] ポイント シンボルをクリックしてポップアップを開きます。
ここまで、さまざまな状況の欠損値に対応できました。これで、式が常に有意義なメッセージをユーザーに返すことを確信できます。 これで Arcade 式が完成しました。
- [コンテンツ] ツールバーで [保存と開く] をクリックし、[保存] を選択してマップと Arcade 式を保存します。
参考のため、このチュートリアルで完成した式を以下に示します。 コードの意味を説明するコメントが追加されています。
// Save the country and power plant name to variables for later use
var countryName = $feature["country_long"]
// Save the power plant name and annual generation to a variable
// for later use
var plantName = $feature.name
var annualGenerationGwh = $feature["estimated_generation_gwh"]
// Check if there is a value in the estimated annual generation
// attribute field. isEmpty(fieldOrValue) returns true if empty
var generationCheck = isEmpty(annualGenerationGwh)
// If there is not annual generation data, return a sentence for use
// in the pop-up that informs the user about this.
// The below expression uses conditional logic and a template literal:
if (generationCheck) {
var noGenerationTL = `${ plantName } does not have estimated annual generation data. Unable to calculate the number of citizens the power plant can supply electricity for annually.`
return noGenerationTL
}
// If there is average annual generation data, the script continues:
// Create a FeatureSet from the World Countries Electricity Consumption layer
var countriesGenFset = FeatureSetByName($map,
"World Countries Electricity Consumption",
['COUNTRY', 'Annual_Electricity_Consumption_', 'POP'], false)
// Filter the countries feature set. COUNTRY is attribute field in World
// Countries Population and Annual Electricity Consumption
// filteredCountryFset will be a FeatureSet with only one feature,
// because the powerplant country value is only equal to one country
var filteredCountryFset = filter(countriesGenFset,
'COUNTRY = @countryName')
// Select the first country in the filtered FeatureSet
// This essentially changes the data type from FeatureSet to a feature
// because in this case, there is only one feature in each FeatureSet
var filteredCountry = first(filteredCountryFset)
}
// Access the electricity consumption value for the country
// from the countries layer
// Note: bracket [] and . notation are both accepted
var electricityConsumption = filteredCountry.Annual_Electricity_Consumption_;
// Check if there is annual electricity consumption data for the country
// Instead of using isEmpty, we will check if the value is null
// If it isn't, return a sentence indicating this and exit the script
if (electricityConsumption == null) {
var noConsumptionTL = `There is no annual electricity consumption data for ${ countryName }. Unable to calculate the number of citizens the power plant can supply electricity for annually.`
return noConsumptionTL
}
// Access the population value for the country from the countries layer
var population = filteredCountry.POP;
// Compute the consumption per capita for that country
var consumptionPerCapita = electricityConsumption / population
// Calculate the number of citizens the plant can supply annually
var numCitizensAnnually = round(
(annualGenerationGwh * 1000000) /
(consumptionPerCapita), 0)
// Change the number to text so we can add thousand separators
var displayNumCitizensAnnually = Text(numCitizensAnnually,"###,###,###");
// Use a template literal to return the string we will display
// in the pop-up
var dataTL = `On average, a citizen in ${ countryName } consumes ${ text(round(consumptionPerCapita, 0), '###,###,###,###') } kilowatt-hours of electricity per year. ${ plantName } supplies electricity for ${ displayNumCitizensAnnually } citizens in ${ countryName } annually.`
return dataTL
結果をポップアップに表示
これで Arcade 式が完成したので、いよいよ [Global Power Plants] レイヤーのポップアップのテキストで使用します。
- [レイヤー] ウィンドウで、[Global Power Plants] レイヤーが選択されていることを確認します。
- [属性式] ウィンドウの戻るボタンをクリックします。
- [ポップアップ] ウィンドウの下部で、[テキスト] をクリックし、[テキストの編集] をクリックします。
ポップアップ テキスト エディター ウィンドウが開き、[Global Power Plants] レイヤーで現在表示されているテキストが表示されます。 Arcade 式の結果を既存のテキストに追加します。
- ポップアップ テキスト エディターで、[{expression/expr1}] の末尾にカーソルを置いて Enter キーを押します。
- 破線 (-------------------------------) を入力して、段落の区切り線を作成します。 Enter キーを押します。
- 単一の中括弧 ({) を入力します。
使用可能なフィールドと Arcade 式のリストが表示されます。
- 作成した式 [Number of Citizens the Power Plant can Supply Annually] をクリックします。
注意:
使用可能な他の属性フィールドと同様に、作成した Arcade 式がリストに表示されていることを確認できます。 意味のある名前をすでに設定しているため、この式を簡単に見つけることができます。
この式は [テキスト] エレメントに追加され、[{expression/expr2}] という一意の識別子が付けられます。
注意:
別の式を追加または削除した場合、一意の識別子は [2] 以外の数字が、たとえば [{expression/exp3}] のように使用されます。
- [OK] をクリックして、ポップアップ テキスト エディターを閉じます。
- マップを保存します。
ここで、ポップアップをテストします。
- [ポップアップ] ウィンドウと [レイヤー] ウィンドウを閉じ、マップ上のスペースを解放します。
- たとえばスペインのセビージャなど、関心のある地域を拡大表示します。
- 発電所をクリックして、ポップアップを表示します。
ポップアップに、作成した Arcade 式が生成した新しいテキストの段落が表示されるようになりました。
- ポップアップで、市民 1 人当たりの電力消費量と発電所が電力を供給できる市民の人数を確認します。
- その他の発電所をクリックして、そのポップアップを表示します。
このチュートリアルでは、発電所が 1 年間で電力を供給できる市民の人数を計算する ArcGIS Arcade 式を作成しました。 [FeatureSets] および [Filter()] 関数を使用して、複数レイヤーのデータにアクセスする方法を学びました。 次に、そのデータを使用して計算を行ったり、欠損データがあった場合に対処したり、ポップアップで式を使用したりしました。 Arcade 式は、元のデータに影響を与えることなく、動的に実行されます。 このチュートリアルでは、Arcade を使用して実行できる操作の一部しか取り上げていません。 さらに学習するには、Arcade の学習コースをご参照ください。
他のチュートリアルについては、チュートリアル ギャラリーをご覧ください。