第10章 トポロジ

目次
10.1. トポロジ型
10.2. トポロジドメイン
10.3. トポロジ管理とTopoGeometry管理
10.4. トポロジ統計管理
10.5. トポロジコンストラクタ
10.6. トポロジエディタ
10.7. トポロジアクセサ
10.8. トポロジ処理
10.9. TopoGeometryコンストラクタ
10.10. TopoGeometryエディタ
10.11. TopoGeometryアクセサ
10.12. TopoGeometry出力
10.13. トポロジ空間関係関数

PostGISトポロジ型と関数は、フェイス、エッジ、ノード等のトロポジオブジェクトを管理するために使います。

PostGIS Day Paris 2011におけるSandro Santilliさんの講演が、PostGISトポロジの概略説明として良いです。Topology with PostGIS 2.0 slide deckにあります。

Vincent Picavetさんはトポロジとは何か、どのように使われるか、および、対応するFOSS4Gツールに関する良い概略説明をPostGIS Topology PGConf EU 2012で出しています。

トポロジベースのGISデータベースの例としてUS Census Topologically Integrated Geographic Encoding and Referencing System (TIGER)があります。PostGISトポロジの試験がしたくて、何らかのデータが必要ならTopology_Load_Tigerをご覧下さい

PostGISトポロジモジュールは前の版にもありましたが、正式なPostGIS文書の中には入れていませんでした。PostGIS 2.0.0 では、全ての非推奨関数を無くし、知られていた使いやすさの問題を解決し、機能と関数の文書をより良くし、新しい関数を追加し、SQL-MM標準により準拠させるために、大整理を行っています。

このプロジェクトの詳細情報はPostGIS Topology Wikiにあります。

このモジュールに関する全ての関数とテーブルは、topologyスキーマにインストールされます。

SQL/MM標準で定義される関数はST_プリフィクスを持ち、PostGIS特有の関数はこのプリフィクスを持ちません。

PostGIS 2.0以降では、トポロジ機能はデフォルトでビルドされます。2章PostGISインストールで説明されている通り、ビルド時のコンフィギュアオプション --without-topology を指定することで、無効にできます。

10.1. トポロジ型

概要

本節では、PostGISトポロジでインストールされるPostgreSQLデータ型の一覧を挙げます。独自に関数をデザインする際に特に重要となる、キャストでの挙動を記述していることにご注意ください。

getfaceedges_returntype — 順序番号とエッジ番号で構成される複合型。
TopoGeometry — トポロジとして定義されたジオメトリを表現する型です。
validatetopology_returntype — エラーメッセージとエラーの場所を示すid1とid2からなる複合型です。これはValidateTopologyが返す型です。

10.2. トポロジドメイン

概要

本節では、PostGISトポロジでインストールされるPostgreSQLドメインの一覧を挙げます。ドメインは、オブジェクト型のように扱え、関数やテーブルカラムのオブジェクトを返します。ドメインは存在するチェック制約を持つ既存の型である点で、型とは違います。

TopoElement — 二つの整数の配列で、通常TopoGeometry要素を識別するために使われます。
TopoElementArray — TopoElementオブジェクトの配列

10.3. トポロジ管理とTopoGeometry管理

概要

本節では、新しいトポロジスキーマの構築、トポロジの評価、TopoGeometryカラムの管理のためのトポロジ関数の一覧を挙げます。

AddTopoGeometryColumn — 既存のテーブルにTopoGeometryカラムを追加し、topology.layer内に新しいレイヤとして新しいカラムを登録して、新しい layer_id を返します。
DropTopology — 使用上の注意: この関数によって、トポロジスキーマが削除され、topology.topologyテーブルからの参照が削除され、geometry_columnsテーブルから削除対象スキーマ内のテーブルへの参照が削除されます。
DropTopoGeometryColumnschema_nameで指定されたスキーマ内にあるtable_nameで指定されたテーブルからTopoGeometryカラムを削除し、topology.layerテーブルにある登録を解除します。
Populate_Topology_Layer — テーブルからメタデータを読み、topology.layerテーブルに不足しているものを追加します。
TopologySummary — トポロジ名を取り、トポロジ内のオブジェクトの型に関する概要の全体を提供します。
ValidateTopology — トポロジの問題についての詳細を示すvalidatetopology_returntypeの集合を返します。
ValidateTopologyRelation — 不正なトポロジ関係の行に関する情報を返します。
FindTopology — 異なる方法でトポロジ行を返します。

10.4. トポロジ統計管理

概要

本節では、トポロジ構築時のデータベース統計の管理について説明します。

トポロジに要素を追加すると、そのトリガとして、分割されることになる既存のエッジを探索し、ノードを追加し、新しいラインでノードを作成するエッジを更新するために多数のデータベースクエリが発生します。このため、トポロジテーブル内のデータに関する統計情報が最新の状態になっているなら、統計情報を使うと便利です。

PostGISトポロジーの追加や編集の関数は、自動的に統計情報を更新することはありません。トポロジにおいて逐次変更していては、統計情報の更新が過剰になるためです。処理は呼び出し元の義務となっています。

[注記]

autovacuumで更新された統計情報は、autovacuumプロセス完了前に始まったトランザクションからは見えないので、更新した統計情報を使うには、実行時間の長いトランザクションではANALYZE自体を実行する必要があります。

10.5. トポロジコンストラクタ

概要

本節では、新しいトポロジを生成するトポロジ関数を挙げます。

CreateTopology — 新しいトポロジスキーマを生成し、新しいスキーマをtopology.topologyテーブルに登録します。
CopyTopology — トポロジ構造 (ノード、エッジ、フェイス、レイヤ、TopoGeometry)を複写します。
ST_InitTopoGeo — 新しいトポロジスキーマを生成し、topology.topologyテーブルに新しいスキーマを登録し、処理の概要を表示します。
ST_CreateTopoGeo — 空のトポロジにジオメトリのコレクションを追加し、成否を示すメッセージを返します。
TopoGeo_AddPoint — 許容差を使って既存のトポロジにポイントを追加し、可能ならエッジを分割します。
TopoGeo_AddLineString — 許容差を使って既存のトポロジにラインストリングを追加し、可能ならエッジ/フェイスを分割します。エッジ識別番号を返します。
TopoGeo_AddPolygon — 許容差を使って既存のトポロジにラインストリングを追加し、可能ならエッジ/フェイスを分割します。エッジ識別番号を返します。

10.6. トポロジエディタ

概要

本節では、エッジ、フェイス、ノードの追加、移動、削除、分割に関する関数を挙げます。本節の関数はすべてISO SQL/MMで定義されています。

ST_AddIsoNode — フェイスに孤立ノードを追加し、新しいノードの識別番号を返します。フェイスがNULLの場合でもノードは生成されます。
ST_AddIsoEdgeanodeanothernodeで指定される二つの既存孤立ノードを接続するトポロジに、ジオメトリalinestringで定義される孤立エッジを追加し、新しいエッジの識別番号を返します。
ST_AddEdgeNewFaces — 新しいエッジを追加します。新しいエッジがフェイスを分割する場合には、もとのフェイスを削除して、分割した二つのフェイスに置き換えます。
ST_AddEdgeModFace — 新しいエッジを追加します。新しいエッジがフェイスを分割する場合には、もとのフェイスを編集し、一つのフェイスを追加します。
ST_RemEdgeNewFace — エッジを削除し、消去対象エッジでフェイスが二つに分割されているなら元の二つのフェイスを削除し、一つの新しいフェイスに置き換えます。
ST_RemEdgeModFace — エッジを削除し、削除対象エッジでフェイスが二つに分割されているなら、両方の空間をとるため、一つを削除して、もう一つを編集します。
ST_ChangeEdgeGeom — トポロジ構造に影響を与えることなくエッジの形状を変更します。
ST_ModEdgeSplit — 既存のエッジに沿って新しいノードを生成してエッジを分割します。もとのエッジは変更され、新しいエッジが一つ追加されます。
ST_ModEdgeHeal — 二つのエッジについて、接続しているノードを削除して修復します。1番目のエッジを編集して、2番目のエッジを削除します。削除されたノードの識別番号を返します。
ST_NewEdgeHeal — 二つのエッジについて、接続しているノードを削除して修復します。両方のエッジを削除し、1番目のエッジと同じ方向のエッジに置き換えます。
ST_MoveIsoNode — トポロジ内の孤立ノードを別の位置に移動させます。新しいapointジオメトリがノードとして存在しているなら、エラーが投げられます。移動に関する説明を返します。
ST_NewEdgesSplit — 新しいノードを既存のエッジに沿って作成して、エッジを分割します。もとのエッジは削除され、二つのエッジに置き換えられます。二つの新しいエッジに接続する新しいノードの識別番号を返します。
ST_RemoveIsoNode — 孤立ノードを削除し、実行結果が返されます。ノードが孤立していない (エッジの始端または終端である)場合には、例外が投げられます。
ST_RemoveIsoEdge — 孤立エッジを削除し、実行結果の記述を返します。エッジが孤立していない場合には、例外が投げられます。

10.7. トポロジアクセサ

GetEdgeByPoint — 与えられたポイントにインタセクトするエッジの識別番号を探索します。
GetFaceByPoint — 与えたポイントとインタセクトするフェイスを見つけます。
GetFaceContainingPoint — ポイントを含むフェイスを見つけます。
GetNodeByPoint — ポイント位置にあるノードの識別番号を探索します。
GetTopologyID — トポロジ名からtopology.topologyテーブル内にあるトポロジの識別番号を返します。
GetTopologySRID — トポロジ名からtopology.topologyテーブル内にあるトポロジのSRIDを返します。
GetTopologyName — 識別番号からトポロジ (スキーマ)の名前を返します。
ST_GetFaceEdges — 順序番号を含む、afaceの境界となる、整列したエッジの集合を返します。
ST_GetFaceGeometry — 指定されたトポロジの中の、フェイス識別番号で指定されたポリゴンを返します。
GetRingEdges — 与えられた側を歩いて得られた、正負符号付きエッジ識別番号の集合を、順序通りに返します。
GetNodeEdges — 与えられたノードに付随するエッジの集合を整列して返します。

10.8. トポロジ処理

概要

本節では、非標準の手法でのトポロジ処理の関数を挙げます。

Polygonize — トポロジエッジで定義される全てのフェイスを探索し、追加します。
AddNode — 指定したトポロジスキーマのノードテーブルにポイントノードを追加し、新しいノードの識別番号を返します。指定したポイントに既にノードがある場合は既存のノード識別番号を返します。
AddEdge — 指定したラインストリングジオメトリを使って、ラインストリングエッジをエッジテーブルに追加し、指定したトポロジスキーマの始点終点をポイントノードテーブルに追加し、新しい (または既存の)エッジの識別番号を返します。
AddFace — フェイスプリミティブをトポロジに登録し、その識別番号を得ます。
ST_Simplify — 与えたTopoGeometryを「シンプル化した」ジオメトリを返します。ダグラス-ポーカーのアルゴリズムを使います。

10.9. TopoGeometryコンストラクタ

概要

本節では、新しいTopoGeometryを生成するトポロジ関数を挙げます。

CreateTopoGeom — 新しいTopoGeometryオブジェクトをtopoエレメント配列から生成します - tg_type: 1:[multi]point, 2:[multi]line, 3:[multi]poly, 4:collection
toTopoGeom — 単純なジオメトリからTopoGeometryを生成します。
TopoElementArray_Agg — element_idとタイプの配列 (topoelements)からなるtopoelementarrayを返します。

10.10. TopoGeometryエディタ

概要

本節では、既存のTopoGeometryを編集する関数を挙げます。

clearTopoGeom — TopoGeometryの中身を消去します。
TopoGeom_addElement — TopoGeometryの定義に要素を追加します。
TopoGeom_remElement — TopoGeometryの定義から要素を削除します。
TopoGeom_addTopoGeom — TopoGeometryの要素を他のTopoGeometryの定義に追加します。
toTopoGeom — ジオメトリの形状を既存のTopoGeometryに追加します。

10.11. TopoGeometryアクセサ

GetTopoGeomElementArray — 与えられたTopoGeometry (プリミティブ要素)のトポロジ要素とタイプを含むtopoelementarray (topoelementの配列)を返します。
GetTopoGeomElements — 与えられたTopoGeometry (プリミティブ要素)の、トポロジのelement_idとelement_typeを含むtopoelementオブジェクトの集合を返します。

10.12. TopoGeometry出力

AsGML — TopoGeometryのGML表現を返します。
AsTopoJSON — opoGeometryのTopoJSON表現を返します。

10.13. トポロジ空間関係関数

概要

本節では、TopoGeometryとトポロジプリミティブとの間の関係を見るトポロジ関数の一覧を挙げます。

Equals — 二つのTopoGeometryが同じトポロジプリミティブで成っている場合にtrueを返します。
Intersects — 二つのTopoGeometryからのプリミティブの組がインタセクトする場合にtrueを返します。