ST_CoverageInvalidEdges — ポリゴンが妥当なカバレッジの形成に失敗する位置を検索するウィンドウ関数。
geometry ST_CoverageInvalidEdges(geometry winset geom, float8 tolerance = 0);
ウィンドウパーティション内のポリゴンが妥当なポリゴンカバレッジを形成するかどうかチェックするウィンドウ関数です。個々のポリゴン内の不正なエッジの位置 (あるなら)を示す線形インジケータを返します。
次の条件を満たすなら妥当なポリゴンの集合は妥当なカバレッジです:
オーバラップなし - ポリゴン同士がオーバラップしない (ポリゴンの内部でインタセクトしない)
エッジ一致 - 共有エッジに沿った頂点が同一
ウィンドウ関数として、入力ポリゴンごとに値が返されます。妥当性条件の一つ以上に違反するポリゴンについては返り値は、問題のあるエッジを含むMULTILINESTRINGです。カバレッジ妥当なポリゴンに対してはNULLを返します。非ポリゴンや空ジオメトリに対してもNULL値が返ります。
この条件では、周囲のポリゴンがエッジ一致になっている限りは、妥当なカバレッジは穴 (ポリゴン間の隙間)を含むことができます。しかしながら、非常に小さい隙間は、望まれないものとされることがしばしばあります。toleranceパラメタが0でない距離で指定されている場合には、小さい隙間を形成するエッジば不正なものとして返されます。
カバレッジ妥当性のチェックがなされたポリゴンも妥当なジオメトリです。ST_IsValidでチェックできます。
Availability: 3.4.0
GEOS 3.12.0以上が必要です

オーバラップと頂点不一致により発生した不正エッジ
WITH coverage(id, geom) AS (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)
)
SELECT id, ST_AsText(ST_CoverageInvalidEdges(geom) OVER ())
FROM coverage;
id | st_astext
----+---------------------------------------
1 | LINESTRING (40 110, 100 70)
2 | MULTILINESTRING ((100 130, 140 120, 140 160, 100 190), (40 110, 50 80, 74 110.5))
3 | LINESTRING (140 80, 140 190)
3 | null
-- Test entire table for coverage validity
SELECT true = ALL (
SELECT ST_CoverageInvalidEdges(geom) OVER () IS NULL
FROM coverage
);