名稱

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)
  4 | null
      
-- Test entire table for coverage validity
SELECT true = ALL (
    SELECT ST_CoverageInvalidEdges(geom) OVER () IS NULL
    FROM coverage
    );