ST_CoverageClean — きれいな (エッジが合致し、オーバーラップがなく、隙間がない) ポリゴンカバレッジを、きれいでない入力から計算します。
geometry ST_CoverageClean(geometry winset geom, float8 gapMaximumWidth = 0, float8 snappingDistance = -1, text overlapMergeStrategy = 'MERGE_LONGEST_BORDER');
妥当なポリゴン系ジオメトリーの集合のエッジを調整して、きれいなカバレッジを生成するウィンドウ関数です。きれいにする処理には次を含みます:
小さな不一致を取り除き、共有されるエッジに同じノードが打たれるようにするために、頂点とエッジをスナップさせる
オーバーラップするポリゴンをひとつの親ポリゴンとしてマージする
小さい隙間を隣接ポリゴンとしてマージする
gapMaximumWidthでポリゴンをマージする隙間の条件を制御します。隙間の幅がこの値以下なら隣接ポリゴンとしてマージします。
snappingDistanceで頂点とエッジのスナップを制御します。デフォルト (-1)では自動的にスナップ距離が入力の範囲に応じて決定されます。0.0が指定されるとスナップを行いません。
overlapMergeStrategyで、どれぐらいオーバーラップしているポリゴンを親ポリゴンにマージするかが指定されます:
MERGE_LONGEST_BORDER - 共有境界が最長のポリゴンにマージします
MERGE_MAX_AREA - 最大面積のポリゴンにマージします
MERGE_MIN_AREA - 最小面積のポリゴンにマージします
MERGE_MIN_INDEX - 入力インデックス (入力ポリゴンの順番で決まります)の最小値を持つポリゴンにマージします
結果はきれいなポリゴンカバレッジで、ST_CoverageInvalidEdgesが通り、カバレッジ処理関数の入力にすることができます。
|
|
|
最大隙間幅の判定を助けるために、 |
Availability: 3.6.0 - GEOS >= 3.14.0が必要です
Clean a coverage containing overlaps and narrow gaps, and compare the cleaned polygons with the original invalid edges.
WITH coverage(id, geom) AS (VALUES
(1, 'POLYGON ((10 190,30 160,27 134.5,40 110,122 47,120 10,10 10,10 190))'::geometry),
(2, 'POLYGON ((150 190,10 190,30 160,50 140,40 110,50 80,130 70,135 111,140 130,140 160,150 190))'::geometry),
(3, 'POLYGON ((140 190,190 190,190 80,140 80,140 190))'::geometry),
(4, 'POLYGON ((190 10,120 10,97 77,160 90,170 70,190 80,190 10))'::geometry)
), processed AS (
SELECT id,
ST_CoverageClean(geom, 1) OVER () AS cleaned,
ST_CoverageInvalidEdges(geom) OVER () AS invalid_edges
FROM coverage
)
SELECT ST_Collect(cleaned ORDER BY id) AS cleaned,
ST_Collect(invalid_edges ORDER BY id) AS invalid_edges
FROM processed;
MULTIPOLYGON(((10 10,10 190,30 160,27 134.5,40 110,84.7 75.7,102 62.3,120 10,10 10)),((140 190,140 160,140 130,135 111,131.7 84.2,97 77,98 74,84.7 75.7,40 110,50 140,30 160,10 190,140 190)),((190 190,190 80,165 80,140 80,140 85.9,140 130,140 160,140 190,150 190,190 190)),((190 10,120 10,102 62.3,98 74,97 77,131.7 84.2,140 85.9,140 80,165 80,170 70,190 80,190 10))) | MULTILINESTRING((40 110,122 47,120 10),(40 110,50 80,130 70,135 111,140 130,140 160,150 190,10 190),(190 80,140 80,140 190,190 190),(120 10,97 77,160 90,170 70))