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

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

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

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

時系列による場所データ

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

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

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

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

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

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

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

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

集約結果の例

測候所の位置を保存する weather_stations という名前のフィーチャクラスについて検討します。 各測候所フィーチャは、station_id フィールドに保存された値によって一意に特定されます。 このフィールドは、observed_rainfall という名前のテーブル内の関連する観測記録と測候所をリンクする際に使用されます。 このテーブルでは、同一地点で時間経過とともに収集された降水量の観測記録が保持されます。 このテーブルには、測候所のフィーチャクラスにリンクする station_id フィールド、毎日の降水量をセンチメートル単位で保存する rainfall_cm フィールド、および降水が発生した日付を保存する collection_date フィールドが含まれます。

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

この目的は、各測候所における所定期間 (1 か月、1 年、任意の期間など) の合計降水量を計算し、その期間で計算された合計降水量によって測候所をシンボル表示することです。 これを実行するには、次の 2 つの方法があります。

最初の方法では、クエリ レイヤー パラメーターを定義することで、下記のシンプルまたは高度な方法によって集約結果を動的に計算します。 2 つ目の方法では、ジオプロセシング ツールまたはデータベース関数を使用して結果を事前計算します。

集約クエリ レイヤーの作成 (Make Aggregation Query Layer) ジオプロセシング ツールの実行

[集約クエリ レイヤーの作成 (Make Aggregation Query Layer)] ツールを実行して、クエリ レイヤーを構築し、クエリ パラメーターを定義して、結果を表示できます。 この方法はより柔軟性の高い方法であり、最新の結果が確実に表示されます。 このツールは、データベースの SQL 集約関数と結合機能を使用して、情報を集計、集約、フィルター処理します。

[集約クエリ レイヤーの作成 (Make Aggregation Query Layer)] ツールでは、目的の時間範囲を事前定義してその範囲ごとに結果を計算するのではなく、クエリ レイヤーで時間を有効化して、さまざまな期間を動的に表示できます。

  1. マップを開いた状態で、[解析] タブの [ジオプロセシング] グループにある [ツール] ツール をクリックします。
  2. [ジオプロセシング] ウィンドウの [ツールボックス] タブで、[データ管理ツール] > [レイヤーとテーブル ビュー] > [集約クエリ レイヤーの作成 (Make Aggregation Query Layer)] の順にクリックします。 ツールをクリックして開きます。
  3. シナリオ例に従って、ツールのプロパティを次のように設定します。
    • [パラメーター] タブで、[ターゲット フィーチャクラス] パラメーターを weather_stations フィーチャクラスに設定します。
    • [サマリー テーブル] パラメーターとして、observed_rainfall を設定します。
    • ターゲットおよび関連付けられる結合フィールドを station_id に設定し、出力レイヤー名を入力します。
    • サマリー フィールドの集約タイプとして SUM を選択します。 [フィールド名] で、rainfall_cm を選択します。
    • [パラメーターの定義] で、パラメーター タイプとして [範囲] を選択し、名前 (たとえば、「timeWindow」) を指定します。 この設定により、クエリ レイヤーで時間が有効になります。
    • [フィールドまたは式] パラメーターを collection_date フィールドとして定義します。
    • [データ タイプ] パラメーターを [日付] として指定します。
    • 必要に応じて、その他のパラメーターを確認および設定します。 一部のパラメーターは、上記の選択に基づいて自動的に設定されます。
  4. ツールを実行します。 時間対応のクエリ レイヤーが、マップおよび [コンテンツ] ウィンドウに追加されます。
  5. クエリ レイヤーの属性テーブルを開きます。 SUM_rainfall_cm という追加のフィールドに、すべてのレコードを使用した合計降水量が表示されます。

タイム スライダーを有効にして、任意の時間範囲に移動できます。 移動中、マップの現在の時間範囲に対して値が再計算されます。 必要に応じて、属性を使用して、測候所ポイント フィーチャをシンボル表示およびラベル付けすることもできます。 このツールの詳細については、「集約クエリ レイヤーの作成 (Make Aggregation Query Layer)」をご参照ください。

クエリ レイヤーの手動構築

クエリが高度なキーワードまたはパラメーターを使用する場合は、クエリ レイヤーを手動で構築する必要が生じることがあります。 次に、例を示します。

  • 定義済みの不連続パラメーター (view_scale や view_extent など)
  • 複数の結合、または外部結合を含む SQL クエリ

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

  • マップをナビゲートする、タイム スライダーを使用する、または属性テーブルを開くといった操作を実行するたびに集約結果が計算されるため、データベースでの読み込みが増加する可能性があります。 このような読み込みの増加は、小規模なデータセットでは無視できます。また、大規模なデータセットであっても、タイム ウィンドウによって比較的小規模なサブセットが返される場合は無視できます。
  • この方法では、データをエンタープライズ データベースに保存する必要があります。 この方法は、ファイル ジオデータベースおよびシェープファイルでは使用できません。

データの更新が頻繁に行われる場合は、データをエンタープライズ データベースに移行し、データベースでの読み込みの増加に対応することを検討してください。 データベース メンテナンス (インデックスの作成など) のベスト プラクティスに従っていることを確認してください。

クエリ レイヤーを手動で構築するには、次の手順に従います。

  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)] ツールを使用して、サマリー結果のあるテーブルを作成します。 この例では、サマリーは各測候所の月間合計降水量です。 次のようにパラメーターを入力します。
    • [統計フィールド] : 集計対象のフィールドを選択します。 この例では、降水量フィールドです。
    • [統計の種類] : 合計降水量の計算に [合計] を選択します。
    • [ケース フィールド] : 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 スケジューラを使用して、結果を事前計算するタスクが定期的に実行されるようスケジュール設定できます。

関連トピック