ST_CoverageInvalidEdges — 窗口函数,用于查找多边形无法形成有效覆盖的位置。
geometry ST_CoverageInvalidEdges(
geometry 窗口集 geom, float8 tolerance = 0)
;
一个窗口函数,用于检查窗口分区中的多边形是否形成有效的多边形覆盖。它返回线性指示器,显示每个多边形中无效边缘的位置(如果有)。
如果满足以下条件,则一组有效的多边形是有效的覆盖
不重叠 - 多边形不重叠(它们的内部不相交)
边缘匹配 - 沿着共享边缘的顶点是相同的
作为窗口函数,将为每个输入多边形返回一个值。对于违反一个或多个有效性条件的多边形,返回值是一个包含有问题边缘的 MULTILINESTRING。覆盖有效的多边形返回值 NULL。非多边形或空几何图形也产生 NULL 值。
这些条件允许有效的覆盖包含孔(多边形之间的间隙),只要周围的多边形是边缘匹配的。然而,非常窄的间隙通常是不希望的。如果指定 tolerance
参数为非零距离,则形成较窄间隙的边缘也将作为无效返回。
正在检查覆盖有效性的多边形也必须是有效的几何图形。可以使用 ST_IsValid 来检查这一点。
可用性: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) 4 | null
-- Test entire table for coverage validity SELECT true = ALL ( SELECT ST_CoverageInvalidEdges(geom) OVER () IS NULL FROM coverage );