名前

ST_Intersection — ジオメトリー A とジオメトリー B の共通部分を表現するジオメトリーを返します。

概要

geometry ST_Intersection( geometry geomA , geometry geomB , float8 gridSize = -1 );

geography ST_Intersection( geography geogA , geography geogB );

説明

二つのジオメトリーのポイント集合の交差を表現するジオメトリーを返します。言い換えると、ジオメトリー A とジオメトリー B の一部であって、二つのジオメトリーで共有される部分を返します。

ジオメトリーが共通するポイントを持っていない (つまり接続されていない) 場合には、適切なタイプの空のジオメトリーが返されます。

任意パラメーター gridSize が与えらえれると (GEOS-3.9.0 が必要です)、全ての結果の頂点が指定サイズのスナップ用グリッドに落ちることが保証されます。グリッド上で行われる処理は、グリッドに揃える際に意図しない小さな変更が発生する可能性があることに注意して下さい。ST_ReducePrecision を参照して下さい。

ST_Intersectsと併用する ST_Intersection は、バウンディングボックス、バッファや、対象の国や領域の内部にあるジオメトリーの部分のみが必要な場合に使う領域クエリといったようなジオメトリーの切り抜きに使えます。

[注記]

ST_Intersects のような空間述語や ST_Intersection のようなオーバーレイ関数は異なるアルゴリズムで計算されます。非常に近い座標値では浮動小数点数の精度やジオメトリー計算の堅牢性を確保するために、空間述語から TRUE が返ったのにインターセクトした部分の計算結果が空ジオメトリーになったり、インターセクトするポイントが少しだけ入力ラインからずれるといったことが起こります。再現性のあるオーバーレイの結果を得るには、先に入力を適切なグリッドにスナップさせます。たとえば ST_ReducePrecision を使ったり、全ての入力頂点がグリッド上に乗っている時には gridSize パラメーターを使ったりします。

[注記]

この関数のジオグラフィー版はジオメトリー実装にかぶせた薄いラッパーです。 最初に二つのジオグラフィ値のバウンディングボックスに適合する最適な SRID を決定します (二つのジオグラフィ値が UTM ゾーンの半分以内だけど同じ UTM ゾーンでない場合はどちらか一つを選びます) (UTM またはランベルト正積方位図法の北極又は南極を優先し、最悪の場合にメルカトルに後退します)。次に、最適な平面空間参照系でインタセクトする領域を計算して、WGS84ジオグラフィに再変換します。

[警告]

この関数は M 値が存在している場合には削除します。

[警告]

3次元ジオメトリーで使う場合には、SFCGAL による CG_3DIntersection がいいかも知れません。3次元ジオメトリーに対して確実に 3次元の共有部を出します。この関数は Z 値を持たせられますが、Z 値は平均値を取ります。

GEOS モジュールで実現しています。

Enhanced: 3.1.0 gridSize パラメータを受け付けるようになりました

gridSize パラメータを使うには GEOS 3.9.0以上が必要です

Changed: 3.0.0 SFCGAL 非依存になりました。

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

このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s2.1.1.3

このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.18

この関数は3次元に対応し、Z値を削除しません。 ただし、結果は XY のみを使用して計算されます。結果の Z 値は複写するか、平均値になるか、補間されます。

コード
SELECT ST_Intersection('POINT(0 0)'::geometry, 'LINESTRING ( 2 0,0 2 )'::geometry);
出力
POINT EMPTY
コード
SELECT ST_Intersection('POINT(0 0)'::geometry, 'LINESTRING ( 0 0,0 2 )'::geometry);
出力
POINT(0 0)
Geometry figure for visual-st-intersection-02

国別に全てのライン (trains) を切り抜きます。 国のジオメトリーは POLYGON またはMULTIPOLYGON であると仮定します。ご注意: ポイントだけを共有する trails は気にしないので、LINESTRING または MULTILINESTRING の結果となるインタセクションだけを保持しています。ジオメトリーコレクションを個々のマルチ系ジオメトリーの要素に分解するためにダンプが必要です。下の例は非常に汎用的で、WHERE 節を変更するだけでポリゴンでも動作します。

コード
select clipped.gid, clipped.f_name, clipped_geom
from (
         select trails.gid, trails.f_name,
             (ST_Dump(ST_Intersection(country.geom, trails.geom))).geom clipped_geom
         from country
              inner join trails on ST_Intersects(country.geom, trails.geom)
     ) as clipped
where ST_Dimension(clipped.clipped_geom) = 1;

ランドマーク等のポリゴンに対しては、ポリゴンを除いたジオメトリーを 0.0でバッファを実行すると空ジオメトリーコレクションが得られる、という速度向上のための技を使うことができます (それで、ポリゴン、ラインストリング、ポイントを含むジオメトリコレクションを 0.0でバッファを実行すると、ポリゴンのみが残り、ジオメトリーコレクションでなくなります)。

コード
select poly.gid,
    ST_Multi(ST_Buffer(ST_Intersection(country.geom, poly.geom),
            0.0
        )
    ) clipped_geom
from country
     inner join poly on ST_Intersects(country.geom, poly.geom)
where not ST_IsEmpty(ST_Buffer(ST_Intersection(country.geom, poly.geom), 0.0));

本当の 3次元共有部計算ではありません。2.5次元ジオメトリー (Z 値は持つけど 2次元で計算する) を使います。本当の 3次元共有部計算である CG_3DIntersection と同じ入力で比較します。

コード
WITH data AS (
  SELECT 'LINESTRING Z (2 2 6,1.5 1.5 7,1 1 8,0.5 0.5 8,0 0 10)'::geometry AS input_linestring,
         'POLYGON Z ((0 0 8,0 1 8,1 1 8,1 0 8,0 0 8))'::geometry AS input_polygon
)
SELECT input_linestring AS input_linestring,
       input_polygon AS input_polygon,
       ST_Intersection(input_linestring, input_polygon) AS intersection_2d,
       CG_3DIntersection(input_linestring, input_polygon) AS intersection_3d
FROM data;
出力
LINESTRING Z (2 2 6,1.5 1.5 7,1 1 8,0.5 0.5 8,0 0 10) | POLYGON Z ((0 0 8,0 1 8,1 1 8,1 0 8,0 0 8)) | LINESTRING Z (1 1 8,0.5 0.5 8,0 0 10) | LINESTRING Z (1 1 8,0.5 0.5 8)
Geometry figure for visual-st-intersection-03