名称

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