名称

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
    );
      

另请参阅

ST_IsValid, ST_CoverageUnion, ST_CoverageSimplify