carto-spatial-enrichment について
carto-spatial-enrichment は、CARTO Workflows で人口統計やリスクスコアなどを空間データに付加するスキルです。グリッド方式と直接方式を説明し、それぞれの選び方を示します。
主な機能
- 01ポイントとポリゴンを直接エンリッチ
- 02バッファーと等時間圏を作成
- 03H3 または Quadbin で領域を索引化
- 04空間インデックスでデータを結合
- 05結果を元のエンティティ単位に集計
活用シーン
- 01店舗位置に人口統計データを追加
- 02地点や領域の周辺リスクを評価
- 03グリッドデータからエンティティ別の合計を算出
MCP 対応
エンリッチメントは専用の MCP ツールではなく、CARTO Workflows で実行すると説明しています。MCP サーバー接続時は create_workflow、validate_workflow、run_workflow などのワークフローツールを利用します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ cartodb/ agent-skills --skill carto-spatial-enrichmentインストール後、Claude Code で/carto-spatial-enrichmentを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
enrich_grid.jsonenrich_points.jsonestimate_population_around_retail_stores.json詳細
CARTO ワークフローにおける空間エンリッチメント
前提条件:開発プロセスについては carto-create-workflow を読み込んでください。これは、両方のアクセス方法(接続時に使用する MCP サーバーのワークフローツール(create_workflow、validate_workflow、run_workflow など)、それ以外の場合に使用する carto workflows CLI、および carto-basics/references/access-paths.md に記載されたルーティングシグナル)を説明しています。エンリッチメント用の直接的な MCP ツールはありません。エンリッチメントは常にワークフローとして実行されるため、これらのワークフローツールを経由してください。
このスキルでは、デモグラフィックデータ、リスクスコア、または空間フィーチャーデータセットの任意の変数を使って空間データをエンリッチするための汎用パターンを説明します。
手順
5 ステップの汎用エンリッチメントパターンに従ってください。各ステップは 1 つ以上のワークフローコンポーネントに対応しています。
Step 1: ソースデータを読み込む
エンリッチメントが必要な事業体(店舗、ポイント、ポリゴン)を読み込みます。
- テーブルからポイントまたはポリゴンを読み込む場合:
ReadTableソースノードを使用します - カスタムジオメトリの場合:
native.tablefromgeojsonを使用して GeoJSON ポリゴンをインラインで指定します
Step 2: 対象エリアを定義する
ユースケースに基づいて、次のいずれかの方法を選択します。
| 方法 | コンポーネント | 使用する状況 |
|---|---|---|
| バッファー | native.buffer | 距離に基づくエリア(例:各店舗の周囲 1km) |
| 等時間圏 | native.isolines | 車または徒歩での所要時間に基づくエリア |
| 直接ポリゴン | (不要) | ソースデータがすでにポリゴンの場合 |
| 直接ポイント | (不要) | Step 4 の native.enrichpoints までスキップします |
Step 3: 空間インデックス作成(ポリフィル)
エリアをエンリッチメント用のグリッドに変換します。グリッドベースのエンリッチメント(native.h3enrich)または手動 JOIN を使用する場合、このステップは必須です。
- H3 グリッド(最も一般的):
native.h3polyfill—resolutionをエンリッチメントデータセットに合わせて設定します - Quadbin グリッド:
native.quadbinpolyfill—resolutionをエンリッチメントデータセットに合わせて設定します
重要な判断 — インデックスタイプ:エンリッチメントデータがネイティブに Quadbin 形式でない限り、H3 を使用します。
Step 4: エンリッチする
出力列の命名方法が異なる 2 つのアプローチがあります。
A) CARTO ENRICH プロシージャ(Data Observatory または空間フィーチャーデータの場合に推奨):
native.h3enrich— H3 グリッドをエンリッチしますnative.enrichpoints— ポイントを直接エンリッチします(Step 3 をスキップ)native.enrichpolygons— ポリゴンを直接エンリッチします(Step 3 をスキップ)- 出力列は
{variable}_{aggregation}という名前になります(例:population_sum、air_quality_avg)
native.enrichpolygons と native.spatialjoin + native.groupby の比較 — どちらもグリッドのステップ(Step 3)を省略し、ソースデータセットを対象ポリゴンに直接集約します。次のトレードオフを考慮して選択してください。
| アプローチ | メリット | デメリット |
|---|---|---|
native.enrichpolygons | ノードが 1 つ;Workflows に専用 UI がある;意味が最も明確 | Analytics Toolbox に依存;結合後の中間行を確認できない;集約方法が SelectColumnAggregation リストに制限される |
native.spatialjoin + native.groupby | AT に依存しない;結合後の中間テーブルを Workflows で確認できる;結合述語(intersects / covers / touches)、結合タイプ、列のエイリアスを完全に制御できる | ノードが 2 つ;冗長;スキーマを簡潔に保つには、空間結合で maintablecolumns / secondarytablecolumns を設定する必要がある |
ソース 1 つのデータを対象ポリゴンに単純に合計または平均する場合は、既定で native.enrichpolygons を使用してください。既定以外の述語、同じ列に対する複数の集約、または中間結合の確認が必要な場合は、native.spatialjoin + native.groupby に切り替えてください。ポイントを対象とする場合の native.enrichpoints と、それに相当する spatialjoin + groupby のチェーンにも同じトレードオフが当てはまります。
B) 空間インデックス列を使った手動 JOIN:
- H3/Quadbin 列を結合キーとして、
native.joinを使用します - セカンダリテーブルの出力列には
_joinedサフィックスが付きます - 既定値は INNER JOIN です(一致しないセルは通知なしに除外されます)
集約方法の指針:
SUM— 人口数、合計値MAX/MIN— リスクスコア、しきい値AVG— 品質指標、インデックス
ステップ 5:結果を保存する
native.saveastable を使用して、エンリッチメントした出力を保存します。
店舗ごとの人口など、エンティティ単位のエンリッチメントが目的の場合は、2つ目の JOIN + GROUP BY を追加して、グリッドレベルの結果を元のエンティティレベルに集約し直します。
成功条件:ソースデータを読み込み、エリアを定義し、正しい集約方法でエンリッチメントして保存する、検証済みのワークフローが完成していること。後続のカラム参照が、使用したエンリッチメント方法と一致している必要があります。create_workflow(MCP)または carto workflows create(CLI)を使用してアップロードします。
注意点
- プロバイダーの大文字・小文字と SQL 方言。 このスキルでは出力カラム名を小文字(
population_sum、air_quality_avg、<column>_joinedなど)で記載しています。これは BigQuery/Databricks/Postgres/Redshift の慣例です。Snowflake では、引用符で囲まれていない識別子は大文字で表示されるため、POPULATION_SUM、AIR_QUALITY_AVG、<COLUMN>_JOINEDとして参照してください。大文字・小文字の規則と SQL 方言の対応については、carto-create-workflow/references/providers/<provider>.mdを参照してください。 - 解像度の一致が重要です。 ポリフィルの解像度は、エンリッチメント対象データセットのネイティブ解像度と必ず一致させてください(例:解像度 8 の空間フィーチャーには H3 解像度 8)。一致しない場合、エラーが発生せずに JOIN の一致件数がゼロになります。
- 手動 JOIN では一致しないセルが除外されます。
native.joinはデフォルトで INNER JOIN を使用し、エンリッチメントデータのないセルを暗黙的に除外します。網羅性が重要な場合は LEFT JOIN を使用してください。 - ポリフィルの後に重複を除去します。
SELECT DISTINCTまたはインデックスカラムでの GROUP BY を使用して、重複セルを除去します。どの店舗から各セルが生成されたかなど、ソースの識別情報を保持する必要がある場合は、ポリフィルノードでincludecols: trueを設定してください。 - カラム名は方法によって異なります(ステップ 4 を参照)。ENRICH プロシージャでは
{variable}_{aggregation}、手動 JOIN では{column}_joinedが生成されます。 - バッファー距離の単位はメートルです。 等時線の範囲の単位はタイプによって異なり、時間ベースでは秒、距離ベースではメートルです。
- エンティティレベルの結果には再集約が必要です。 グリッドエンリッチメントのデータはセルレベルのままです。店舗ごと/場所ごとの合計に集約し直すには、2つ目の JOIN + GROUP BY を追加してください(ステップ 5 を参照)。
参照テンプレート
このスキルフォルダーには、CARTO Workflows のテンプレートリポジトリから取得したテンプレートが含まれています。
| ファイル | パターン | 説明 |
|---|---|---|
| enrich_grid.json | GeoJSON ポリゴン -> H3 ポリフィル -> ENRICH_GRID | カスタムエリアを社会人口統計 H3 データでエンリッチメントします |
| enrich_points.json | ポイントをフィルター -> ENRICH_POINTS | ポイントの位置をポリゴンベースのリスクデータでエンリッチメントします |
| estimate_population_around_retail_stores.json | ポイント -> バッファー -> H3 ポリフィル -> JOIN -> GROUP BY | 再集約を含む、完全なエンティティレベルのエンリッチメントです |
よくあるバリエーション
| バリエーション | 使用するステップ | 主な違い |
|---|---|---|
| ポイントを直接エンリッチメントする | 1 -> 4 -> 5 | グリッドを省略し、native.enrichpoints を使用します |
| ポリゴンを直接エンリッチメントする | 1 -> 4 -> 5 | グリッドを省略し、native.enrichpolygons を使用します |
| バッファー + グリッドエンリッチメント | 1 -> 2 -> 3 -> 4 -> 5 | native.buffer の後にポリフィルを行い、エンリッチメントします |
| 等時線 + グリッドエンリッチメント | 1 -> 2 -> 3 -> 4 -> 5 | native.isolines の後にポリフィルを行い、エンリッチメントします |
| ソースエンティティに再集約する | 1 -> 2 -> 3 -> 4 -> JOIN + GROUP BY -> 5 | 2つ目の JOIN を追加して、セルをソースエンティティに対応付けます |