Name

toTopoGeom — 単純なジオメトリからTopoGeometryを生成します。

Synopsis

topogeometry toTopoGeom(geometry geom, varchar toponame, integer layer_id, float8 tolerance=-1);

topogeometry toTopoGeom(geometry geom, topogeometry topogeom, float8 tolerance=-1);

説明

単純なジオメトリからTopoGeometryを生成します。

入力ジオメトリを表現するために必要なトポロジプリミティブが、下位にあるトポロジに追加されます。既存のものを分割することもあります。relationテーブル内のTopoGeometryの出力に紐づきます。

既存のTopoGeometryオブジェクトは形状を維持します (topogeomが与えられている場合には、それが例外となる可能性があります)。

toleranceが与えられた場合には、入力ジオメトリを既存のプリミティブにスナップします。特別な値である -1 (デフォルト)ではトポロジーの精度を許容値として使うことになります。

1番目の形式では、新しいTopoGeometryは、与えられたトポロジ (toponame)の与えられたレイヤ (layer_id)に作られます。

2番目の形式では、変換結果のプリミティブが、既存のTopoGeometry (topogeom)に追加されます。また、最終の形状にスペースを追加することがあります。新しい形状を完全に持つには、古いものを入れ替えます。clearTopoGeomを参照して下さい。

Availability: 2.0

Enhanced: 2.1.0版では、既存のTopoGeometryを取る形式が追加されました。

Changed: 3.7.0 許容値 0を実際の 0として扱い、-1 (新デフォルト値)をそのトポロジーの精度を使うよう求めるように変更されました。

これは完全に全て揃ったワークフローです。

許容値を許さないトポロジーを生成します。

SELECT topology.CreateTopology('topo_boston_test', 2249);

新しいテーブルを生成します。

CREATE TABLE nei_topo(gid serial primary key, nei varchar(30));

新しいテーブルにトポジオメトリーカラムを追加します。

SELECT topology.AddTopoGeometryColumn('topo_boston_test', 'public', 'nei_topo', 'topo', 'MULTIPOLYGON') AS new_layer_id;
1

新しいレイヤーの識別子を使ってトポジオメトリーカラムを投入します。

INSERT INTO nei_topo(nei, topo)
SELECT nei,  topology.toTopoGeom(geom, 'topo_boston_test', 1)
FROM neighborhoods
WHERE gid BETWEEN 1 and 15;

何が起こったかを確認します。

SELECT * FROM
    topology.TopologySummary('topo_boston_test');
Topology topo_boston_test (5), SRID 2249, precision 0
61 nodes, 87 edges, 35 faces, 15 topogeoms in 1 layers
Layer 1, type Polygonal (3), 15 topogeoms
 Deploy: public.nei_topo.topo

全てのTopoGeometryポリゴンを10メートル後退させます。

UPDATE nei_topo SET topo = toTopoGeom(ST_Buffer(topo, -10), clearTopoGeom(topo), 0);
        

後退処理後にTopoGeometry参照が全くないフェイスを探索します。

SELECT ST_GetFaceGeometry('topo_boston_test', f.face_id)
  FROM topo_boston_test.face f
  WHERE f.face_id 
> 0
  AND NOT EXISTS (
    SELECT * FROM topo_boston_test.relation
    WHERE layer_id = 1 AND element_id = f.face_id
  );