ST_Intersection — (T) geomAとgeomBの共有部分を表すジオメトリを返します。ジオグラフィ実装では、インタセクトするためにジオメトリに変換して、WGS84に戻します。
geometry ST_Intersection(
geometry
geomA
,
geometry
geomB
)
;
geography ST_Intersection(
geography
geogA
,
geography
geogB
)
;
ジオメトリのインタセクションとなる点集合を表現するジオメトリを返します。
言い換えると、ジオメトリAとジオメトリBとで共有されている部分のことです。
ジオメトリの共有部分が無い(非接触になる)場合には、空ジオメトリコレクションが返されます。
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と仮定します)での切り取り -- 注意: ポイントを共有するだけであるtrailに注意を払っていないので、 -- 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));