前回の記事では、シェープファイルデータをBigQueryに格納する方法を紹介しました。本記事では、BigQueryの地理情報機能を活用し、地理空間データの操作と分析方法について解説します。
BigQueryは、地理情報を扱うためのGEOGRAPHY
データ型をサポートしており、これにより地理空間データの格納、検索、解析が容易に行えます。GEOGRAPHY
型はWGS84(世界測地系)の緯度・経度座標を基盤としたベクトルデータ型であり、ポリゴン(多角形)、ライン(線)、ポイント(点)を扱うことができます。
現在、BigQueryには70種類の空間関係関数が用意されており(2025年3月4日時点)、公式ドキュメント にて詳細が確認できます。本記事では、これらの関数のうち、特に2つのGEOGRAPHY
データを比較・操作するための 述語関数(Predicates) と 変換関数(Transformations) に焦点を当てて解説します。
Google BigQuery

BigQueryでのGIS活用
BigQueryでは、地理データを分析するために 空間関係関数(Spatial Predicate Functions) を提供しています。GEOGRAPHY
型では通常の =
演算子による等価比較は定義されておらず、地理オブジェクト同士の関係を判定するために、専用の述語関数を使用します。
述語関数は、2つの地理オブジェクト間の空間的な関係(例えば、「包含しているか」「交差しているか」「一定距離以内にあるか」など)を評価し、TRUE または FALSE を返します。これらを WHERE
句や AND
・OR
条件と組み合わせることで、柔軟な空間フィルタリングが可能になります。
また、地理データの操作・変換には 変換関数 が用いられます。これは述語関数が返す関係に対応する形で、新たなジオメトリを生成する機能を提供します。また、エリアの拡張(ST_BUFFER)、重心の算出(ST_CENTROID)、オブジェクトの統合(ST_UNION)など、多様な処理もSQL上で行うことができます。
本記事では、BigQueryにおける述語関数と変換関数を、主な用途に応じて整理し、それぞれの活用シーンについて解説します。
地理情報の包含
述語関数

- ST_CONTAINS(geoA, geoB)
- 概要: 地理オブジェクト
geoA
がgeoB
を完全に含むかを判定(TRUE/FALSE)。 - 例: 市区町村ポリゴンが特定の店舗ポイントを内包していればTRUE。
- 用途:
- ジオフェンシングで、特定エリア内に地点が入ったかを判定。
- 空間結合(Spatial Join)で、ポイントが属する行政区画を特定。
- 概要: 地理オブジェクト
- ST_WITHIN(geoA, geoB)
- 概要: 地理オブジェクト
geoA
がgeoB
の内部(境界を含む)にあるかを判定。 - 例:
ST_WITHIN(polygonB, polygonA)
→ polygonBがpolygonA内にあればTRUE (ST_CONTAINS(polygonA, polygonB)
と同義)。 - 用途:
- ポイントがどのポリゴン内に位置するかチェック。
- 施設ポイントと市町村ポリゴンをJOINし、各施設がどの市町村に属するか判定。
- 概要: 地理オブジェクト
- ST_COVERS(geoA, geoB) / ST_COVEREDBY(geoA, geoB)
- 概要: 境界上にある点も含めてカバー関係を判定。
- 用途:
ST_CONTAINS
/ST_WITHIN
よりも緩やかな包含関係が必要な場合に使用。 - 注意: 境界上にある地点を「含む」と見なしたい場合に便利。
- ST_EQUALS(geoA, geoB)
- 概要: 2つのGEOGRAPHYが形状的に完全に等しいか(同じ点集合か)を判定。
- 用途: 重複データや完全一致する図形をチェックするシナリオで利用。
変換関数

- ST_DIFFERENCE(geoA, geoB)
- 概要: 「
geoA
からgeoB
と重なる部分を差し引いた形状」を返す。 - 例: 大きなポリゴンAに小ポリゴンBが内包される場合、
ST_DIFFERENCE(A, B)
でBをくり抜いた“穴あきポリゴン”を生成。 - 用途: 先に
ST_CONTAINS(A, B)
がTRUEなら、実際に除外処理を実行する、といった使い方が多い。
- 概要: 「
ユースケース例
- 都市の公園部分だけを除外した領域を作成
ST_CONTAINS(city_polygon, park_polygon)
で市域が公園を内包しているか確認。- TRUEなら
ST_DIFFERENCE(city_polygon, park_polygon)
で公園をくり抜き、陸地面積のみのポリゴンを得る。
- 施設がどの自治体に属しているかの判定
- 施設(POINT)と自治体(POLYGON)を、
ST_CONTAINS(municipality.geom, facility.geom)
のON条件でJOIN。 - 各施設がどの自治体に内包されているかを空間結合で把握できる。
- 施設(POINT)と自治体(POLYGON)を、
地理情報の交差

述語関数
- ST_INTERSECTS(geoA, geoB)
- 概要: 2つの地理オブジェクトがいずれかの部分で重なりまたは接触しているかを判定。
- 注意: 境界のみで接している場合もTRUE。
- 用途:
- 空間結合で隣接または重複する領域を探索。
- 道路と行政区域が交差するかどうかの判定。
- ST_DISJOINT(geoA, geoB)
- 概要: 2つの地理オブジェクトが全く重ならない(一点も共有しない)かを判定。
- 例:
ST_DISJOINT(polygonA, polygonB)
→ まったく重なっていないならTRUE。 - 用途:
NOT ST_INTERSECTS(geoA, geoB)
と同義。ある領域から外れたオブジェクトを探すなどに有用。
- ST_TOUCHES(geoA, geoB)
- 概要: 2つのオブジェクトが境界だけで接しており、内部が重ならない場合にTRUE。
- 例: 隣接する2つの多角形が外周線で接しているが、面は重ならないケース。
- 用途: 行政区画同士の隣接判定など、境界接触を正確に確認したいシナリオで利用。
変換関数
- ST_INTERSECTION(geoA, geoB)
- 概要: 2つの地理オブジェクトが共通して重なる部分をポリゴンやラインとして返す。
- 例: ポリゴンAとBが部分的に重なっていれば、その重なり領域だけが抽出される。
- 用途: 先に
ST_INTERSECTS(A, B)
がTRUEなら、ST_INTERSECTION(A, B)
で重複エリアを取得。
- ST_UNION(geoA, geoB) / ST_UNION_AGG(…)
- 概要: 2つまたは複数の地理オブジェクトを和集合としてまとめ、重複部分は1つに統合する。
- 用途:
- 先に交差判定(ST_INTERSECTS / ST_TOUCHES)で関係を確認し、必要に応じて結合処理を実行。
- 複数のポリゴンを1つの連続領域として扱う際に便利。
ユースケース例
- 2つのエリアの重複領域を抽出
ST_INTERSECTS(area1, area2)
→ TRUEなら交差している。ST_INTERSECTION(area1, area2)
→ 重複部分を取り出せる。- 浸水域や規制エリアとの重複度合いを把握する際に有用。
- 隣接する市区町村の統合領域を作成
ST_TOUCHES(muniA, muniB)
→ 接していればTRUE。- TRUEなら
ST_UNION(muniA, muniB)
→ 2つの市区町村を1つのポリゴンに。 - 広域自治体レベルでの分析や表示に役立つ。
近接判定と範囲探索
述語関数
- ST_DWITHIN(geoA, geoB, distance)
- 概要: 2つの地理オブジェクトが指定距離
distance
メートル以内かを判定。 - 例:
ST_DWITHIN(pointA, pointB, 500)
→ AとBが半径500m以内ならTRUE。 - 用途:
- 近隣検索(例: 駅から500m以内の店舗を探す)。
- バッファ生成を省略し、直接距離ベースのフィルタリングを行う。
- 概要: 2つの地理オブジェクトが指定距離
- ST_INTERSECTSBOX(geo, lng1, lat1, lng2, lat2)
- 概要:
geo
が指定経度・緯度の長方形領域内に少しでもかかっていればTRUE。 - 用途: 広域フィルタリング(バウンディングボックス)で簡易的に絞り込む場合に効率的。
- 概要:
- ST_HAUSDORFFDWITHIN(geoA, geoB, dist)
- 概要: 2つの図形がHausdorff距離で
dist
以下かを判定。形状がほぼ同一かを評価できる。 - 用途: 道路や境界線など、わずかなズレを含む複数バージョンが同じ形状かどうかを確認。
- 概要: 2つの図形がHausdorff距離で
変換関数
- ST_BUFFER(geo, distance) / ST_BUFFERWITHTOLERANCE(geo, distance, tolerance)
- 概要: 地理オブジェクト
geo
の周囲を指定距離distance
メートルだけ膨らませたバッファポリゴンを作る。 - 使い分け: ST_BUFFERWITHTOLERANCE はバッファ生成時の近似精度(tolerance)を明示できる。
- 例: 駅のPOINTに
ST_BUFFER(station, 1000)
→ 半径1kmの円形エリアをポリゴンとして作り、ST_CONTAINS(buffer, house_point)
で家屋を判定。
- 概要: 地理オブジェクト
- ST_SIMPLIFY(geo, tolerance) / ST_SNAPTOGRID(geo, grid_size)
- 概要: 地理オブジェクトを単純化する処理。
- ST_SIMPLIFY: 指定誤差
tolerance
内で頂点数を削減。 - ST_SNAPTOGRID: 指定グリッドサイズに座標を丸め、形状をスナップ。
- ST_SIMPLIFY: 指定誤差
- 用途: フィルタリング前の前処理として、複雑形状を簡略化し計算負荷を削減。
- 概要: 地理オブジェクトを単純化する処理。
ユースケース例
- ある店舗から500m以内の顧客ポイントを抽出
ST_DWITHIN(customer.geom, store.geom, 500)
のWHERE条件で、半径500m圏内の顧客をフィルタ。- 代替として
ST_BUFFER(store.geom, 500)
+ST_CONTAINS(buffer, customer.geom)
も可。ただしST_DWITHINの方がクエリがシンプル。
- 行政境界を簡略化して処理を高速化
ST_SIMPLIFY(admin_polygon, 100)
→ 100mの誤差を許容して形状を単純化し、空間JOINの計算量を軽減。- わずかなズレは許容しつつ、パフォーマンスを向上。
その他の変換・操作
上記3カテゴリ(包含・交差・近接判定)に明示的に当てはまらない、または補助的に使われる関数をまとめます。
形状生成・変形
- ST_CONVEXHULL(geo)
- 概要: 指定オブジェクト(あるいは複数)を含む最小の凸多角形を生成。
- 用途: 点群データからおおまかな外枠を取りたいときなどに便利。
- ST_BOUNDARY(geo)
- 概要: ジオメトリの境界を抽出。ポリゴンなら周囲線をLINESTRINGとして返す。
- 用途: 境界線だけ抜き出してマッピングしたい場面など。
ライン・ポリゴン操作
- ST_EXTERIORRING(geo) / ST_INTERIORRINGS(geo)
- 概要: ポリゴンの外周リング、および内側の穴の輪郭線をLINESTRINGとして取り出す。
- 用途: 複雑ポリゴンの穴の扱いを個別に分析したい場合に有用。
- ST_LINEINTERPOLATEPOINT(geo, fraction) / ST_LINESUBSTRING(geo, start_frac, end_frac)
- 概要: ライン上で指定割合の点、または部分区間(部分LINESTRING)を抽出。
- 例: 経路のちょうど50%地点を取得する、25%〜75%区間だけ切り取るなど。
- 用途: 道路や河川の中間点把握、特定区間の抽出に活用。
幾何学的性質の計算
- ST_CENTROID(geo) / ST_CENTROID_AGG(geo)
- 概要: 地理オブジェクトの**重心(中心点)**を算出。複数オブジェクトの集約がST_CENTROID_AGG。
- 用途: ポリゴン比較において代表点だけを用いて簡易判断したい際など。
- ST_CLOSESTPOINT(geoA, geoB)
- 概要:
geoA
上でgeoB
に最も近い点を返す(またはその逆)。 - 用途: 施設と道路間の最短接触点を検出するなどのシナリオに有効。
- 概要:
最後に
本記事では、BigQuery GISの述語関数(Predicates)と変換関数(Transformations)について、主要な用途ごとに整理し、その活用方法を解説しました。
述語関数を用いることで、地理情報の包含や交差、近接関係を効率的に評価でき、SQLクエリを通じた空間データのフィルタリングが可能になります。また、変換関数を活用することで、空間データの加工や統合が容易になり、より高度な分析が行えます。
これらの関数を適切に組み合わせることで、BigQuery上でも柔軟な地理情報解析が実現できます。今後は、これらの関数を活用した実践的なクエリ例やパフォーマンス最適化の方法についても検討していくと、より効果的なデータ分析が可能になるでしょう。
BigQuery GISの公式ドキュメントも参考にしながら、実際のデータで試してみることをおすすめします。
参考文献
