Name

ST_Intersection — (T) Returns a geometry that represents the shared portion of geomA and geomB.

Synopsis

geometry ST_Intersection( geometry geomA , geometry geomB );

geography ST_Intersection( geography geogA , geography geogB );

説明

ジオメトリのインタセクションとなる点集合を表現するジオメトリを返します。

言い換えると、ジオメトリAとジオメトリBとで共有されている部分のことです。

ジオメトリの共有部分が無い (非接触になる)場合には、空ジオメトリコレクションが返されます。

ST_IntersectionとST_Intersectsとの併用は、バウンディングボックス、バッファ、領域のクエリ等で、対象とする国または地域にあるジオメトリの部分の返ってほしいところを切り取るのに、非常に便利です。

[Note]

ジオグラフィ: ジオメトリ実装にかぶさる、薄いラッパです。ジオグラフィオブジェクトのバウンディングボックスに最適なSRIDを決定し (UTMが望ましいですが、ランベルト正積方位図法 (北/南)、最悪のシナリオでメルカトルに頼ります)、その平面でバッファを生成し、WGS84ジオグラフィに戻します。

[Important]

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

[Warning]

3次元ジオメトリで動作させるにはSFCGALベースのST_3DIntersectionを使います。3次元ジオメトリに適切な3次元インタセクションを生成します。この関数はZ軸を持っていても動作しますが、postgis.backend=geosの時はZ値の平均をとります。postgis.backend=sfcgalとすると、Z軸を無視して2次元ジオメトリを返します。詳細についてはpostgis.backendを参照してください。

GEOSモジュールによって実現しています。

This method is also provided by SFCGAL backend.

Availability: 1.5 ジオグラフィ型が導入されました。

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1. s2.1.1.3

This method implements the SQL/MM specification. 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テーブルの線を全てをcountryテーブル
--   (POLYGONかMULTIPOLYGONであるとします)で切り抜きます
-- ご注意: trailsが点を共有することに注意を払っていないため
--  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 ;

-- ランドマーク等のポリゴンに対しては、
-- 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));
                

例: 2.5次元的なもの

GEOSが、バックエンド指定がない場合のデフォルトです。ST_3DIntersectionを使った同じ例と比較します。

set postgis.backend=geos;
select ST_AsText(ST_Intersection(linestring, polygon)) As wkt
from  ST_GeomFromText('LINESTRING Z (2 2 6,1.5 1.5 7,1 1 8,0.5 0.5 8,0 0 10)') AS linestring
 CROSS JOIN ST_GeomFromText('POLYGON((0 0 8, 0 1 8, 1 1 8, 1 0 8, 0 0 8))') AS polygon;

               st_astext
---------------------------------------
 LINESTRING Z (1 1 8,0.5 0.5 8,0 0 10)
                

PostGISをSFCGAL対応でコンパイルしている場合には、SFCGAL使用の選択肢があります。ただし、基本的にインタセクション実行前にジオメトリを2次元に落とし、ST_Force2Dと等価な2次元ジオメトリを返します。

set postgis.backend=sfcgal;
select ST_AsText(ST_Intersection(linestring, polygon)) As wkt
from  ST_GeomFromText('LINESTRING Z (2 2 6,1.5 1.5 7,1 1 8,0.5 0.5 8,0 0 10)') AS linestring
 CROSS JOIN ST_GeomFromText('POLYGON((0 0 8, 0 1 8, 1 1 8, 1 0 8, 0 0 8))') AS polygon;

                     wkt
----------------------------------------------
 MULTILINESTRING((0.5 0.5,0 0),(1 1,0.5 0.5))
                

関連情報

ST_3DIntersection, ST_Difference, ST_Dimension, ST_Dump, ST_Force2D, ST_SymDifference, ST_Intersects, ST_Multi