ST_Split — ジオメトリを他のジオメトリで分割してできたジオメトリのコレクションを返します。
geometry ST_Split(geometry input, geometry blade);
この関数は(MULTI)POINT、(MULTI)LINESTRING、(MULTI)POLYGONの境界によるLINESTRINGの分割と、LINESTRINGによる(MULTI)POLYGONの分割に対応します。(MULTI)POLYGONを刃として使うとき、線要素 (境界)は入力の分割に使われます。結果ジオメトリは常にコレクションです。
この関数はST_Unionの逆のようなものです。返されるコレクションにST_Unionを与えると、理論的には元のジオメトリが得られます (丸め誤差のために確実に同じになるものではありません)。
|
|
|
入力と刃が数値の精度の問題でインタセクトしない場合には、入力が思ったように分割されない可能性があります。この状況を避けるには、先に、ST_Snapに小さい許容値を与えて、入力を刃にスナップする必要があるかも知れません。 |
Availability: 2.0.0 GEOSが必要です
Enhanced: 2.2.0 ライン分割をマルチライン、マルチポイントまたはポリゴンもしくはマルチポリゴンの境界で行えるようにしました。
Enhanced: 2.5.0 マルチラインによるポリゴンの分割に対応するようになりました。
Split a circular polygon by a diagonal line.
SELECT
ST_Split(
ST_Buffer('POINT(100 90)'::geometry, 50),
'LINESTRING(10 10,190 190)'::geometry
);
GEOMETRYCOLLECTION(POLYGON((150 90,149 80.2,146.2 70.9,141.6 62.2,135.4 54.6,127.8 48.4,119.1 43.8,109.8 41,100 40,90.2 41,80.9 43.8,72.2 48.4,64.6 54.6,60.1 60.1,129.9 129.9,135.4 125.4,141.6 117.8,146.2 109.1,149 99.8,150 90)), POLYGON((60.1 60.1,58.4 62.2,53.8 70.9,51 80.2,50 90,51 99.8,53.8 109.1,58.4 117.8,64.6 125.4,72.2 131.6,80.9 136.2,90.2 139,100 140,109.8 139,119.1 136.2,127.8 131.6,129.9 129.9,60.1 60.1)))
マルチラインストリングをポイントで分割します。ポイントは確実にラインストリングの要素の上に存在するようにします。
SELECT ST_Split('MULTILINESTRING((10 10,190 190),(15 15,30 30,100 90))',
ST_Point(30, 30));
GEOMETRYCOLLECTION(
LINESTRING(10 10,30 30),
LINESTRING(30 30,190 190),
LINESTRING(15 15,30 30),
LINESTRING(30 30,100 90)
)
ラインストリングをライン上にないポイントで分割します。ST_Snapを使ってラインをポイントにスナップして分割できるようにしています。
WITH data AS (SELECT
'LINESTRING(0 0,100 100)'::geometry AS line,
'POINT(51 50)':: geometry AS point
)
SELECT ST_Split(ST_Snap(line, point, 1), point) AS snapped_split,
ST_Split(line, point) AS not_snapped_not_split
FROM data;
-[ RECORD 1 ]--------- snapped_split | GEOMETRYCOLLECTION(LINESTRING(0 0,51 50), LINESTRING(51 50,100 100)) not_snapped_not_split | GEOMETRYCOLLECTION(LINESTRING(0 0,100 100))