ST_CoverageInvalidEdges — 窗口函数,用于查找多边形无法形成有效覆盖范围的位置。
geometry ST_CoverageInvalidEdges(
geometry winset 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) 3 | null
-- Test entire table for coverage validity SELECT true = ALL ( SELECT ST_CoverageInvalidEdges(geom) OVER () IS NULL FROM coverage );