ST_Intersection — (T) geomAとgeomBの共有部分を表すジオメトリを返します.ジオグラフィ実装では,インタセクトするためにジオメトリに変換して,WGS84に戻します.
geometry ST_Intersection(
geometry
geomA
,
geometry
geomB
)
;
geography ST_Intersection(
geography
geogA
,
geography
geogB
)
;
ジオメトリのインタセクションとなる点集合を表現するジオメトリを返します.
言い換えると,ジオメトリAとジオメトリBとで共有されている部分のことです.
ジオメトリの共有部分が無い(disjoint)場合は,空ジオメトリコレクションが返されます.
ST_IntersectionとST_Intersectsとの併用は,バウンディングボックス,バッファ,領域のクエリ等で,対象とする国または地域にあるジオメトリの部分の返ってほしいところを切り取るのに便利です.
![]() | |
ジオグラフィ: ジオメトリ実装にかぶさる,薄いラッパです.ジオグラフィオブジェクトのバウンディングボックスに最適なSRIDを決定し(UTMが望ましいですが,ランベルト正積方位図法(北/南),最悪のシナリオでメルカトルに頼ります),その平面でバッファを生成し,WGS84ジオグラフィに戻します. |
![]() | |
|
GEOSモジュールで実現しています
初出バージョン: 1.5 でジオグラフィデータ型のサポートが導入されました.
このメソッドは OpenGIS Simple Features Implementation Specification for SQL 1.1.を実装するものです. s2.1.1.3
このメソッドはSQL/MM仕様の実装です. SQL-MM 3: 5.1.18
SELECT ST_AsText(ST_Intersection('POINT(0 0)'::geometry, 'LINESTRING ( 2 0, 0 2 )'::geometry)); st_astext --------------- GEOMETRYCOLLECTION EMPTY (1 row) SELECT ST_AsText(ST_Intersection('POINT(0 0)'::geometry, 'LINESTRING ( 0 0, 0 2 )'::geometry)); st_astext --------------- POINT(0 0) (1 row) ---全てのライン(trails)の,国(POLYGONまたはMUYLTIPOLYGONと仮定します)での切り取り -- 注意: ポイントを共有するだけの未知を考慮に入れていないので, -- LINESTRINGまたはMULTILINESTRINGを返すインタセクションを保持しているだけです. -- ダンプを行うには,ジオメトリコレクションを個々の単一のMULTI系に拡張する必要があります. -- 下に示す例は,かなり一般的なもので,WHERE節を変更するだけでポリゴンで動作します. SELECT clipped.gid, clipped.f_name, clipped_geom FROM (SELECT trails.gid, trails.f_name, (ST_Dump(ST_Intersection(country.the_geom, trails.the_geom))).geom As clipped_geom FROM country INNER JOIN trails ON ST_Intersects(country.the_geom, trails.the_geom)) As clipped WHERE ST_Dimension(clipped.clipped_geom) = 1 ; --ポリゴンランドマークといったpolyに,空ジオメトリコレクションを返すポリゴンを除いて, --0.0のバッファ作成という速い方法を使うこともできます. --(ジオメトリコレクションはポリゴン,ライン,ポイントを含みます) --0.0でのバッファ作成は,ポリゴンを残して,コレクションの殻を分解するだけです. SELECT poly.gid, ST_Multi(ST_Buffer( ST_Intersection(country.the_geom, poly.the_geom), 0.0) ) As clipped_geom FROM country INNER JOIN poly ON ST_Intersects(country.the_geom, poly.the_geom) WHERE Not ST_IsEmpty(ST_Buffer(ST_Intersection(country.the_geom, poly.the_geom),0.0));