toTopoGeom — 単純なジオメトリからTopoGeometryを生成します。
topogeometry toTopoGeom(geometry geom, varchar toponame, integer layer_id, float8 tolerance);
topogeometry toTopoGeom(geometry geom, topogeometry topogeom, float8 tolerance);
単純なジオメトリからTopoGeometryを生成します。
入力ジオメトリを表現するために必要なトポロジプリミティブが、下位にあるトポロジに追加されます。既存のものを分割することもあります。relationテーブル内のTopoGeometryの出力に紐づきます。
既存のTopoGeometryオブジェクトは形状を維持します (topogeomが与えられている場合には、それが例外となる可能性があります)。
toleranceは、与えられた場合には、入力ジオメトリを既存のプリミティブにスナップさせるために使われます。
1番目の形式では、新しいTopoGeometryは、与えられたトポロジ (toponame)の与えられたレイヤ (layer_id)に作られます。
2番目の形式では、変換結果のプリミティブが、既存のTopoGeometry (topogeom)に追加されます。また、最終の形状にスペースを追加することがあります。新しい形状を完全に持つには、古いものを入れ替えます。clearTopoGeomを参照して下さい。
Availability: 2.0
Enhanced: 2.1.0版では、既存のTopoGeometryを取る形式が追加されました。
これは完全に全て揃ったワークフローです。
-- トポロジのセットアップがまだ終わっていない場合に実行します。
-- 許容値を許可しません。
SELECT topology.CreateTopology('topo_boston_test', 2249);
-- 新しいテーブルの生成
CREATE TABLE nei_topo(gid serial primary key, nei varchar(30));
-- TopoGeometryカラムの追加
SELECT topology.AddTopoGeometryColumn('topo_boston_test', 'public', 'nei_topo', 'topo', 'MULTIPOLYGON') As new_layer_id;
new_layer_id
-----------
1
-- 新しいTopoGeometryカラムの投入に新しいレイヤIDを使います。
-- TopoGeometryを新しいレイヤに許容値0で追加します。
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 = ST_Buffer(clearTopoGeom(topo), -10);
-- 上の操作で何も無いようになった土地の取得
-- GRASSでは"polygon0 layer"と呼ばれているものと思います
SELECT ST_GetFaceGeometry('topo_boston_test', f.face_id)
FROM topo_boston_test.face f
WHERE f.face_id
> 0 -- don't consider the universe face
AND NOT EXISTS ( -- check that no TopoGeometry references the face
SELECT * FROM topo_boston_test.relation
WHERE layer_id = 1 AND element_id = f.face_id
);