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