Name

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

Synopsis

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"を取ります。"false"が指定された場合には、1点のLINESTRING等のような低い次元に崩壊したジオメトリ要素が出てきます。

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値を削除しません。

before_geom: 二つのオーバラップしているポリゴンからなるマルチポリゴン

after_geom: 4 つのオーバーラップしないポリゴンのマルチポリゴン

after_geom_structure: 一つのオーバラップしないポリゴンからなるマルチポリゴン

SELECT f.geom AS before_geom, ST_MakeValid(f.geom) AS after_geom, ST_MakeValid(f.geom, 'method=structure') AS after_geom_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 geom) AS f;

before_geom: 六つのオーバラップしているポリゴンからなるマルチポリゴン

after_geom: 14個のオーバラップしていないポリゴンからなるマルチポリゴン

after_geom_structure: 一つのオーバラップしないポリゴンからなるマルチポリゴン

SELECT c.geom AS before_geom,
                    ST_MakeValid(c.geom) AS after_geom,
                    ST_MakeValid(c.geom, 'method=structure') AS after_geom_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 geom) AS c;

SELECT ST_AsText(ST_MakeValid(
    'LINESTRING(0 0, 0 0)',
    'method=structure keepcollapsed=true'
    ));

 st_astext
------------
 POINT(0 0)


SELECT ST_AsText(ST_MakeValid(
    'LINESTRING(0 0, 0 0)',
    'method=structure keepcollapsed=false'
    ));

    st_astext
------------------
 LINESTRING EMPTY

関連情報

ST_IsValid, ST_Collect, ST_CollectionExtract