関連フィーチャへの値の集約

通常、フィーチャは属性値に基づいてマップ内でシンボル表示されます。都市が人口でシンボル表示されている例や道路が道路分類でシンボル表示されている例などがあります。一方で、集約された計算値でフィーチャをシンボル表示する必要がある場合もあります。計算値の例として、最小値、最大値、平均値、合計値があります。これらの値は、集約された値セットの属性から計算されるものです。

テンポラル データのシナリオ

集約された値でデータをシンボル表示することが有益なシナリオは主に 2 つあります。

時系列による場所データ

これは、固定位置において時間経過とともに変化する数量のデータです。定期的または不定期に、これらの位置で時間経過に伴うフィーチャの観測、収集、または予測が行われます。例としては、河川沿いの測候所または観測所で測定される気温、降水量、水位、塩分濃度、排出物などがあります。

たとえば、7 月の合計降水量または年間の最高気温もしくは最低気温によって、測候所フィーチャをシンボル表示することができます。この方法でデータを視覚化するには、固定位置がフィーチャクラスに保存され、観測データが日時属性とともに関連テーブルに保存されるようにデータをモデル化します。

タイム スタンプによる散在データ

これは、ある時間に単一ポイントで発生したイベントを表すフィーチャです。例としては、竜巻の発生場所、顧客の住所、病院に収容された患者、犯罪の発生場所などがあります。

たとえば、竜巻の総被害額、購入総額、または患者総数を都道府県、地区、またはその他の行政区分などのポリゴン フィーチャに集約して表示することができます。この方法でデータを視覚化するには、位置が日時属性とともにフィーチャクラスに保存されるようにデータをモデル化します。

データを集約表示するための準備

集約結果でフィーチャを表示する場合、次の事項を検討します。

  • 集約タイプ - 合計値、最小値、最大値、平均値、その他の数値のいずれを表示するかを決定します。
  • 表示フィーチャ - どのフィーチャで集約結果を表示するかを決定します。これらのフィーチャは、観測データによるフィーチャと同じであっても異なっていてもかまいません。たとえば、各測候所の年間の合計降水量を表示することもできますし、国または集水域の区分に基づいて年間の合計降水量 (個々の測候所のポイント フィーチャで測定) を表示することもできます。
  • クエリ パラメーター:
    • 時間 - 集約結果を表示する時間範囲と時間間隔を決定します。タイム スライダーを使用して、これらの値を動的に設定します。たとえば、毎日結果を集約する場合、タイム スライダーの時間範囲と時間間隔の両方を 1 日に設定します。
    • 範囲 - フィーチャのサブセットの結果のみを集約する場合に使用します。たとえば、0 ~ 50 メートルの間の塩分濃度測定値と 50 ~ 75 メートルの間の塩分濃度測定値を集約するには、範囲パラメーターとレンジ スライダーを使用します。
    • クエリ フィルター - 各警察管区内の犯罪タイプを集約することで、犯罪データのパターンを確認するには、不連続パラメーターを使用してクエリ フィルターを作成します。
    このワークフローでは、クエリ パラメーターはオプションです。不連続パラメーターを使用して範囲パラメーターを追加しフィルターを追加する方法については、「クエリ レイヤーのパラメーターの定義」をご参照ください。

集約結果の例

測候所の位置を保存する weather_stations という名前のフィーチャクラスについて検討します。各測候所フィーチャは、station_id フィールドに保存された値によって一意に特定されます。このフィールドは、observed_rainfall という名前のテーブル内の関連する観測記録と測候所をリンクする際に使用されます。このテーブルでは、同一地点で時間経過とともに収集された降水量の観測記録が保持されます。このテーブルには、測候所のフィーチャクラスにリンクする station_id フィールド、毎日の降水量をセンチメートル単位で保存する rainfall_cm フィールド、および降水が発生した日付を保存する collection_date フィールドが含まれます。この目的は、各測候所における所定期間 (1 か月、1 年、任意の期間など) の合計降水量を計算し、その期間で計算された合計降水量によって測候所をシンボル表示することです。これを実行するには、次の 2 つの方法があります。

クエリ レイヤー パラメーターで集約結果を動的に計算します。

この方法はより柔軟性の高い方法であり、最新の結果が確実に表示されます。データベースの SQL 集約関数と結合機能を使用します。これを実行するには、ArcGIS Pro で、クエリ レイヤーを作成する必要があります。

ただし、この方法には欠点もあります。次のようなものがあります。

  • マップをナビゲートする、タイム スライダーを使用する、または属性テーブルを開くといった操作を実行するたびに集約結果が計算されるため、データベースでの読み込みが増加します。
  • この場合、データをエンタープライズ データベースに保存する必要があります。この方法は、ファイル ジオデータベースおよびシェープファイルでは使用できません。

データの更新が頻繁に行われる場合は、データをエンタープライズ データベースに移行し、データベースでの読み込みの増加に対応することを検討してください。

  1. [マップ] タブの [レイヤー] グループで、[データの追加] メニューを開いて、[クエリ レイヤー] をクリックします。
  2. [クエリ] ボックスで、集約結果を返す SQL クエリを構築します。

    observed_rainfall テーブルから、各測候所の合計降水量を選択します。

    SELECT   station_id, SUM(rainfall_cm) AS total_rainfall
    FROM     observed_rainfall
    GROUP BY station_id

    結果を weather_stations フィーチャクラスに結合します。 これにより、observed_rainfall テーブルのすべてのレコードを使用して合計降水量が返されます。

    SELECT  w.*, r.total_rainfall
    FROM    weather_stations AS w 
    INNER JOIN
            (SELECT   station_id, SUM(rainfall_cm) AS total_rainfall
             FROM     observed_rainfall
             GROUP BY station_id) AS r 
    ON w.station_id = r. station_id

    集約結果を計算する Where 句の時間範囲を 2016 年 6 月 1 日から 2016 年 6 月 30 日に設定します。

    SELECT  w.*, r.total_rainfall FROM    weather_stations AS w INNER JOIN        (SELECT   station_id, SUM(rainfall_cm) AS total_rainfall         FROM     observed_rainfall         WHERE    collection_date >= '6/1/2016' AND collection_date <= '6/30/2016'         GROUP BY station_id) AS r ON w.station_id = r.station_id
  3. [次へ] をクリックし、[新しいクエリ レイヤー] ダイアログ ボックスの手順を完了し、現在のマップにクエリ レイヤーを追加します。
  4. レイヤーをシンボル表示して、2016 年 6 月の各地点における合計降水量で測候所を表示します。たとえば、等級または比例シンボルを使用して、合計降水量に応じてフィーチャのサイズを設定したり、等級または未分類のカラー シンボルを使用して、各測候所に各種の色を使用したりできます。

表示は同じままで、たとえば、8 月 1 日から 15 日までに時間範囲を変更する場合は、クエリ レイヤーのソースを開いて、Where 句を変更する必要があります。この操作は面倒であるため、タイム スライダーを使用してこの変更を行うことをお勧めします。タイム スライダーを使用して Where 句を変更するには、SQL ステートメントのパラメーターを使用する必要があります。

  1. [コンテンツ] ウィンドウでレイヤーを右クリックし、[プロパティ] プロパティ をクリックします。
  2. [ソース] タブで、テーブルの [クエリ] 行の [クエリの編集] メタデータの編集 をクリックします。クエリは、[クエリ] テキスト ボックスに表示されます。
    ヒント:

    クエリの文字を読みやすくするには、Ctrl キーを押したままマウス ホイールを前方向に回転させることで表示を拡大できます。

  3. WHERE collection_date >= '6/1/2016' AND collection_date <= '6/30/2016' を範囲パラメーターに置き換えます。範囲パラメーターは、::r: という接頭辞付きで宣言されています。

    Where 句が TimeVar という名前の範囲パラメーターに置き換わります。

    SELECT  w.*, r.total_rainfall
    FROM    weather_stations AS w 
    INNER JOIN
            (SELECT   station_id, SUM(rainfall_cm) AS total_rainfall
             FROM     observed_rainfall
             WHERE    ::r:TimeVar
             GROUP BY station_id) AS r 
    ON w.station_id = r.station_id
  4. パラメーターが SQL クエリに太字で表示され、その横にアイコン メタデータの編集 が表示されます。アイコンをクリックして、次のようにパラメーターのプロパティを設定します。
    • フィールドまたは式: collection_date
    • データ タイプ: 日付
    • デフォルト値: オン
    • デフォルトの値範囲: 6/1/20166/30/2016
  5. [終了] をクリックします。
  6. [クエリの編集] ダイアログ ボックスで、[整合チェック] をクリックしてエラーがないか確認します。

範囲パラメーターが日時フィールドを参照するため、レイヤーが時間対応となっています。時間対応レイヤーは、タイム スライダーで制御できます。たとえば、タイム スライダーを使用して時間範囲を選択すると、測候所は、その時間範囲に対して動的に計算される合計降水量で表示されます。

  • 月間合計値の場合、[現在の時間] の [間隔] と [ステップ間隔] の両方を 1 か月に設定します。
  • 移動平均値の場合、[現在の時間] の [間隔] を 1 か月に設定し、[ステップ間隔] を 1 日に設定します。この場合、タイム スライダーで間隔をクリックするたびに次の日に移動し、その日から 1 か月間の結果が表示されます。

ヒント:

属性テーブルの [表示] タブで、[時間] フィルターと [範囲] フィルターの両方を有効にして、マップに表示できるフィーチャのみを表示します。この設定をしない場合、テーブル全体からすべてのフィーチャの結果が計算されるため、テーブルに多くのレコードが含まれていると動作が遅くなる可能性があります。

結果の事前計算

頻繁に更新されるデータを処理している状況で、事前設定された時間範囲をそのまま使用できるときは、この方法が便利です。この場合、集約結果を事前計算することで、マップが更新される、属性テーブルが開く、またはレイヤーが検索されるといった操作のたびにデータベースで発生する読み込みを軽減します。

この方法には、次のような欠点があります。

  • データが更新されるたびにこれらの手順を実行する必要があります。
  • これは柔軟性が高いとは言えません。週間および年間の結果でフィーチャを視覚化するには、2 つの別々のテーブルが必要です。1 つは 1 週間の集約結果の保存に使用され、もう 1 つは 1 年間の結果の保存に使用されます。
  • この方法でタイム スライダーは使用できません。

集約結果を事前計算するには、2 つの方法があります。

ジオプロセシングの使用

次の例では、ジオプロセシング ツールを使用して各測候所の月間の平均降水量を事前計算する手順を示しています。

  1. フィーチャクラスに、月を表す month という名前の新しい整数フィールドを追加します。
  2. [フィールド演算 (Calculate Field)] ツールを使用して、レコードを更新します。

    [式] パラメーターを month = getMonth(!DateTime!) に設定します。

    [コードブロック] パラメーターに次を入力します。この例では、vdatetime 属性の値です。

    from datetime import datetime
    def getMonth(v):
        d = datetime.strptime(v, "%m/%d/%Y")
    return d.month
  3. [要約統計量 (Summary Statistics)] ツールを使用して、サマリー結果のあるテーブルを作成します。この例では、サマリーは各測候所の月間合計降水量です。次のようにパラメーターを入力します。
    • 統計フィールド: 集計対象のフィールドを選択します。この例では、降水量フィールドです。
    • 統計の種類: 合計降水量の計算に [SUM] を選択します。
    • ケース フィールド: station_id フィールドと month フィールドを選択します。
  4. [フィールドの結合 (Join Field)] ツールまたは [テーブルの結合 (Add Join)] ツールを使用して、サマリー テーブルからフィーチャ レイヤーにレコードを結合します。
  5. 特定の月の結果を表示するには、フィルター設定を指定して、マップのレイヤーを表示します。たとえば、5 月の結果のみを表示するには、Month = 5 のフィルター設定を使用します。

データベース関数の使用

データがエンタープライズ データベースに保存されている場合、SQL クエリを使用して、集約結果またはサマリー結果を事前計算し、それらを別々のテーブルに保存できます。

  1. データベース クライアントで次の SQL クエリを実行します。これにより、各測候所の月間平均値が計算されます。クエリでは、月を表す整数を保存するフィールドがあることが前提となっています。
    SELECT   station_id, month, SUM(rainfall_cm) AS total_rainfall
    INTO     avg_monthly_rainfall
    FROM     observed_rainfall
    GROUP BY station_id, month
  2. データベースがジオデータベースである場合は、パフォーマンスを最適化するためにテーブルをジオデータベースに登録し、テーブルをフィーチャ レイヤーに結合させます。

    [コンテンツ] ウィンドウでフィーチャ レイヤーを選択します。[フィーチャ レイヤー] タブの [データ] タブの [リレーションシップ] グループで、[結合] をクリックして、[テーブルの結合] をクリックします。

  3. データベースがジオデータベースではない場合は、次のいずれかの方法を選択する必要があります。
    • データベースに、ジオメトリを格納するテーブルと新しく作成されたサマリー テーブルを結合するビューを作成します。
    • クエリ レイヤーを作成し、クエリ レイヤーのソースで結合を定義します。
  4. 特定の月の結果を表示するには、フィルター設定を指定して、マップのレイヤーを表示します。たとえば、5 月の結果のみを表示するには、Month = 5 のフィルター設定を使用します。
ヒント:

Windows スケジューラを使用して、結果を事前計算するタスクが定期的に実行されるようスケジュール設定できます。

関連トピック