名前

ST_MakeValid — 頂点を失うことなしに不正なジオメトリーを妥当なジオメトリーにしようと試みます。

概要

geometry ST_MakeValid(geometry input);

geometry ST_MakeValid(geometry input, text params);

説明

与えられた不正なジオメトリーを、入力ジオメトリーの頂点を捨てずに、妥当な表現で生成しようとします。妥当なジオメトリーは変更せずに返します。

対応する入力は POINTS, MULTIPOINTS, LINESTRING, MULTILINESTRING, POLYGON, MULTIPOLYGON, GEOMETRYCOLLECTION およびそれらの混交したものです。

完全または部分的な次元崩壊の場合には、出力ジオメトリーは、同次元まはた低い次元のジオメトリーのコレクションか、低い次元のジオメトリーコレクションになります。

単一ポリゴンは、自己インタセクトがある場合には、マルチポリゴンになります。

params引数は、妥当なジオメトリーを構築するために使うメソッドを選択するための任意文字列を与えるのに使えます。任意文字列は"method=linework|structure keepcollapsed=true|false"という書式に従います。"params"引数が無い場合には、"linework"アルゴリズムがデフォルトとして使われます。

"method"キーに対して取り得る値は二つあります。

  • "linework"はデフォルトのアルゴリズムで、最初に全てのラインを抽出して、そのラインを繋ぎ合わせ、最後に繋いだラインから値を出力します。頂点の欠落が無いことを求めているので、複雑なコレクションを出力として生成できます。

  • "structure"は内側リングと外側リングを区別します。外側リングを結合してジオメトリーを新規生成してから、全ての内側リングの領域を差し引きます。次元崩壊したラインは破棄されて結果が出力されるので、より直感的と言えるでしょう。

"keepcollapsed"キーは"structure"アルゴリズムの時だけ見られて、"true"または"false"を取ります。

  • "keepcollapsed"のデフォルト値は"false"です。頂点が 1個のラインストリングなどの低い幾何次元に崩壊するジオメトリーは削除されます。

  • "keepcollapsed"が"true"の場合には、低い幾何次元に崩壊するジオメトリー要素も保持されます。

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

Availability: 2.0.0

Enhanced: 2.0.1 速度の改善

Enhanced: 2.1.0 GEOMETRYCOLLECTION と MULTIPOINT の対応の追加

Enhanced: 3.1.0 NaN 値を持つ座標の削除が追加されました。

Enhanced: 3.2.0, アルゴリズムに関する任意パラメータ'linework'と'structure'が追加されました。GEOS 3.10.0以上が必要です。

この関数は3次元に対応し、Z値を削除しません。

二つのオーバーラップしているポリゴンからなる MULTIPOLYGON を "linework" と "structure" の各メソッドで妥当にする。

コード
SELECT ST_MakeValid(before_geom) AS linework,
  ST_MakeValid(before_geom, 'method=structure') AS structure
FROM (SELECT 'MULTIPOLYGON(((186 194,187 194,188 195,189 195,190 195,
191 195,192 195,193 194,194 194,194 193,195 192,195 191,
195 190,195 189,195 188,194 187,194 186,14 6,13 6,12 5,11 5,
10 5,9 5,8 5,7 6,6 6,6 7,5 8,5 9,5 10,5 11,5 12,6 13,6 14,186 194)),
((150 90,149 80,146 71,142 62,135 55,128 48,119 44,110 41,100 40,
90 41,81 44,72 48,65 55,58 62,54 71,51 80,50 90,51 100,
54 109,58 118,65 125,72 132,81 136,90 139,100 140,110 139,
119 136,128 132,135 125,142 118,146 109,149 100,150 90)))'::geometry AS before_geom) AS f;
出力
MULTIPOLYGON(((11 5,10 5,9 5,8 5,7 6,6 6,6 7,5 8,5 9,5 10,5 11,5 12,6 13,6 14,56.769 64.769,58 62,64 56,14 6,13 6,12 5,11 5)),((54 71,51 80,50 90,51 100,54 109,58 118,65 125,72 132,81 136,90 139,100 140,110 139,119 136,125.231 133.231,56.769 64.769,54 71)),((186 194,187 194,188 195,189 195,190 195,191 195,192 195,193 194,194 194,194 193,195 192,195 191,195 190,195 189,195 188,194 187,194 186,134 126,128 132,125.231 133.231,186 194)),((135 125,142 118,146 109,149 100,150 90,149 80,146 71,142 62,135 55,128 48,119 44,110 41,100 40,90 41,81 44,72 48,65 55,64 56,134 126,135 125))) | MULTIPOLYGON(((149 80,146 71,142 62,135 55,128 48,119 44,110 41,100 40,90 41,81 44,72 48,65 55,64 56,14 6,13 6,12 5,11 5,10 5,9 5,8 5,7 6,6 6,6 7,5 8,5 9,5 10,5 11,5 12,6 13,6 14,56.769 64.769,54 71,51 80,50 90,51 100,54 109,58 118,65 125,72 132,81 136,90 139,100 140,110 139,119 136,125.231 133.231,186 194,187 194,188 195,189 195,190 195,191 195,192 195,193 194,194 194,194 193,195 192,195 191,195 190,195 189,195 188,194 187,194 186,134 126,135 125,142 118,146 109,149 100,150 90,149 80)))
Geometry figure for visual-st-makevalid-01

六つのオーバーラップするポリゴンからなる MULTIPOLYGON を "linework" と "structure" の各メソッドで妥当にする。

コード
SELECT ST_MakeValid(before_geom) AS linework,
  ST_MakeValid(before_geom, 'method=structure') AS structure
FROM (SELECT 'MULTIPOLYGON(((91 50,79 22,51 10,23 22,11 50,23 78,51 90,79 78,91 50)),
      ((91 100,79 72,51 60,23 72,11 100,23 128,51 140,79 128,91 100)),
      ((91 150,79 122,51 110,23 122,11 150,23 178,51 190,79 178,91 150)),
      ((141 50,129 22,101 10,73 22,61 50,73 78,101 90,129 78,141 50)),
      ((141 100,129 72,101 60,73 72,61 100,73 128,101 140,129 128,141 100)),
      ((141 150,129 122,101 110,73 122,61 150,73 178,101 190,129 178,141 150)))'::geometry AS before_geom) AS c;
出力
MULTIPOLYGON(((51 110,68.5 117.5,61 100,68.5 82.5,51 90,23 78,21.714 75,11 100,21.714 125,23 122,51 110)),((51 190,76 179.286,73 178,61 150,68.5 132.5,51 140,23 128,21.714 125,11 150,23 178,51 190)),((141 150,130.286 125,129 128,101 140,83.5 132.5,91 150,79 178,76 179.286,101 190,129 178,141 150)),((129 78,101 90,83.5 82.5,91 100,83.5 117.5,101 110,129 122,130.286 125,141 100,130.286 75,129 78)),((101 10,76 20.714,79 22,91 50,83.5 67.5,101 60,129 72,130.286 75,141 50,129 22,101 10)),((11 50,21.714 75,23 72,51 60,68.5 67.5,61 50,73 22,76 20.714,51 10,23 22,11 50)),((83.5 82.5,80.286 75,79 78,76 79.286,83.5 82.5)),((83.5 67.5,76 70.714,79 72,80.286 75,83.5 67.5)),((68.5 67.5,71.714 75,73 72,76 70.714,68.5 67.5)),((68.5 82.5,76 79.286,73 78,71.714 75,68.5 82.5)),((83.5 132.5,80.286 125,79 128,76 129.286,83.5 132.5)),((83.5 117.5,76 120.714,79 122,80.286 125,83.5 117.5)),((68.5 117.5,71.714 125,73 122,76 120.714,68.5 117.5)),((68.5 132.5,76 129.286,73 128,71.714 125,68.5 132.5))) | MULTIPOLYGON(((23 22,11 50,21.714 75,11 100,21.714 125,11 150,23 178,51 190,76 179.286,101 190,129 178,141 150,130.286 125,141 100,130.286 75,141 50,129 22,101 10,76 20.714,51 10,23 22)))
Geometry figure for visual-st-makevalid-02

つぶれたジオメトリーの例

コード
SELECT ST_MakeValid(
'LINESTRING(0 0,0 0)',
'method=structure keepcollapsed=true'
);
出力
POINT(0 0)
Geometry figure for visual-st-makevalid-03
コード
SELECT ST_MakeValid(
'LINESTRING(0 0,0 0)',
'method=structure keepcollapsed=false'
);
出力
LINESTRING EMPTY