ST_Intersection — ジオメトリAとジオメトリBの共通部分を表現するジオメトリを返します。
geometry ST_Intersection(
geometry geomA , geometry geomB , float8 gridSize = -1 )
;
geography ST_Intersection(
geography geogA , geography geogB )
;
二つのジオメトリのポイント集合の交差を表現するジオメトリを返します。言い換えると、ジオメトリAとジオメトリBの一部であって、二つのジオメトリで共有される部分を返します。
ジオメトリの共有部分が無い (非接触になる)場合には、空ジオメトリコレクションが返されます。
ST_IntersectionとST_Intersectsとの併用は、バウンディングボックス、バッファ、領域のクエリ等で、対象とする国または地域にあるジオメトリの部分の返ってほしいところを切り取るのに、非常に便利です。
任意引数gridSize
が与えらえれた場合には、入力は与えられた大きさのグリッドにスナップされ、結果の¥頂点は同じグリッド上で計算されます (GEOS-3.9.0以上が必要)。
![]() | |
ジオグラフィ: ジオメトリ実装にかぶさる、薄いラッパです。ジオグラフィオブジェクトのバウンディングボックスに最適なSRIDを決定し (UTMが望ましいですが、ランベルト正積方位図法 (北/南)、最悪のシナリオでメルカトルに頼ります)、その平面でバッファを生成し、WGS84ジオグラフィに戻します。 |
![]() | |
この関数はM値が存在している場合には削除します。 |
![]() | |
3次元ジオメトリで動作しますが、SFCGALベースのST_3DIntersectionは。3次元ジオメトリの確実な3次元インタセクトした領域を返すので、これを使った方がいいかも知れません。この関数はZ値があっても動作しますが、Z値は平均化されます。 |
GEOSモジュールによって実現しています。
Enhanced: 3.1.0 gridSizeパラメータを受け付けます - GEOS 3.9.0以上が必要です。
Changed: 3.0.0 SFCGAL非依存になりました。
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
This function supports 3d and will not drop the z-index. ただし、結果はXYのみを使用して計算されます。結果のZ値は複写するか、平均値になるか、補間されます。
SELECT ST_AsText(ST_Intersection('POINT(0 0)'::geometry, 'LINESTRING ( 2 0, 0 2 )'::geometry)); st_astext --------------- GEOMETRYCOLLECTION EMPTY SELECT ST_AsText(ST_Intersection('POINT(0 0)'::geometry, 'LINESTRING ( 0 0, 0 2 )'::geometry)); st_astext --------------- 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));
これは、本当のインタセクションではありません。ST_3DIntersectionの同じ例と比較して下さい。
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)