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_Intersectsと併用するST_Intersectionは、バウンディングボックス、バッファや、対象の国や領域の内部にあるジオメトリの部分のみが必要な場合に使う領域クエリといったようなジオメトリの切り抜きに使えます。
この関数のジオグラフィ版はジオメトリ実装にかぶせた薄いラッパです。 最初に二つのジオグラフィ値のバウンディングボックスに適合する最適なSRIDを決定します (二つのジオグラフィ値がUTMゾーンの半分以内だけど同じUTMゾーンでない場合はどちらか一つを選びます) (UTMまたはランベルト正積方位図法の北極又は南極を優先し、最悪の場合にメルカトルに後退します)。次に、最適な平面空間参照系でインタセクトする領域を計算して、WGS84ジオグラフィに再変換します。 |
この関数はM値が存在している場合には削除します。 |
3次元ジオメトリで動作しますが、SFCGALベースのST_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_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)