ST_DumpRings — Returnerar en uppsättning geometry_dump-rader för de yttre och inre ringarna i en polygon.
geometry_dump[] ST_DumpRings(geometry a_polygon);
En set-returning function (SRF) som extraherar ringarna i en polygon. Den returnerar en uppsättning geometry_dump rader, var och en innehållande en geometri(geom-fält) och en array av heltal(path-fält).
Fältet geom innehåller varje ring som en POLYGON. Fältet path är en heltalsarray med längden 1 som innehåller polygonringens index. Den yttre ringen (skalet) har index 0. De inre ringarna (hålen) har index 1 och högre.
|
|
|
This only works for POLYGON geometries, not MULTIPOLYGONs. Use ST_Dump to extract polygon elements from polygonal geometries: |
Tillgänglighet: PostGIS 1.1.3. Kräver PostgreSQL 7.3 eller högre.
Denna funktion stöder 3d och kommer inte att tappa z-index.
Extracting all rings as polygons.
SELECT polyTable.field1, polyTable.field1,
(ST_DumpRings(polyTable.geom)).geom As geom
FROM polyTable
Extracting shell and holes from a polygon.
SELECT path,geom As geom
FROM ST_DumpRings('POLYGON ((1 9,9 9,9 1,1 1,1 9),(2 2,2 3,3 3,3 2,2 2),(4 2,4 4,6 4,6 2,4 2))');
path | geom
------+--------------------------------
{0} | POLYGON((1 9,9 9,9 1,1 1,1 9))
{1} | POLYGON((2 2,2 3,3 3,3 2,2 2))
{2} | POLYGON((4 2,4 4,6 4,6 2,4 2))
Finding interior rings which lie close to the exterior ring.
WITH poly AS (
SELECT 'POLYGON ((
0 0, 10 0, 10 10, 0 10, 0 0
), (
1 1, 1 2, 2 2, 2 1, 1 1
), (
8.5 1, 8.5 2, 9.5 2, 9.5 1, 8.5 1
))'::geometry AS geom
),
rings AS (
SELECT d.path[1] AS ring_no,
ST_Boundary(d.geom) AS ring_geom
FROM poly
CROSS JOIN LATERAL ST_DumpRings(poly.geom) AS d
),
shell AS (
SELECT ring_geom
FROM rings
WHERE ring_no = 0
),
holes AS (
SELECT ring_no, ring_geom
FROM rings
WHERE ring_no > 0
)
SELECT h.ring_no,
ST_Normalize(ST_Multi(ST_LineMerge(
ST_Intersection(ST_Buffer(s.ring_geom, 1.0), h.ring_geom)
))) AS close_part
FROM shell AS s
JOIN holes AS h
ON ST_DWithin(s.ring_geom, h.ring_geom, 1.0);
ring_no | close_part
---------+-------------------------------------------------
1 | MULTILINESTRING((1 2,1 1,2 1))
2 | MULTILINESTRING((8.5 1,9 1,9.5 1,9.5 2,9 2))