フィールド値の計算

フィールド演算により、ホスト フィーチャ レイヤー所有者または組織の管理者が、レイヤーの属性テーブル内の 1 つのフィールドの、すべての行の値を変更できます。

たとえば、不動産販売に関する情報 (販売価格やその不動産の所在地の税率などを含む) が格納されたホスト フィーチャ レイヤーが存在する場合には、このレイヤーに、固定資産税の推定値を格納するフィールドを追加できます。 estimated_property_taxes フィールドを設定するには、sale_price フィールドの値を取得し、取得した値に tax_rate の値を乗算するように、このフィールドの演算式を定義します。

ホスト フィーチャ レイヤー内のレイヤーのフィールドに対する演算式を記述する場合、次の 2 つのオプションがあります。

  • Arcade - Arcade は、属性値およびフィーチャ ジオメトリへのアクセスを提供するため、SQL よりも多くの機能を必要とする計算に最適であり、空間処理を含む式を作成可能にします。 さらに、特定の行の計算中にエラーが発生した場合に、停止して問題をトラブルシューティングし、問題を修正した後に、計算を再開することができます。
  • SQL - 非空間属性に対して標準化された SQL (SQL-92) 式を使用して実行できる計算で最速のパフォーマンスを実現するには、SQL を使用します。 同期に対応したホスト フィーチャ レイヤーとフィーチャの作成者および編集者を記録するように構成されたレイヤーに対して SQL を実行することはできますが、このようなレイヤーに対して Arcade 条件式を実行することはできません。

次のセクションでは、ホスト フィーチャ レイヤーの詳細ページからフィールドの値を算出する方法を説明します。 それ以降の各セクションには、一般的な計算の例が示されています。

フィールドの値を計算

フィールド内の文字列、数値、または日付フィールドの値を計算するには、次の手順に従います。

メモ:
フィールドの計算を取り消すことはできません。 このため、フィールドを追加して、そのフィールド内で値の計算を実行し、計算が期待通りであることを確認することをお勧めします。 計算が期待通りであれば、追加したフィールドと等しくなるように元のフィールドを計算します。 元のフィールドの値が正しいことが確認できたら、追加したフィールドを削除します。
  1. レイヤーのアイテム ページで、[データ] タブをクリックしてテーブルを表示します。
    メモ:

    これらの手順は、Map Viewer のテーブルからも実行できます。

  2. 計算する値が含まれている列をクリックします。
  3. 次のいずれかを実行して、[フィールド演算] ダイアログ ボックスを開きます。
    • [計算] をクリックします。
    • [詳細なビューを表示] > [計算] の順にクリックします。
  4. 計算に使用する言語 ([Arcade] または [SQL]) を選択します。

    ホスト フィーチャ レイヤーが同期に対応しているか、フィーチャの作成者および更新者を記録するように構成されている場合、このページは表示されません。 代わりに [SQL] ウィンドウが表示されます。

  5. 演算式を作成します。
    • SQL の場合、基本演算子、フィールド リスト、および関数を使用します。 [整合チェック] ボタンをクリックして、式にエラーがないことを確認します。 式が無効な場合は、[削除] ボタンをクリックして新しい式を作成します。 式が完成し、有効である場合、[計算] をクリックします。
    • Arcade の場合は、グローバル変数、関数、および定数を使用します。 [OK] をクリックして、この式を実行します。 式の実行時にエラーが発生した場合、[エラーの確認] をクリックして式のウィンドウを開き、エラーを修正することができます。 それ以外の場合は、[キャンセル] をクリックします。 式を修正して再実行すると、計算が最初からやり直されます。

計算の完了までにかかる時間は、式の複雑さとレイヤー内のフィーチャ数によって異なります。

計算の例

次の各セクションには、ArcGIS Online で一般的な計算を実行する場合の構文の例が示されています。

既存の 2 つのフィールド内の数値に対して数値演算を実行して 3 番目のフィールドに値を入力する

実行する最も一般的な計算の 1 つは、フィーチャ レイヤー内の既存の値に基づいて新しい数値を取得する計算です。 たとえば、全店舗のある年の売上総額を別の年の売上総額から減算して年ごとの利益の変化を求めたり、18 歳未満の居住者の総数を総人口で除算して 18 歳未満の人口の割合を求めたりすることができます。

Arcade の例

2 つの数値フィールド (Sales2016 と Sales2017) の値の差を算出して、その値を 1 つの数値フィールドに入力します。

$feature.Sales2016 - $feature.Sales2017

SQL の例

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 ')

別のフィールドの値に応じて異なる値をフィールドに入力する

ArcGIS Online でフィールドに書き込まれる値は、フィーチャごとに異なり、同じフィーチャの別の値によって決まることがあります。 たとえば、別のフィールド内の数値または省略された文字列値を表すテキストを格納する文字列フィールドをフィーチャ レイヤーに追加することができます。 ArcGIS Online の SQL 計算インターフェイスはこの処理に対応していないため、この種の計算には Arcade を使用します。

Arcade の例

次の例では、異なる文字列値 (None、Low、High、または Other) を、レイヤー内の別のフィールド (HowMany) の数値に基づいて、条件付きでテキスト フィールドに書き込みます。

When(
  $feature.HowMany == 0, "None",
  $feature.HowMany == 1, "Low",
  $feature.HowMany == 2,  "High",
"Other")

値を別の値に置き換える

既存の値を別の値に置き換える必要がある場合 (たとえば、特定の値を表現する方法が変更された場合や入力に誤りのある値を修正する必要がある場合)、フィールドの既存の値をすべて検出して、これらの値を新しい値に置き換えることができます。 ArcGIS Online の SQL 計算インターフェイスはこの処理に対応していないため、この種の計算には Arcade を使用します。

注意:

計算内容は、フィーチャ レイヤーにすぐに保存されます。 誤って既存の値を上書きした場合は、計算をもう一度実行して、元の値に戻す必要があります。

Arcade の例

この例では、[置換] 関数を使用して、イギリス英語のスペル (colour) をアメリカ英語のスペル (color) に変更します。

Replace($feature.color, 'colour', 'color')

フィーチャ エリアあたりの数値属性の密度を求める

エリア内の 1 つの属性の密度を算出する場合は、Arcade 条件式を使用します。これは、ArcGIS Online の計算インターフェイスにある空間フィールドに対して SQL 計算を実行できないためです。

Arcade の例

この例では、総人口の値 (TotalPop) をポリゴン フィーチャの平方マイル単位の面積で除算して、フィーチャあたりの人口密度を求めます。

$feature.TotalPop / Area ($feature,
'square-miles')

ポイント フィーチャの座標を取得する

Arcade 条件式を使用すると、ポイントだけが含まれているホスト フィーチャ レイヤー内の空間フィールドの経度座標値または緯度座標値を返すことができます。

この種の計算は、ArcGIS Online の計算インターフェイスにある空間フィールドに対して実行することができません。

Arcade の例

この例では、Geometry 関数を使用したフィールド演算で、ポイント レイヤー内の各ポイントの X 座標値を求めます。

Geometry($feature).x

日付への時間の加算と日付からの時間の減算

日付フィールドに時間を加算するか、日付フィールドから時間を減算するか、日付リテラル値を使用して、更新済みの日付フィールドを生成したい場合があります。 たとえば、日付に時間を加算して、将来の点検日や再調査日を計算できます。

Arcade の例

この例では、DateAdd 関数を使用し、日付に 7 日を加算して翌週の日付を取得します。

var startDate = Date($feature.dateField);
var oneWeekLater = DateAdd(startDate, 7, 'days');
return oneWeekLater;

SQL の例

次の計算では、日付フィールドに時間を加算したり、日付フィールドから時間を減算したり、SQL でサポートされている日付リテラル値を使用したりすることができます。 1 番目の計算では日付フィールド、2 番目の計算では日付リテラル値が使用されます。 数値フィールドと数値リテラルも使用できます。 3 番目と 4 番目の計算で示されているように、フィールドとリテラルの任意の組み合わせがサポートされています。

<DateField> +/- <NumberField> = updated date
DATE'<SQL-supported Date Literal>'  +/- <Number of Days> = updated date
<DateField> +/- <Number of Days> = updated date
DATE'<SQL-supported Date Literal >'  +/- <NumberField> = updated date

計算後の日付フィールドは、元の日付に、加算または減算した日数を足したまたは引いた日付になります。 日数は整数にすることも、小数を含めることもできます。たとえば、1.5 は 1 日半、すなわち 36 時間を表します。

次に示す例では、機械の部品が 2016 年 6 月 14 日午前 10 時に取り付けられます。この取り付け日の 1 か月 (30 日) 後に検査日を生成するには、次のいずれかの計算を使用します。 最初の計算では、値が「6/14/2016」の日付フィールドと値が「30」の数値フィールドが使用され、2 番目の計算では、日付リテラルと数値リテラルが使用されます。

<MyDateField> + <MyNumberField> = 7/14/2016 10:00 AM
DATE'6/14/2016' + 30 = 7/14/2016 10:00 AM

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)

フィールド値を算出する際の考慮事項

  • Map Viewer 内のレイヤーにフィルターを適用している場合は、そのフィルター条件を満たしているレコードの値だけが算出されます。
  • SQL 式を作成する場合、[フィールド演算] では、フィールド名のみ使用できます。フィールド エイリアスは使用できません。 [フィールド] リストには、計算に使用できるすべてのフィールド名が表示されます。 このリストは、[文字列][数値]、および [日付] の各フィールド タイプでフィルタリングできます。
    • [フィールド] リスト内でフィールド名の上にポインターを合わせると、フィールド エイリアスとフィールド タイプが表示されます。
    • [フィールド] リスト内のフィールド名をクリックすると、フィールドが式に追加されます。
  • ホスト フィーチャ レイヤーのコピーまたは関連するタイル レイヤーがあるホスト フィーチャ レイヤーでは、フィールド値を計算できません。
  • 計算値は、ホスト フィーチャ レイヤーまたはビューから、依存するホスト シーン レイヤーには反映されません。
  • SQL 文の数値では、ロケール固有の書式設定はサポートされません。 たとえば、ロケールがスペインに設定されている場合、属性テーブル値にはカンマ区切りではなく、小数点区切りを使用する必要があります。
  • 倍精度型 (double) フィールドには、数値関数 MOD は使用できません。 次のに示すように、フィールドを整数に変換します。
  • 同期が有効化されているか、フィーチャの作成者および最終更新者を記録するように構成されているホスト フィーチャ レイヤーに対する Arcade 条件式を記述することはできません。

標準化された SQL (SQL-92) リファレンス

SQL 式を作成してフィールド値を算出する場合は、標準化された SQL を使用します。 このセクションには、ArcGIS Online での 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 式を作成することもできます。 関数には、フィールド名、リテラル、その他の関数を使用できます。 たとえば、TOTALPOPPOP18 で除算する 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 時間で返します。

クライアントに表示される内容は、使用しているクライアントによって異なります。ArcGIS Online の日付は、組織またはプロフィールのタイム ゾーンで表示されます。

CURRENT_TIME()

現在の UTC の日付と時刻 (時間、分、秒) を返します。

クライアントに表示される内容は、使用しているクライアントによって異なります。ArcGIS Online の時刻は、組織またはプロフィールの現地時間で表示されます。

CURRENT_TIMESTAMP()

現在の UTC の日付と時刻 (時間、分、秒、ミリ秒) を返します。

クライアントに表示される内容は、使用しているクライアントによって異なります。ArcGIS Online の時刻は、組織またはプロフィールの現地時間で表示されます。

EXTRACT(<unit> FROM <date>)

指定した <unit> の一部 (<date>) を返します。可能な <unit> 値には、年、月、日、時間、分が含まれます (これらに限定されません)。

  • EXTRACT(MONTH FROM 12/21/2016) - 12 を返します。
  • EXTRACT(DAY FROM 12/21/2016 12:00)- 21 を返します。
  • EXTRACT(HOUR FROM 12/21/2016 15:00)- 15 を返します。

数値関数

関数説明

ABS(<number>)

指定した数値の絶対値 (正の値) を返します。

CEILING(<number>)

指定した数値以上で、最も小さな整数を返します。

  • CEILING(12.93) - 結果は 13 です。

COS(<number>)

<number> の角度の余弦を返します。角度の単位はラジアンです。

CAST(<number>AS FLOAT | INT)

数値を別のタイプに変換します。FLOAT は指定した number を double に変換し、INT は整数に変換します。

FLOOR(<number>)

指定した number 以下の最も大きい整数を返します。

  • FLOOR(12.93) - 結果は 12 です。

LOG(<number>)

指定した number の自然対数。

LOG10(<number>)

指定した number の常用対数です。

MOD(<number>, <n>)

被除数 (<number>) を除数 <n> で除算したときの余りを返します。<n> と <number> のタイプは、整数である必要があります。

次のようなケースがあります。

  • MOD(10, 4) - 結果は 2 です。
  • MOD(CAST(DBLFIELD AS INT), 4) - DBLFIELD はタイプが double のフィールドであるため、値を double から整数に変換するために CAST 関数が必要です。

NULLIF(<number>, <value>)

指定した number が指定した値と同じ場合、null を返します。NULLIF は、<value> を 0 に設定してゼロ除算エラーを防ぐためによく使用されます。

引数のフィールド値が null であった場合、計算結果は null です。

たとえば、TOTALPOPPOP18 で除算する double フィールドを計算する必要があるとします。 フィーチャにゼロである POP18 値が含まれている場合に、この計算を実行すると、ゼロ除算エラーが発生します。この場合、POP18 がゼロであるレコードを非表示にするフィルターを作成して、計算を実行できます。この場合、NULLIF を使用すると簡単です。

  • TOTALPOP / NULLIF(POP18, 0) - POP18 がゼロと等しい場合は null を返し、それ以外の場合は TOTALPOP / POP18 の値を返します。

POWER(<number> , <y>)

指定した number を指定した乗数 (<y>) で累乗した値を返します。

ROUND(<number> , <length>)

指定する number を指定した長さに丸めます。

<length> に正の数を使用する場合、数値は <length> で指定された小数点以下の桁数に丸められます。<length> が負の数の場合、指定した <number> は小数点の左側が丸められます。

  • ROUND(10.9934,2) - 10.99 を返します。
  • ROUND(10.9964,2) - 11.00 を返します。
  • ROUND(111.0,-2) - 100.00 を返します。

SIN(<number>)

指定した <number> の角度の正弦を返します。角度の単位はラジアンです。

TAN(<number>)

指定した <number> の角度の正接を返します。角度の単位はラジアンです。

TRUNCATE(<number>,<decimal_place>)

指定した <number><decimal_place> を切り捨てます。

<decimal_place> が正の場合、指定した小数点以下の桁数に切り捨てられます。<decimal_place> が負の数の場合、<number> は小数点の左側が丸められます。

  • TRUNCATE(111.996,2) - 111.99 を返します。
  • TRUNCATE(111.996,-2) - 100.00 を返します。

文字列関数

関数説明

CHAR_LENGTH(<string>)

指定した string の文字数を返します。結果は整数です。

  • CHAR_LENGTH('Redlands') - 結果は 8 です。

CONCAT(<string1>, <string2>)

2 つの文字列値を連結します

指定できるのは、2 つの文字列だけです。3 つ以上の文字列を連結するには、次のように CONCAT 関数を連続して使用してネストします。

  • CONCAT('A', 'B') - 結果は 'AB' です。
  • CONCAT('A', CONCAT(':', 'B')) - 結果は 'A:B' です。

NULL 値は空の文字列に変換されます。

POSITION(<substring>, <string>)

指定する string 内で指定した substring が最初に現れる位置を返します。指定した substring が見つからない場合、結果は 0 になります。

  • POSITION('boat', 'Sailboat') - 結果は 5 です。
  • POSITION('motor', 'Sailboat') - 結果は 0 です。

SUBSTRING(<string>, <start>, <length>)

string の値の一部を返します。<start> は、返される文字列の開始位置を指定する整数インデックスであり、<length> は返される文字数です。

  • SUBSTRING('Sailboat', 5, 4) - 結果は 'boat' です。
  • SUBSTRING('Sailboat', 1, 4) - 結果は 'Sail' です。
  • SUBSTRING('Sailboat', 5, 100) - 結果は 'boat' です。

TRIM(BOTH | LEADING | TRAILING ' ' FROM <string>)

指定する string の先頭または末尾にあるすべての空白を削除した文字列を返します。

  • TRIM(BOTH ' ' FROM ' San Bernardino ') - 結果は 'San Bernardino' です。

2 つ目の引数は、1 つの空白を囲んだ 2 つの単一引用符である点に注意してください。

UPPER(<string>)

すべての文字を大文字に変換した文字列を返します。

  • UPPER('Sailboat') - 結果は 'SAILBOAT' です。

LOWER(<string>)

すべての文字を小文字に変換した文字列を返します。

  • LOWER('Sailboat') - 結果は 'sailboat' です。