フィールド演算により、ホスト フィーチャ レイヤー所有者または組織の管理者が、レイヤーの属性テーブル内の 1 つのフィールドの、すべての行の値を変更できます。
たとえば、不動産販売に関する情報 (販売価格やその不動産の所在地の税率などを含む) が格納されたホスト フィーチャ レイヤーが存在する場合には、このレイヤーに、固定資産税の推定値を格納するフィールドを追加できます。 estimated_property_taxes フィールドを設定するには、sale_price フィールドの値を取得し、取得した値に tax_rate の値を乗算するように、このフィールドの演算式を定義します。
ホスト フィーチャ レイヤー内のレイヤーのフィールドに対する演算式を記述する場合、次の 2 つのオプションがあります。
- ArcGIS Arcade - Arcade は、SQL よりも多くの機能を必要とする計算に最適です。これは、Arcade が属性値およびフィーチャ ジオメトリへのアクセスを提供し、それにより空間処理を含む式の作成が可能になるからです。 さらに、特定の行の計算中にエラーが発生した場合に、停止して問題をトラブルシューティングし、問題を修正した後に、計算を再開することができます。
注意:
Arcade を計算で使用するにはレイヤーで編集を有効にする必要がありますが、レイヤーで同期を有効にすることはできません。 編集および同期設定の変更については、「ホスト フィーチャ レイヤーの管理」をご参照ください。
- SQL - 非空間属性に対して標準化された SQL (SQL-92) 式を使用して実行できる計算で最速のパフォーマンスを実現するには、SQL を使用します。 同期に対応したホスト フィーチャ レイヤーとフィーチャの作成者および編集者を記録するように構成されたレイヤーに対して SQL を実行することはできますが、このようなレイヤーに対して Arcade 式を実行することはできません。
次のセクションでは、ホスト フィーチャ レイヤーの詳細ページからフィールドの値を算出する方法を説明します。 それ以降の各セクションには、一般的な計算の例が示されています。
フィールドの値を計算
フィールド内の文字列、数値、または日付フィールドの値を計算するには、次の手順に従います。
注意:
フィールドの計算を取り消すことはできません。 このため、フィールドを追加して、そのフィールド内で値の計算を実行し、計算が期待通りであることを確認することをお勧めします。 計算が期待通りであれば、追加したフィールドと等しくなるように元のフィールドを計算します。 元のフィールドの値が正しいことが確認できたら、追加したフィールドを削除します。- レイヤーのアイテム ページで、[データ] タブをクリックしてテーブルを表示します。
ヒント:
これらの手順は、Map Viewer Classic のテーブルからも実行できます。
- 計算する値が含まれている列をクリックします。
- 次のいずれかを実行して、[フィールド演算] ダイアログ ボックスを開きます。
- [計算] をクリックします。
- [詳細なビューを表示] > [計算] の順にクリックします。
- 計算に使用する言語 ([Arcade] または [SQL]) を選択します。
ホスト フィーチャ レイヤーが同期に対応しているか、フィーチャの作成者および更新者を記録するように構成されている場合、このページは表示されません。 代わりに [SQL] ウィンドウが表示されます。
- 演算式を作成します。
- SQL の場合、基本演算子、フィールド リスト、および関数を使用します。 [整合チェック] ボタンをクリックして、式にエラーがないことを確認します。 式が無効な場合は、[削除] ボタンをクリックして新しい式を作成します。 式が完成し、有効である場合、[計算] をクリックします。
- Arcade の場合は、グローバル変数、関数、および定数を使用します。 [OK] をクリックして、この式を実行します。 式の実行時にエラーが発生した場合、[エラーの確認] をクリックして式のウィンドウを開き、エラーを修正することができます。 それ以外の場合は、[キャンセル] をクリックします。 式を修正して再実行すると、計算が最初からやり直されます。
計算の完了までにかかる時間は、式の複雑さとレイヤー内のフィーチャ数によって異なります。
計算の例
次の各セクションには、ArcGIS Enterprise で一般的な計算を実行する場合の構文またはメソッドの例が示されています。
既存の 2 つのフィールド内の数値に対して数値演算を実行して 3 番目のフィールドに値を入力する
実行する最も一般的な計算の 1 つは、フィーチャ レイヤー内の既存の値に基づいて新しい数値を取得する計算です。 たとえば、全店舗のある年の売上総額を別の年の売上総額から減算して年ごとの利益の変化を求めたり、18 歳未満の居住者の総数を総人口で除算して 18 歳未満の人口の割合を求めたりすることができます。
Arcade の例
2 つの数値フィールド (Sales2016 と Sales2017) の値の差を算出して、その値を 1 つの数値フィールドに入力します。
$feature.Sales2016 - $feature.Sales2017
SQL の例
数値フィールド (SalesDifference) の計算を実行して、2 つの数値フィールド (Sales2016 と Sales2017) の値の差を求めます。
Sales2016 - Sales2017
18 歳未満の人口の割合を計算して求められた結果の 10 進数値を数値フィールドに入力します。
PopUnder18/TotalPop
既存のフィールドから取得した文字列値を新しい文字列フィールドに連結する
新しいフィールドに値を入力する別の計算には、既存の文字列フィールドの値を連結させる処理が含まれています。 たとえば、ホテルの部屋の位置を表す 2 つの文字列フィールド ([階] と [部屋]) があり、これらのフィールドを結合して、両方の値を含む 1 つの文字列フィールドを生成します。
次の例では、[階] フィールドと [部屋] フィールドの値が結合されて 1 つのフィールドが生成されます。
Arcade の例
Concatenate($feature.room,$feature.floor)
SQL の例
CONCAT(Floor,Room)
文字列フィールドから先頭または末尾のスペースを削除する
編集中に値をフィールドに入力したり貼り付けたりした場合に、誤ってテキストの先頭または末尾にスペースが残ることがあります。 値の切詰めを行うと、このように誤って残されたスペースを除去することができます。
これらの例では、編集者が州名を格納するフィールドに「New Hampshire 」という文字列を貼り付けた際に末尾にスペースが残されたことが判明しているため、切詰めを行って文字列の末尾からスペースを除去します。
Arcade の例
Trim('New Hampshire ')
SQL の例
Trim(TRAILING ' ' FROM 'New Hampshire ')
別のフィールドの値に応じて異なる値をフィールドに入力する
フィールドに追加する値はフィーチャごとに異なり、同じフィーチャの別の値によって決まることがあります。 たとえば、別のフィールド内の数値または省略された文字列値を表すテキストを格納する文字列フィールドをフィーチャ レイヤーに追加することができます。 SQL 計算インターフェイスはこの処理に対応していないため、この種の計算には Arcade を使用します。
Arcade の例
次の例では、異なる文字列値 (None、Low、High、または Other) を、レイヤー内の別のフィールド (HowMany) の数値に基づいて、条件付きでテキスト フィールドに書き込みます。
When(
$feature.HowMany == 0, "None",
$feature.HowMany == 1, "Low",
$feature.HowMany == 2, "High",
"Other")
Map Viewer Classic のフィルターの使用
Arcade 式を使用したくない場合、マップ内のレイヤーにフィルターを適用し、フィルター処理後のフィーチャの値を算出し、そのフィルターを削除し、異なる値を基準にした別のフィルターを適用し、これらのフィールドの値を算出することができます。 これについては以下の手順で説明します。
たとえば、コード (3、2、および 1) を使用して店舗タイプを記録する数値フィールドがあり、それぞれのコードが表す内容 (チェーン、フランチャイズ、および個人経営) を文字列フィールドに記述する場合は、文字列フィールドをレイヤーに追加し、そのレイヤーをマップに追加し、コード値ごとにフィルター処理を実行し、その文字列フィールドの値を算出することができます。
- ホスト フィーチャ レイヤーに文字列フィールドを追加します。 格納する最長の文字列が収まる長さに設定します。
この店舗タイプの例では、新しいフィールド名は TypeFull です。
- このレイヤーの詳細ページの [概要] タブで [Map Viewer Classic で開く] をクリックします。
- このレイヤーに対してフィルターを定義し、同じタイプのフィーチャだけがマップに表示されるようにします。
この店舗の例では、StoreCode フィールドの値が 3 のフィーチャだけを返すフィルターを適用します。
- このレイヤーの属性テーブルを開きます。
- 手順 1 で追加したフィールドの名前をクリックしてから [計算] をクリックします。
この例では、フィールド名 TypeFull をクリックしてから [計算] をクリックします。
- 該当するフィーチャのこのフィールドに挿入する文字列を入力します。 文字列を単一引用符で囲みます。
「'chain'」と入力します。この値は、StoreCode が 3 のすべてのフィーチャの TypeFull フィールドに入力されます。
- [計算] をクリックします。
- 手順 3 で定義したフィルターを削除します。 このレイヤーの [フィルター] ウィンドウをもう一度開いて [フィルターの削除] をクリックします。
- 算出する残りの値に対して手順 3 ~ 8 を繰り返します。
この店舗の例では、StoreCode が 2 のフィルターを定義し、TypeFull'franchise' の店舗に対して を算出します。 このフィルターを削除した後、StoreCode が 1 の新しいフィルターを定義し、'independent' の店舗に対して TypeFull を算出します。
- 新しいフィールドの値の計算が終了したら、保存せずにマップを閉じます。
値を別の値に置き換える
既存の値を別の値に置き換える必要がある場合 (たとえば、特定の値を表現する方法が変更された場合や入力に誤りのある値を修正する必要がある場合)、フィールドの既存の値をすべて検出して、これらの値を新しい値に置き換えることができます。 SQL 計算インターフェイスはこの処理に対応していないため、この種の計算には Arcade を使用します。
注意:
計算内容は、フィーチャ レイヤーにすぐに保存されます。 誤って既存の値を上書きした場合は、計算をもう一度実行して、元の値に戻す必要があります。
Arcade の例
この例では、[置換] 関数を使用して、イギリス英語のスペル (colour) をアメリカ英語のスペル (color) に変更します。Replace($feature.color, 'colour', 'color')
Map Viewer Classic のフィルターの使用
別のフィールドの値に基づいてフィールドに値を入力する場合と同様に、置き換えるフィールド値を含むフィーチャだけを返すフィルターをマップ内のレイヤーに適用することができます。 次に、フィルター処理後のフィールドを新しい値と一致させて、フィールドの値を更新します。
たとえば、入力に誤りのある値を修正する必要がある場合や単語を略語に変換する必要がある場合は、変更する必要のある文字列リテラルのフィルター処理を実行し、新しい値と一致するようにフィールドを設定します。
- Map Viewer Classic に、更新する必要のあるホスト フィーチャ レイヤーを追加します。
必ずレイヤー所有者またはポータル管理者でなければなりません。
- このレイヤーに対してフィルターを定義し、置き換える値を含むフィーチャだけがマップに表示されるようにします。
たとえば、StreetType フィールドの値が Crt のフィーチャがいくつか存在することが判明している場合は、StreetType フィールドの値が Crt のフィーチャだけを返すフィルターを適用します。
- このレイヤーの属性テーブルを開きます。
- フィールド名をクリックしてから [計算] をクリックします。
この例では、StreetType フィールドをクリックしてから [計算] をクリックします。
- 該当するフィーチャのこのフィールドに挿入する文字列を入力します。 文字列を単一引用符で囲みます。
「'Ct'」と入力します。フィルター処理後の StreetType フィールドに Court の修正済みの略語が入力されます。
- [計算] をクリックして、フィルター処理後のフィールドに変更を適用します。
- 保存せずにマップを閉じます。
フィーチャ エリアあたりの数値属性の密度を求める
エリア内の 1 つの属性の密度を算出する場合は、Arcade 式を使用します。これは、計算インターフェイスにある空間フィールドに対して SQL 計算を実行できないためです。
Arcade の例
この例では、総人口の値 (TotalPop) をポリゴン フィーチャの平方マイル単位の面積で除算して、フィーチャあたりの人口密度を求めます。
$feature.TotalPop / Area ($feature,
'square-miles')
ポイント フィーチャの座標を取得する
Arcade 式を使用すると、ポイントだけが含まれているホスト フィーチャ レイヤー内の空間フィールドの経度座標値または緯度座標値を返すことができます。
この種の計算は、計算インターフェイスにある空間フィールドに対して実行することができません。
Arcade の例
この例では、Geometry 関数を使用したフィールド演算で、ポイント レイヤー内の各ポイントの X 座標値を求めます。
Geometry($feature).x
日付への時間の加算と日付からの時間の減算
日付フィールドに時間を加算するか、日付フィールドから時間を減算するか、日付リテラル値を使用して、更新済みの日付フィールドを生成したい場合があります。 たとえば、日付に時間を加算して、将来の点検日や再調査日を計算できます。
Arcade の例
この例では、DateAdd 関数を使用し、日付に 7 日を加算して翌週の日付を取得します。var startDate = Date($feature.dateField);
var oneWeekLater = DateAdd(startDate, 7, 'days');
return oneWeekLater;
SQL の例
次の計算に示すように、INTERVAL クエリを使用して、日付フィールドで時間を加算または減算します。 最初の例では、日付に 3 日を加算して、新しい日付とします。 2 つ目の例では、タイム スタンプ フィールドから 3 日を減算します。<DateField> + INTERVAL '3'DAY = updated date
<DateField> - INTERVAL '3 00:00:60' DAY TO SECOND = updated date
次の日時の値を指定して、INTERVAL を使用できます。
- DAY
- HOUR
- MINUTE
- SECOND
- DAY TO HOUR
- DAY TO MINUTE
- DAY TO SECOND
- HOUR TO MINUTE
- HOUR TO SECOND
- MINUTE TO SECOND
2 つの日付間の差の計算
2 つの日付間の時間の長さを計算したい場合があります。 たとえば、電気計器の取り付け日が設定され、さらに検査日も設定されている場合、これらの 2 つの日付間の差を計算して、取り付けから検査までの時間の長さが許容可能なガイドラインの範囲内にあることを確認できます。 この計算の結果は、日付フィールドではなく数値フィールドです。
Arcade の例
次の例では、DateDiff 関数を使用し、現在の日付 (endDate) と人の生年月日 (startDate) との差を求めて、その人の年齢を算出します。var startDate = Date($feature.startDateField);
var endDate = Date($feature.endDateField);
var age = DateDiff(endDate, startDate, 'years');
return age;
SQL の例
2 つの日付間の時間の長さを計算するには、日付フィールドと日付リテラルの任意の組み合わせを使用できます。 次に示す 1 番目の計算では日付フィールドが使用され、2 番目の計算では日付リテラルが使用されます。 3 番目と 4 番目の計算では、日付フィールドと日付リテラルの両方が使用されます。<DateField1> - <DateField2> = number of days in between
DATE'<SQL-supported Date Literal>' - DATE'< SQL-supported Date Literal>' = number of days in between
<DateField1> - DATE'<SQL-supported Date Literal>' = number of days in between
DATE'<SQL-supported Date Literal>' - <DateField2> = number of days in between
この計算結果は、1 つの日付フィールドまたはリテラルを別の日付フィールドまたはリテラルから減算して算出された数値フィールドです。 数値結果 (日数) は整数にすることも、小数を含めることもできます。たとえば、1.5 は 1 日半、すなわち 36 時間を表します。
上記の電気計器の検査の例では、次に示すいずれかの計算を使用して、取り付け日「6/1/2015」から検査日「10/1/2015」までの時間の長さを計算できます。 1 番目の計算では日付フィールド、2 番目のフィールドでは日付リテラルが使用され、3 番目と 4 番目の計算では日付フィールドと日付リテラルの両方が使用されます。<InspectionDateField> - <InstallationDateField> = 122 (days)
DATE'10/1/2015' - DATE'6/1/2015' = 122 (days)
<InspectionDateField> - DATE'6/1/2015' = 122 (days)
DATE'10/1/2015' - <InstallationDateField> = 122 (days)
フィールド値を算出する際の考慮事項
- マップ内のレイヤーにフィルターを適用している場合は、そのフィルター条件を満たしているレコードの値だけが算出されます。
- SQL 式を作成する場合、[フィールド演算] では、フィールド名のみ使用できます。フィールド エイリアスは使用できません。 [フィールド] リストには、計算に使用できるすべてのフィールド名が表示されます。 このリストは、[文字列]、[数値]、および [日付] の各フィールド タイプでフィルタリングできます。
- [フィールド] リスト内でフィールド名の上にポインターを合わせると、フィールド エイリアスとフィールド タイプが表示されます。
- [フィールド] リスト内のフィールド名をクリックすると、フィールドが式に追加されます。
- フィールド値の計算では、標準化された SQL クエリのみがサポートされています。
- 倍精度型 (double) フィールドには、数値関数 MOD は使用できません。 次の例に示すように、フィールドを整数に変換します。
- 同期が有効化されているか、フィーチャの作成者および最終更新者を記録するように構成されているホスト フィーチャ レイヤーに対する Arcade 式を記述することはできません。
標準化された SQL (SQL-92) リファレンス
SQL 式を作成してフィールド値を算出する場合は、標準化された SQL を使用します。 このセクションには、ArcGIS Enterprise での SQL 計算に使用できる演算子と SQL 関数の一覧が示されています。
SQL 式を作成したら、[計算] ボタンをクリックします。 何らかのエラーがある場合は、ダイアログ ボックスの下部にエラー メッセージが表示されます。 式の構文を修正して、計算をもう一度実行します。
演算子
[フィールド演算] ダイアログ ボックスでは、加算、減算、乗算、除算などの演算子を使用して、単純な SQL 式を作成できます。 これらの演算子の使用例とヒントは次のとおりです。
- SAMPLE という数値フィールド内のすべての値に 100.0 を乗算するには、式に「SAMPLE * 100.0」と入力します。
- より複雑な方程式には、括弧を使用して計算順序を指定できます (例: SAMPLE * (BASELINE - 40))。
- 算術演算子は、文字列フィールドには使用できません。 「文字列関数」セクションで説明する文字列関数を使用する必要があります。
- double タイプのフィールドを整数タイプのフィールドに変換する場合、式に CAST 関数が自動的に追加されることがあります。 たとえば、POP という double フィールドを SAMPLE という整数フィールドに変換する場合、式は CAST(SAMPLE AS FLOAT) と表示されます。 CAST 関数を削除しないでください。 CAST 関数の詳細については、以下の「数値関数」をご参照ください。
- 文字列にアポストロフィを含める場合は、アポストロフィとして、2 つの単一引用符を使います。 例: 'Nightingale''s'。 二重引用符は使用しないでください。
関数
演算子を使用した単純な式だけでなく、関数を使用して SQL 式を作成することもできます。 関数には、フィールド名、リテラル、その他の関数を使用できます。 たとえば、TOTALPOP を POP18 で除算する double フィールドを計算する必要があるとします。 フィーチャにゼロの POP18 が含まれている場合にこの計算を実行すると、ゼロ除算エラーが発生します。 後述の NULLIF 関数を使用すると、これを防ぐことができます。 式は、TOTALPOP / NULLIF(POP18, 0) のようになります。
関数は引数を取ります。 以下のテーブルでは、次のような引数を使用できます。
- フィールド タイプが引数のタイプ (文字列、数値、または日付) と一致するフィールド名。
- 'Sailboat' (単一引用符で囲まれた文字列) などのリテラル、数字の 5、または単一引用符で囲まれた MM/DD/YYYY hh:mm:ss 形式の日付。
- 適切なタイプ (文字列、数値、または日付) の値を返す関数。 たとえば、FLOOR(POWER(SAMP_ERR, 0.5)) は、SAMP_ERR の平方根以下で最大の整数を返します。
わかりやすいように、次のテーブルの説明列にあるほとんどの例では、リテラルの引数を使用しています。 これらの引数をフィールド名や別の関数に置き換えることができます。
日付関数
日付フィールドでは数種類の計算を実行できます。 たとえば、日付フィールドでの時間の加算/減算や、2 つの日付フィールド間の差の計算を実行できます。
日付フィールドを操作する前に、重要な考慮事項に目を通しておく必要があります。
日付フィールドを計算するときは、日付および数値フィールド/リテラルの任意の組み合わせを使用できます。 日付リテラルを使用する場合、SQL でサポートされている日付形式を使用する必要があります。
使用可能な日付関数としては、次のものがあります。
機能 | 説明 |
---|---|
CURRENT_DATE | 現在の日付を UTC 時間で返します。 クライアントに表示される内容は、使用しているクライアントによって異なります。 ポータル Web サイトの日付は、ブラウザーのタイム ゾーンで表示されます。 次の例では、日付が今日の日付より後の [inspection_date] フィールドの値がすべて返されます。 inspection_date > CURRENT_DATE |
CURRENT_TIMESTAMP | 現在の UTC の日付と時刻 (時間、分、秒) を返します。 クライアントに表示される内容は、使用しているクライアントによって異なります。 ポータル Web サイトの時刻は、ブラウザーの現地時間で表示されます。 次の例では、今日の日付と現在の時刻 (UTC 時間) より前のタイムスタンプ値がすべて appointments フィールドに返されます。 appointments < CURRENT_TIMESTAMP |
EXTRACT(<unit> FROM '<date>') | 指定した <date> の一部 (<unit>) を返します。 可能な <unit> 値には、年、月、日、時間、分が含まれます (これらに限定されません)。 次のようなケースがあります。
|
数値関数
機能 | 説明 |
---|---|
ABS(<number>) | 指定した数値の絶対値 (正の値) を返します。 |
CEILING(<number>) | 指定した数値以上で、最も小さな整数を返します。 例
|
COS(<number>) | <number> の角度の余弦を返します。角度の単位はラジアンです。 |
CAST(<number> AS FLOAT | INT) | 数値を別のタイプに変換します。 FLOAT は指定した number を double に変換し、INT は整数に変換します。 |
FLOOR(<number>) | 指定した number 以下の最も大きい整数を返します。 例
|
LN(<number>,<decimal_place>) | 指定した number の自然対数。 |
LOG(<number>,<decimal_place>) | 指定した number の常用対数です。 |
MOD(<number>, <n>) | 被除数 (<number>) を除数 <n> で除算したときの余りを返します。 <n> と <number> のタイプは、整数である必要があります。 次のようなケースがあります。
|
NULLIF(<number>, <value>) | 指定した number が指定した値と同じ場合、null を返します。 NULLIF は、<value> を 0 に設定してゼロ除算エラーを防ぐためによく使用されます。 引数のフィールド値が null であった場合、計算結果は null です。 たとえば、TOTALPOP を POP18 で除算する double フィールドを計算する必要があるとします。 フィーチャにゼロである POP18 値が含まれている場合に、この計算を実行すると、ゼロ除算エラーが発生します。 この場合、POP18 がゼロであるレコードを非表示にするフィルターを作成して、計算を実行できます。 この場合、NULLIF を使用すると簡単です。
|
POWER(<number> , <y>) | 指定した number を指定した乗数 (<y>) で累乗した値を返します。 |
ROUND(<number> , <length>) | 指定する number を指定した長さに丸めます。 <length> に正の数を使用する場合、数値は <length> で指定された小数点以下の桁数に丸められます。 <length> が負の数の場合、指定した <number> は小数点の左側が丸められます。 例
|
SIN(<number>) | 指定した <number> の角度の正弦を返します。角度の単位はラジアンです。 |
TAN(<number>) | 指定した <number> の角度の正接を返します。角度の単位はラジアンです。 |
TRUNC(<number>,<decimal_place>) | 指定した <decimal_place> で <number> を切り捨てます。 <decimal_place> が正の場合、指定した小数点以下の桁数に切り捨てられます。 <decimal_place> が負の数の場合、<number> は小数点の左側が丸められます。 例
|
文字列関数
機能 | 説明 |
---|---|
CHAR_LENGTH(<string>) | 指定した string の文字数を返します。 結果は整数です。 例
|
CONCAT(<string1>, <string2>) | 2 つの文字列値を連結します 指定できるのは、2 つの文字列だけです。 3 つ以上の文字列を連結するには、次のように CONCAT 関数を連続して使用してネストします。 例
NULL 値は空の文字列に変換されます。 |
POSITION(<substring> in <string>) | 指定する string 内で指定した substring が最初に現れる位置を返します。 指定した substring が見つからない場合、結果は 0 になります。 例
|
SUBSTRING(<string>, <start>, <length>) | string の値の一部を返します。<start> は、返される文字列の開始位置を指定する整数インデックスであり、<length> は返される文字数です。 例
|
TRIM(BOTH | LEADING | TRAILING ' ' FROM <string>) | 指定する string の先頭または末尾にあるすべての空白を削除した文字列を返します。 例
2 つ目の引数は、1 つの空白を囲んだ 2 つの単一引用符である点に注意してください。 |
UPPER(<string>) | すべての文字を大文字に変換した文字列を返します。 例
|
LOWER(<string>) | すべての文字を小文字に変換した文字列を返します。 例
|