Name

ST_DumpRings — ポリゴンのリングごとのgeometry_dump行の集合を返します。

Synopsis

geometry_dump[] ST_DumpRings(geometry a_polygon);

説明

ジオメトリ要素を抽出する、集合を返す関数 (SRF=Set-Returning Function)です。geometry_dump行の集合を返します。各要素はジオメトリ (geomフィールド)と整数配列 (pathフィールド)からなります。

geomフィールドは、各々のリングをPOLYGONとして持ります。pathフィールドはリングのインデックス番号を持つ配列長1の整数配列です。外側リング (外周)はインデックス番号が0番になります。内側リング (穴)は1以上になります。

[Note]

これはPOLYGONジオメトリーでだけ動作します。MULTIPOLYGONでは動作しません。ポリゴン系ジオメトリーからポリゴン要素を抽出するにはST_Dumpを使います: ST_DumpRings((ST_Dump(geom)).geom )

Availability: PostGIS 1.1.3 PostgreSQL 7.3以上が必要です。

この関数は3次元に対応し、Z値を削除しません。

全てのリングのポリゴンとしての抽出。

SELECT polyTable.field1, polyTable.field1,
          (ST_DumpRings(polyTable.geom)).geom As geom
FROM polyTable

ポリゴンから外殻と穴の抽出。

SELECT path, ST_AsText(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_AsText(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 1,2 1),(1 2,1 1))
       2 | MULTILINESTRING((8.5 1,9 1),(9 2,9.5 2,9.5 1,9 1))