Name

ST_CoverageClean — きれいな (エッジが合致し、オーバーラップがなく、隙間がない) ポリゴンカバレッジを、きれいでない入力から計算します。

Synopsis

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が通り、カバレッジ処理関数の入力にすることができます。

[Note]

最大隙間幅の判定を助けるために、gapMaximumWidth = > 0できれいにして、ST_CoverageUnionを使って結果カバレッジを結合することで隙間が計算できます。結合した際にできる穴は、元のデータセットにある隙間に対応してします。隙間幅は、穴をポリゴンとして抽出して、ST_MaximumInscribedCircleを実行して得られた半径の2倍として計測できます。

Availability: 3.6.0 - GEOS >= 3.14.0が必要です

-- Populate input table
CREATE TABLE example AS SELECT * FROM (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)
) AS v(id, geom);

重複部と隙間があるポリゴン

-- Show it is an invalid coverage
SELECT ST_AsText(ST_CoverageInvalidEdges(geom) OVER ())
  FROM example;

不正なカバレッジのエッジ

-- Clean the coverage, merging gaps with width <= 1
CREATE TABLE example_clean AS
  SELECT id, ST_CoverageClean(geom, 1) OVER () AS GEOM
  FROM example;

重複部と狭い隙間の消去でポリゴンカバレッジをきれいにします