名前

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ジオグラフィに戻します.

[重要項目]

GEOMETRYCOLLECTIONを引数として呼ばないでください.

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));
		

関連情報

ST_Dimension, ST_Dump, ST_Intersects, ST_Multi