ST_CoverageClean — きれいな (エッジが合致し、オーバーラップがなく、隙間がない) ポリゴンカバレッジを、きれいでない入力から計算します。
geometry ST_CoverageClean(geometry winset geom, float8 gapMaximumWidth = 0, float8 snappingDistance = -1, text overlapMergeStrategy = 'MERGE_LONGEST_BORDER');
ポリゴンカバレッジのエッジを変更して、ポリゴンのオーバーラップを無くし、隙間をスナップして除き、全ての共有エッジが同じものにすることを確実にするウィンドウ関数です。結果は ST_CoverageInvalidEdgesのような評価関数にパスするクリーンなカバレッジです
gapMaximumWidthは、ポリゴン間の隙間の除去を制御するためのものです。この許容値より小さい隙間は塞がれます。
snappingDistanceは近隣ノードを一つにまとめるスナップの制御のためのものです。デフォルト設定 (-1) では、入力制御に基づき算出されたスナップ距離が自動的に適用されます。
overlapMergeStrategy は、オーバーラップ領域をマージする先の近隣ポリゴンの決定に使われるアルゴリズムを制御します。
MERGE_LONGEST_BORDER 共通境界線が最も長いポリゴンを選択します
MERGE_MAX_AREA 最大面積のポリゴンを選択します
MERGE_MIN_AREA 最小面積のポリゴンを選択します
MERGE_MIN_INDEX 入力の要素番号が最も小さいポリゴンを選択します
Availability: 3.6.0 - GEOS >= 3.14.0が必要です
-- Populate demo table
CREATE TABLE example AS SELECT * FROM (VALUES
(1, 'POLYGON ((10 190, 30 160, 40 110, 100 70, 120 10, 10 10, 10 190))'::geometry),
(2, 'POLYGON ((100 190, 10 190, 30 160, 40 110, 50 80, 74 110.5, 100 130, 140 120, 140 160, 100 190))'::geometry),
(3, 'POLYGON ((140 190, 190 190, 190 80, 140 80, 140 190))'::geometry),
(4, 'POLYGON ((180 40, 120 10, 100 70, 140 80, 190 80, 180 40))'::geometry)
) AS v(id, geom);
-- Prove it is a dirty coverage
SELECT ST_AsText(ST_CoverageInvalidEdges(geom) OVER ())
FROM example;
-- Clean the coverage
CREATE TABLE example_clean AS
SELECT id, ST_CoverageClean(geom) OVER () AS GEOM
FROM example;
-- Prove it is a clean coverage
SELECT ST_AsText(ST_CoverageInvalidEdges(geom) OVER ())
FROM example_clean;