Contents
1. 前提条件と環境設定
1‑1. GCP プロジェクトの作成・課金有効化
| 手順 | 内容 |
|---|---|
| 1 | Google Cloud コンソール (https://console.cloud.google.com) にログインし、左上メニュー → 「プロジェクトを作成」 をクリック。 |
| 2 | プロジェクト名(例:my-gis‑project)と必要なら組織を入力して 「作成」 。 |
| 3 | 左側メニューの 「請求」 → 「請求先アカウントをリンク」 から課金アカウントを選択し、プロジェクトに紐付ける。 |
ポイント
- プロジェクト作成直後は無料枠が適用されますが、データスキャンやストレージ利用分は従量課金となります。
1‑2. BigQuery API の有効化
- コンソール左上の 「ナビゲーションメニュー」 → 「APIs とサービス」 → 「ライブラリ」 を開く。
- 検索バーに BigQuery API と入力し、表示されたカードの 「有効化」 をクリック。
- ステータスが 「有効」 になることを確認(数秒かかる場合があります)。
1‑3. IAM ロールの最小権限付与
| 推奨ロール | 主な権限 | 用途例 |
|---|---|---|
roles/bigquery.admin |
プロジェクト全体の管理(データセット作成・削除) | 開発リーダー、インフラ担当 |
roles/bigquery.dataEditor |
データセットへの書き込み | ETL パイプライン実装者 |
roles/bigquery.user |
クエリ実行のみ | アナリスト・BI ユーザー |
設定手順
1. コンソール左側 「IAM と管理」 → 「IAM」 を開く。
2. 対象ユーザー(またはサービスアカウント)を検索し、「ロールの追加」 から上記ロールを選択して保存。
ベストプラクティス:最小権限の原則に従い、必要なロールだけ付与してください。
2. データインポートと GEOGRAPHY 型への変換
2‑1. 対応フォーマットとロード手順
| フォーマット | 推奨ロード方法 | 主な注意点 |
|---|---|---|
| CSV(WKT) | スキーマで location:GEOGRAPHY を明示し、bq load --source_format=CSV … を実行 |
WKT に余計な空白や改行が混入すると Invalid geography エラーになるため事前に正規化 |
| GeoJSON | 文字列としてロード後、クエリ内で ST_GEOGFROMGEOJSON(geojson_column) に変換 |
type キーと同名の属性がある場合は別名にリネームしてから変換 |
| Parquet | Parquet の binary / string フィールドを自動検出で GEOGRAPHY とマッピング(スキーマ自動検出) |
スキーマが正しく認識されないと STRING になるので、必要に応じて手動で location:GEOGRAPHY を上書き |
CSV のロード例
|
1 2 3 4 5 6 |
bq load \ --source_format=CSV \ mydataset.points \ gs://my-bucket/points.csv \ location:GEOGRAPHY,category:STRING |
GeoJSON の変換例(クエリ)
|
1 2 3 4 5 6 |
CREATE OR REPLACE TABLE mydataset.geojson_points AS SELECT id, ST_GEOGFROMGEOJSON(geojson) AS geom FROM `mydataset.raw_geojson`; |
3. GoogleSQL 標準関数で行う基本 GIS 操作
3‑1. 主な GEOGRAPHY 関数とサンプルクエリ
| 関数 | 説明 | サンプル |
|---|---|---|
ST_GEOGFROMTEXT(text) |
WKT 文字列 → GEOGRAPHY |
SELECT ST_GEOGFROMTEXT('POINT(139.6917 35.6895)') AS pt; |
ST_INTERSECTS(a, b) |
2 つのジオメトリが交差するか判定 | WHERE ST_INTERSECTS(city_geom, ST_GEOGFROMTEXT('POLYGON((…))')) |
ST_UNION(g1, g2) |
複数ジオメトリを結合(多角形の統合) | SELECT ST_UNION(g1, g2) FROM …; |
ST_BUFFER(geog, radius_meters[, max_error]) |
指定半径(メートル単位)のバッファ領域を生成。第 3 引数は許容誤差(メートル)で、精度調整に利用可能 | SELECT ST_BUFFER(ST_GEOGFROMTEXT('POINT(-122.084 37.422)'), 5000) AS buf; |
ST_AREA(geog) |
ジオメトリの面積を 平方メートル で取得(自動的に等距離投影へ変換) | SELECT ST_AREA(polygon_geom) FROM …; |
重要:
ST_BUFFERは「2026 年に単位指定が追加された」わけではなく、リリース時点から半径は常にメートルで扱われます。第 3 引数の max_error は精度を細かく制御したい場合のみ使用します。
3‑2. 実務的なクエリ例(米国 TIGER/Line データと POI の集計)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
-- 1️⃣ POI テーブル (ポイント) を GEOGRAPHY に変換 WITH poi AS ( SELECT id, ST_GEOGFROMTEXT(location_wkt) AS geom FROM `mydataset.us_poi_points` ) -- 2️⃣ 都道府県(州)テーブルと交差件数を集計 SELECT state.name AS state_name, COUNT(p.id) AS poi_count, SUM(ST_AREA(state.geometry)) / 1e6 AS area_sqkm -- 面積を km² に変換 FROM `bigquery-public-data.census_bureau.tiger_lines` AS state JOIN poi p ON ST_INTERSECTS(state.geometry, p.geom) GROUP BY state_name ORDER BY poi_count DESC; |
上記クエリは、公共データセット bigquery-public-data.census_bureau.tiger_lines(州境界)と自前の POI テーブルを組み合わせて、州ごとのポイント数を算出しています。
4. 公共ジオスペーシャルデータセットの活用例
4‑1. データ取得・コピー手順
|
1 2 3 4 5 6 7 8 9 10 |
# US TIGER/Line(州境界)テーブルを自プロジェクトへコピー bq cp \ bigquery-public-data.census_bureau.tiger_lines \ mydataset.us_state_boundaries # OpenStreetMap の道路データ(ライン)をコピー bq cp \ bigquery-public-data.geo_openstreetmap.planet_line \ mydataset.osm_roads |
ポイント:
bq cpはテーブル全体をコピーしますが、必要なカラムだけに絞り込む場合はCREATE TABLE … AS SELECT …を併用するとコスト削減につながります。
4‑2. 行政区画と道路の結合例
|
1 2 3 4 5 6 7 8 9 10 |
SELECT s.state_name, COUNT(r.id) AS road_count, SUM(ST_LENGTH(r.geometry)) / 1000 AS total_road_km -- メートル → キロメートル FROM `mydataset.us_state_boundaries` AS s JOIN `mydataset.osm_roads` AS r ON ST_INTERSECTS(s.geometry, r.geometry) GROUP BY s.state_name ORDER BY road_count DESC; |
4‑3. クエリ実行前のプレビューとコスト確認
- UI のクエリエディタ右上にある 「プレビュー」 ボタンをクリック → スキャン予定データサイズが表示されます。
- 「ジョブ」ページで実行履歴と課金情報をリアルタイムに監視できます。
5. パフォーマンス最適化・コスト管理
5‑1. パーティション/クラスタリングの設計指針
| 手法 | 設定例 | 効果 |
|---|---|---|
| パーティション | PARTITION BY DATE(event_timestamp)(日時系データ) |
スキャン対象を日単位で絞り込み、不要スキャンを回避 |
| クラスタリング | CLUSTER BY ST_GEOGPOINT(lon, lat)(ポイントテーブル) |
空間的に近いレコードが同一ブロックに格納され、ST_INTERSECTS のフィルタ効率が向上 |
ベストプラクティス:クラスタリングはジオメトリ列自体ではなく、緯度・経度を数値化したカラム(例:
lon,lat)で行うと最適です。
5‑2. 料金シミュレーションと予算アラート
- コンソール左側 「料金」 → 「料金見積もり」 から、テーブルサイズとクエリ頻度を入力し月額概算を取得。
- 「予算とアラート」 で新規予算を作成し、上限の 80 % 超過時にメール通知を設定すると、想定外の請求を防げます。
5‑3. クエリ最適化テクニック
- 必要な列だけ
SELECT→ プロジェクションプッシュダウン によりスキャン量が削減。 ST_INTERSECTSの前に サブセット抽出(例:州コードで絞り込み)を行う。- 大規模結合は
WITH句で事前集計 してから結合するとジョブ実行時間が短縮。
6. 可視化 – Looker Studio(旧 Data Studio)
6‑1. データソース接続手順
- Looker Studio (https://lookerstudio.google.com) にログインし、「データソース」 → 「Google BigQuery」 を選択。
- プロジェクト・データセット・テーブル(例:
mydataset.state_road_stats)を指定して接続。
6‑2. GIS ウィジェットでのマッピング
| 手順 | 操作 |
|---|---|
| 1 | レポート編集画面で 「チャートを追加」 → 「ジオマップ」 を選択。 |
| 2 | 「ジオメトリ」フィールドに geometry(GEOGRAPHY)列をドラッグ。 |
| 3 | 色分けは数値指標(例:road_count、total_road_km)で設定し、グラデーションやシンボルサイズを調整。 |
| 4 | 「フィルタコントロール」に state_name を追加すれば、ユーザーが興味のある州だけを表示可能。 |
ヒント:ジオマップは自動的に投影変換を行うため、メートル単位で計算した面積・距離も正しく描画されます。
7. まとめ
- 環境構築:プロジェクト作成 → 課金リンク → API 有効化 → 最小権限ロール付与
- データロード:CSV/WKT、GeoJSON、Parquet のいずれも
GEOGRAPHY型へ安全にインポート可能 - GIS 関数:
ST_BUFFERは半径をメートルで扱う点に注意し、必要なら第3引数で精度調整 - 公共データセット活用:
bigquery-public-data.census_bureau.tiger_linesなどをコピーしてローカルテーブル化すれば高速クエリが実現 - コスト最適化:パーティション・クラスタリング、プレビュー機能、予算アラートで無駄なスキャンを防止
- 可視化:Looker Studio のジオマップウィジェットで、BigQuery の
GEOGRAPHY列をそのまま地図に描画
上記の手順とベストプラクティスに従えば、2026 年版 Google Cloud が提供する最新機能を最大限活用し、費用対効果の高い本格 GIS 分析基盤 を短期間で構築できます。