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 のような空間述語や |
|
|
|
|
|
|
|
この関数は 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)
国別に全てのライン (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)