Contents
1️⃣ BigQuery GIS の概要と代表的な活用シーン
| 特徴 | 説明 |
|---|---|
| スケーラビリティ | データ量がペタバイト規模でも、BigQuery の分散クエリエンジンが自動でスケールし、ストレージとコンピュートが独立しているためパフォーマンスが維持されます。 |
| 標準 GIS 型 | GEOGRAPHY データ型は WGS84(EPSG:4326)に完全対応。座標系変換や投影の手間が不要です。 |
| SQL だけで完結 | 空間関数はすべて SQL として提供され、外部ツールを介さずに分析・可視化が可能です。 |
主なユースケース
| ユースケース | ビジネス効果 | 代表的クエリ例 |
|---|---|---|
| 店舗最適配置 | 潜在顧客数をリアルタイムで把握し、出店判断の精度向上 | ST_DWithin(store.location, customer.location, 5000) |
| 物流・配車最適化 | 距離・所要時間に基づくベストルート算出でコスト削減 | ST_Distance(origin, dest) + <外部 API 時間> |
| 災害リスク分析 | 被災地点と行政区画の突合せで被害予測マップ作成 | ST_Contains(district.geom, disaster_point) |
| マーケティングセグメンテーション | 地域別顧客属性を可視化し、ターゲット広告を最適化 | ST_Area(ST_UnionAgg(customer.location)) |
参考: Google Cloud の公式ドキュメント「BigQuery GIS overview」
2️⃣ GEOGRAPHY データ型と WGS84 座標系の基礎
2.1 型の特徴
- 内部実装 – Google が開発した S2 Geometry Library により、球面上での高速インデックスと正確な測地計算が保証されます。
- サポートジオメトリ –
POINT,LINESTRING,POLYGON(およびMULTI*系)をすべて取り扱えます。
2.2 作成方法
| 入力形式 | 関数例 |
|---|---|
| WKT 文字列 | ST_GeogFromText('POINT(-122.084 37.422)') |
| 緯度・経度カラム | ST_GeogPoint(lon, lat) |
|
1 2 3 4 5 6 |
-- POINT の生成(WKT) SELECT ST_GeogFromText('POINT(139.6917 35.6895)') AS tokyo_point; -- POINT の生成(数値ペア) SELECT ST_GeogPoint(139.6917, 35.6895) AS tokyo_point; |
詳細は公式リファレンス「GEOGRAPHY data type」を参照。
2.3 注意点
- 緯度は -90 〜 +90、経度は -180 〜 +180 の範囲に収めること(
ST_IsValidで検証)。 - 座標系が混在するデータは
ST_Transform(2024 年 12 月リリース)で統一可能です。
3️⃣ データロードと前処理
3.1 CSV/JSON → GEOGRAPHY の変換フロー
- Cloud Storage にファイルを配置
gs://my-bucket/locations.csv - スキーマ定義(GEOGRAPHY カラムは文字列としてロード)
|
1 2 3 4 |
bq mk --table \ my_dataset.stores_raw \ store_id:INT64,lon:FLOAT64,lat:FLOAT64,name:STRING |
- データロード
|
1 2 3 4 |
bq load --source_format=CSV \ my_dataset.stores_raw gs://my-bucket/locations.csv \ store_id:INTEGER,lon:FLOAT,lat:FLOAT,name:STRING |
- GEOGRAPHY カラム追加 & 変換
|
1 2 3 4 5 |
ALTER TABLE my_dataset.stores_raw ADD COLUMN location GEOGRAPHY; UPDATE my_dataset.stores_raw SET location = ST_GeogPoint(lon, lat); |
「BigQuery における外部データのロード」(Google Cloud Docs) を参照。
3.2 インライン変換(外部テーブルで即時生成)
|
1 2 3 4 5 6 7 8 9 10 11 |
CREATE EXTERNAL TABLE my_dataset.customers_ext ( customer_id INT64, lon FLOAT64, lat FLOAT64, location GEOGRAPHY OPTIONS (expression="ST_GeogPoint(lon, lat)") ) OPTIONS ( format = 'JSON', uris = ['gs://my-bucket/customers.jsonl'] ); |
このテーブルは SELECT * FROM my_dataset.customers_ext の時点で location が GEOGRAPHY 型として利用可能です。
4️⃣ 主な空間関数と実務サンプルクエリ
4.1 空間述語(ブール値を返す)
| 関数 | 用途例 |
|---|---|
ST_Contains(a, b) |
ポリゴン内に点があるか判定 |
ST_Intersects(a, b) |
線路と道路の交差チェック |
ST_DWithin(a, b, radius_m) |
半径検索(内部的に ST_Distance ≤ radius) |
ST_Touches(a, b) |
隣接行政区画の判定 |
例:5 km バッファ内にいる顧客数を店舗ごとに集計
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
WITH store AS ( SELECT store_id, location FROM my_dataset.stores_raw ), customer AS ( SELECT customer_id, location FROM my_dataset.customers_ext ) SELECT s.store_id, COUNT(c.customer_id) AS customers_within_5km FROM store s JOIN customer c ON ST_DWithin(s.location, c.location, 5000) -- 半径5 km GROUP BY s.store_id ORDER BY customers_within_5km DESC; |
4.2 ジオメトリ生成・変形
| 関数 | 説明 |
|---|---|
ST_Buffer(geom, radius_m) |
指定半径のバッファポリゴンを作成 |
ST_Simplify(geom, max_error_m) |
頂点数削減でクエリコスト低減 |
ST_UnaryUnion(array<GEOGRAPHY>) |
複数ジオメトリを統合し重複除去 |
例:店舗のサービス圏(2 km バッファ)と行政区画の交差判定
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
WITH store_buf AS ( SELECT store_id, ST_Buffer(location, 2000) AS buf_geom -- 2 km バッファ FROM my_dataset.stores_raw ), district AS ( SELECT district_id, location AS poly_geom FROM my_dataset.japan_districts ) SELECT sb.store_id, d.district_id FROM store_buf sb JOIN district d ON ST_Intersects(sb.buf_geom, d.poly_geom); |
4.3 集計系関数(複数ジオメトリの統合・要約)
| 関数 | 用途 |
|---|---|
ST_UnionAgg(geom) |
複数ポリゴンを一つに結合 |
ST_CentroidAgg(geom) |
ジオメトリ集合の重心を算出 |
ST_Area(geom) |
面積(平方メートル)を取得 |
2024 年 12 月時点 では、BigQuery GIS は 70 種類以上 の空間関数を提供しています(公式関数一覧)。バージョンが上がると新しい関数が追加されるため、常に最新ドキュメントで確認しましょう。
5️⃣ 結果の可視化・レポート作成
5.1 Looker Studio(旧 Data Studio)との連携手順
| 手順 | 操作内容 |
|---|---|
| 1 | BigQuery の対象テーブルに「ビューア」権限を付与し、データセットを公開。 |
| 2 | Looker Studio で「データ ソース」 → 「Google BigQuery」を選択し、先ほどのテーブルを接続。 |
| 3 | データソース設定画面で location カラムを ジオメトリ として認識させ、チャートタイプを Geo Map または Scatter Map に変更。 |
| 4 | ラベルやサイズに store_id・customers_within_5km などの指標を割り当て、地図上で可視化。 |
詳細手順は Google Cloud Blog の「Visualize BigQuery GIS data in Looker Studio」を参照。
5️⃣2 コスト管理のベストプラクティス
| 項目 | 推奨アクション |
|---|---|
| スキャン量削減 | 必要なカラムだけ SELECT、パーティショニング(例: 日付・地域)で対象データを絞る。 |
| クラスタリング | location をクラスタキーに設定すると、同一エリアのレコードが近接して格納され、ST_Intersects 系関数のスキャン量が減少。 |
| ジオメトリ簡略化 | 大規模ポリゴンは ST_Simplify(geom, 10)(誤差 10 m)で事前に軽量化し、クエリコストを抑える。 |
| プレビュー実行 | 本格集計の前に LIMIT を付けたサンプルクエリで結果とスキャン量を確認する。 |
| 権限最小化 | データロードはサービスアカウントに限定し、分析用テーブルは「読み取り専用」ロールで共有。 |
課金モデルの詳細は公式ページ「BigQuery pricing」をご覧ください。
6️⃣ 実務導入時のチェックリスト
| 項目 | 確認ポイント |
|---|---|
| 座標系統一 | 全テーブルが WGS84(EPSG:4326)で格納されているか。 |
| ジオメトリ有効性 | WHERE NOT ST_IsValid(location) で不正データを除外。 |
| パーティション設計 | 時系列分析なら日付、地域別集計ならハッシュ分割を検討。 |
| テスト環境 | 本番投入前に小規模サンプルでクエリ性能とコストを測定。 |
| ドキュメント整備 | スキーマ・変換ロジック・権限設定を社内 Wiki にまとめ、運用担当者が参照できるようにする。 |
7️⃣ まとめ
- BigQuery GIS は「大規模・高速・SQL 完結」 を実現し、店舗最適配置や物流ルート解析といったビジネス課題をデータドリブンで解決できる基盤です。
GEOGRAPHY型と豊富な空間関数(70 種以上)により、ポイント・ライン・ポリゴンのすべてをシンプルなクエリで操作できます。- データロードは CSV/JSON から インライン変換 が可能で、パーティショニング/クラスタリングと組み合わせればコストも最適化できます。
- 結果は Looker Studio などの BI ツールへシームレスに連携でき、非エンジニアでも直感的な地図レポートを作成可能です。
まずは サンプルデータ(gs://my-bucket/sample_locations.csv)を Cloud Shell にロードし、本稿のクエリを実行してみてください。大規模位置情報分析が手軽に始められることをご体感いただけるはずです。
参考リンク
| 内容 | URL |
|---|---|
| BigQuery GIS の概要 | https://cloud.google.com/bigquery/docs/gis-intro |
| GEOGRAPHY データ型・関数一覧 | https://cloud.google.com/bigquery/docs/reference/standard-sql/geography_functions |
| データロード方法(CSV/JSON) | https://cloud.google.com/bigquery/docs/loading-data-cloud-storage-csv |
| Looker Studio での GIS 可視化 | https://cloud.google.com/blog/topics/developers-practitioners/visualizing-bigquery-gis-data-looker-studio |
| BigQuery の課金モデル | https://cloud.google.com/bigquery/pricing |