1.5 トポロジ・データ・モデル表

Oracle Spatialのトポロジ機能を使用するには、最初に特別なエッジ表、ノード表およびフェイス表にデータを挿入する必要があり、これらの表は、トポロジの作成時にSpatialによって作成されます。

エッジ表、ノード表およびフェイス表については、それぞれ「エッジ情報表」「ノード情報表」および「フェイス情報表」を参照してください。

Spatialは、各トポロジの関係情報(<topology-name>_RELATION$)表を自動的に管理し、この表は、フィーチャ表がトポロジに初めて関連付けられたとき(トポロジを指定するSDO_TOPO.ADD_TOPO_GEOMETRY_LAYERプロシージャを初めてコールしたとき)に作成されます。関係情報表については、「関係情報表」を参照してください。

図1-5に、フィーチャ表内の情報をノード表、エッジ表またはフェイス表内の情報に関連付ける際の、関係情報表の役割を示します。

図1-5 フィーチャ表とトポロジ表間のマッピング

図1-5の説明が続きます
図1-5「フィーチャ表とトポロジ表間のマッピング」の説明

図1-5に示すとおり、フィーチャ表とトポロジのノード表、エッジ表およびフェイス表間のマッピングは、<topology-name>_RELATION$表を介して行われます。具体的には、次のとおりです。

  • 各フィーチャ表には、SDO_TOPO_GEOMETRY型の列が含まれます。この型には、TG_LAYER_ID属性(レイヤーの作成時にOracle Spatialによって割り当てられる一意のID)およびTG_ID属性(レイヤー内の各フィーチャに割り当てられる一意のID)が含まれます。これらの2つの列内の値に対応する値が、<topology-name>_RELATION$表内のTG_LAYER_ID列およびTG_ID列に存在します。

  • 各フィーチャに対応する行が、<topology-name>_RELATION$表内に1つ以上存在します。

  • フィーチャのTG_LAYER_ID値とTG_ID値を指定すると、<topology-name>_RELATION$表内のTOPO_ID値(ノード、エッジまたはフェイスのID)と<topology-name>_NODE$表、<topology-name>_EDGE$表または<topology-name>_FACE$表内の対応するID値を一致させることによって、そのフィーチャに関連付けられた一連のノード、フェイスおよびエッジが判断されます。

次の考慮事項は、スキーマ、表、および任意のOracle Spatialメタデータ・ビューに格納されている列名に適用されます。たとえば、これらの注意事項は、エッジ情報表、ノード情報表、フェイス情報表、関係情報表および履歴情報表の名前に適用されます。また、これらの表内の任意の列の名前や、「トポロジのメタデータ・ビュー」で説明するトポロジ・メタデータ・ビューに格納されるこれらの表のスキーマにも適用されます。

  • 名前には、文字、数字、下線のみが使用できます。たとえば、名前にスペース( )、アポストロフィ(')、引用符(")またはカンマ(,)を含めることはできません。

  • 名前の中の文字はすべて、名前がメタデータ・ビューに格納される前または表がアクセスされる前に大文字に変換されます。表名で指定されるすべてのスキーマ名も、同様に変換されます。

1.5.1 エッジ情報表

トポロジ内のエッジに関する情報は、<topology-name>_EDGE$表に格納する必要があります。<topology-name>は、SDO_TOPO.CREATE_TOPOLOGYプロシージャへのコールに指定した、そのトポロジの名前です。各エッジ情報表には、表1-1に示す列が含まれます。

表1-1 <topology-name>_EDGE$表内の列

列名 データ型 説明

EDGE_ID

NUMBER

このエッジの一意のID番号です。

START_NODE_ID

NUMBER

このエッジの開始ノードのID番号です。

END_NODE_ID

NUMBER

このエッジの終了ノードのID番号です。

NEXT_LEFT_EDGE_ID

NUMBER

このエッジの左の次のエッジのID番号(符号付き)です。

PREV_LEFT_EDGE_ID

NUMBER

このエッジの左の前のエッジのID番号(符号付き)です。

NEXT_RIGHT_EDGE_ID

NUMBER

このエッジの右の次のエッジのID番号(符号付き)です。

PREV_RIGHT_EDGE_ID

NUMBER

このエッジの右の前のエッジのID番号(符号付き)です。

LEFT_FACE_ID

NUMBER

このエッジの左のフェイスのID番号です。

RIGHT_FACE_ID

NUMBER

このエッジの右のフェイスのID番号です。

GEOMETRY

SDO_GEOMETRY

このエッジを表すジオメトリ・オブジェクト(線ストリング)で、正の有向エッジの自然な順序に従って座標を示します。

NEXT_LEFT_EDGE_ID値とNEXT_RIGHT_EDGE_ID値は、それぞれ左と右のフェイスの周囲を反時計回りに図示した場合の、次の有向エッジを示します。PREV_LEFT_EDGE_ID値とPREV_RIGHT_EDGE_ID値は、それぞれ左と右のフェイスの周囲を反時計回りに図示した場合の、前の有向エッジを示します。LEFT_FACE_ID値は正の有向エッジの左にあるフェイスを示し、RIGHT_FACE_ID値は負の有向エッジの左にあるフェイスを示します。数値IDの場合、符号は示されているターゲット・エッジの方向を表します。

図1-6に、エッジ情報表内の様々なID列間の関係を表すノード、エッジおよびフェイスを示します。(図1-6では、太い線はエッジを表し、矢印付きの細い線は各エッジの方向を表します。)

図1-6 ノード、エッジおよびフェイス

図1-6の説明が続きます
図1-6「ノード、エッジおよびフェイス」の説明

表1-2に、図1-6のエッジE4およびE8のエッジ情報表内のID列値を示します。(表1-2では、わかりやすくするために、ID列値をE4やN1などのアルファベット文字で示していますが、実際のID列には数値(指定された各オブジェクトに関連付けられた数値ID)のみが含まれます。)

表1-2 エッジ表のID列値

EDGE_ID START_NODE_ID END_NODE_ID NEXT_LEFT_EDGE_ID PREV_LEFT_EDGE_ID NEXT_RIGHT_EDGE_ID PREV_RIGHT_EDGE_ID LEFT_FACE_ID RIGHT_FACE_ID

E4

N1

N2

-E5

E3

E2

-E6

F1

F2

E8

N4

N3

-E8

-E8

E8

E8

F2

F2

次に、図1-6および表1-2について説明します。

  • エッジE4の開始ノードはN1で、終了ノードはN2です。エッジE4の左の次のエッジはE5ですが、E5の方向はエッジE4と逆であるため、E4の左の次のエッジは-E5(負のE5)として格納されます。

  • エッジE4の左の前のエッジはE3です。E3はエッジE4と同じ方向であるため、エッジE4の左の前のエッジはE3として格納されます。

  • 右の次のフェイスは、E4の負の有向エッジを使用して判断します。これは、エッジ方向を逆にして、次の左のエッジと前の左のエッジを取ると考えることができます。この場合、右の次のエッジはE2で、右の前のエッジは-E6 (エッジE6の方向は、エッジE4の負の方向と逆)です。エッジE4の場合、左のフェイスはF1で、右のフェイスはF2です。

  • エッジE1およびE7は、エッジE4の左端のエッジでも右端のエッジでもありません。このため、エッジE1およびE7は、エッジE4に関連付けられたエッジ表の行に表示されません。

1.5.2 ノード情報表

トポロジ内のノードに関する情報は、<topology-name>_NODE$表に格納する必要があります。<topology-name>は、SDO_TOPO.CREATE_TOPOLOGYプロシージャへのコールに指定した、そのトポロジの名前です。各ノード情報表には、表1-3に示す列が含まれます。

表1-3 <topology-name>_NODE$表内の列

列名 データ型 説明

NODE_ID

NUMBER

このノードの一意のID番号です。

EDGE_ID

NUMBER

このノードに関連付けられたエッジ(存在する場合)のID番号(符号付き)です。

FACE_ID

NUMBER

このノードに関連付けられたフェイス(存在する場合)のID番号です。

GEOMETRY

SDO_GEOMETRY

このノードを表すジオメトリ・オブジェクト(点)です。

各ノードでは、EDGE_ID値またはFACE_ID値のいずれかがNULLである必要があります。

  • EDGE_ID値がNULLである場合、ノードは孤立ノードです(つまり、フェイス内で孤立しています)。

  • FACE_ID値がNULLである場合、ノードは孤立ノードではなく、エッジの開始ノードまたは終了ノードです。

1.5.3 フェイス情報表

トポロジ内のフェイスに関する情報は、<topology-name>_FACE$表に格納する必要があります。<topology-name>は、SDO_TOPO.CREATE_TOPOLOGYプロシージャへのコールに指定した、そのトポロジの名前です。各フェイス情報表には、表1-4に示す列が含まれます。

表1-4 <topology-name>_FACE$表内の列

列名 データ型 説明

FACE_ID

NUMBER

このフェイスの一意のID番号です。

BOUNDARY_EDGE_ID

NUMBER

このフェイスの境界エッジのID番号です。この番号の符号(キーとして使用する場合は無視されます)は、この境界コンポーネントに使用されている方向を示します(正の番号はエッジの左を表し、負の番号はエッジの右を表します)。

ISLAND_EDGE_ID_LIST

SDO_LIST_TYPE

このフェイス内の孤立エッジ(存在する場合)です。(SDO_LIST_TYPE型の詳細は、「SDO_LIST_TYPE型」を参照してください。)

ISLAND_NODE_ID_LIST

SDO_LIST_TYPE

このフェイス内の孤立ノード(存在する場合)です。(SDO_LIST_TYPE型の詳細は、「SDO_LIST_TYPE型」を参照してください。)

MBR_GEOMETRY

SDO_GEOMETRY

このフェイスを囲む最小境界矩形(MBR)です。(ユニバース・フェイスの場合を除き、これは必須です。)MBRは、最適化された矩形(左下の角と右上の角のみが指定されている矩形)として格納する必要があります。SDO_TOPO.INITIALIZE_METADATAプロシージャによって、この列に空間索引が作成されます。

1.5.4 関係情報表

位相要素を処理すると、各オブジェクトの情報が、Spatialによって自動的に<topology-name>_RELATION$表に保持され(<topology-name>はトポロジの名前)、この表は、各トポロジに1つ存在します。表内の各行では、トポロジ・ジオメトリが、トポロジ・ジオメトリ・レイヤーおよびトポロジに関して一意に識別されます。各関係情報表には、表1-5に示す列が含まれます。

表1-5 <topology-name>_RELATION$表内の列

列名 データ型 説明

TG_LAYER_ID

NUMBER

トポロジ・ジオメトリが属するトポロジ・ジオメトリ・レイヤーのID番号です。

TG_ID

NUMBER

トポロジ・ジオメトリのID番号です。

TOPO_ID

NUMBER

トポロジ・ジオメトリ・レイヤー階層を含まないトポロジの場合は、トポロジ・ジオメトリ内の位相要素のID番号です。

トポロジ・ジオメトリ・レイヤー階層を含むトポロジの場合は、Oracleで使用するために予約されています。

TOPO_TYPE

NUMBER

トポロジ・ジオメトリ・レイヤー階層を含まないトポロジの場合、1はノード、2はエッジ、3はフェイスを表します。

トポロジ・ジオメトリ・レイヤー階層を含むトポロジの場合は、Oracleで使用するために予約されています。

TOPO_ATTRIBUTE

VARCHAR2

Oracleで使用するために予約されています。

1.5.5 履歴情報表

トポロジの履歴情報表には、他の情報表には記録されない編集操作に関する情報が格納されます。したがって、履歴情報表はトポロジの変更を包括的に記録したものではありません。履歴情報表にノード、エッジまたはフェイスの編集操作の行が含まれるのは、トポロジに1つ以上のフィーチャ表が関連付けられ、さらに次の条件のいずれかに該当する場合のみです。

  • 操作の結果として、既存のフェイスまたはエッジが分割される場合。

  • 操作の結果として、2つのフェイスまたは2つのエッジがマージされて1つのフェイスまたはエッジが作成される場合。

これらの操作の情報は、Spatialによって自動的に<topology-name>_HISTORY$表に保持され(<topology-name>はトポロジの名前)、この表は、各トポロジに1つ存在します。1つの編集操作(SDO_TOPO_MAP.ADD_POLYGON_GEOMETRYファンクションの使用など)によって複数の行が追加される場合もありますが、表内の各行は位相要素に対する1つの編集操作を一意に識別します。(トポロジの編集の詳細は、「トポロジの編集」を参照してください。)各履歴情報表には、表1-6に示す列が含まれます。

表1-6 <topology-name>_HISTORY$表内の列

列名 データ型 説明

TOPO_TX_ID

NUMBER

SDO_TOPO_MAP.LOAD_TOPO_MAPファンクションまたはプロシージャへのコールか、JavaメソッドのloadWindowまたはloadTopologyへのコールによって開始されたトランザクションのID番号です。各トランザクションは、複数の編集操作で構成される場合があります。現行の更新可能なTopoMapオブジェクトのトランザクションのID番号を取得するには、SDO_TOPO_MAP.GET_TOPO_TRANSACTION_IDファンクションをコールします。

TOPO_SEQUENCE

NUMBER

トランザクションでの編集操作に割り当てられた順序番号です。

TOPOLOGY

VARCHAR2

編集されるオブジェクトを含むトポロジのIDです。

TOPO_ID

NUMBER

トポロジ・ジオメトリ内の位相要素のID番号です。

TOPO_TYPE

NUMBER

位相要素のタイプです。1はノード、2はエッジ、3はフェイスを表します。

TOPO_OP

VARCHAR2

位相要素に対して実行された編集操作のタイプです。Iは挿入、Dは削除を表します。

PARENT_ID

NUMBER

挿入操作の場合、現行の位相要素の導出元の親位相要素のIDです。削除操作の場合、結果の位相要素のIDです。

次の例を参考にしてください。

  • 1つのノードを追加してE2を分割し、エッジE3を生成します。この場合、新しいエッジのTOPO_ID値はE3のID、TOPO_TYPE値は2、PARENT_ID値はE2のID、TOPO_OP値はIになります。

  • 1つのノードを削除してエッジE6とE7をマージし、E7のみにします。この場合、TOPO_ID値はE6のID、TOPO_TYPE値は2、PARENT_ID値はE7のID、TOPO_OP値はDになります。

履歴情報表に対する編集操作の影響をより詳細に示すために、テスト・プロシージャを作成し、単純なトポロジに対して各種編集操作を実行し、トポロジの履歴情報表への影響を調査しました。このプロシージャで実行した主なステップは次のとおりです。

  1. ユニバース・フェイスを使用して非測地トポロジを作成および初期化し、そのトポロジに線フィーチャ・レイヤーと領域フィーチャ・レイヤーを追加しました。

  2. 4つの孤立ノードとこれらの孤立ノードを接続する4つのエッジを追加して、矩形領域を作成しました。これにより、(矩形で構成されている)フェイスが作成されました。また、親がユニバース・フェイスであるこの新しいフェイスの挿入操作に対して履歴情報表に1つの行が追加されました。

    次の文に、この挿入によって追加された履歴情報表の行を示します。

    SELECT topo_id, topo_type, topo_op, parent_id
      FROM hist_test_history$ ORDER BY topo_tx_id, topo_sequence, topology;
     
       TOPO_ID  TOPO_TYPE TOP  PARENT_ID
    ---------- ---------- --- ----------
             1          3 I           -1
     
    1 row selected.
    
  3. 2つのノードとこれらのノードを接続する垂直のエッジを追加して、2つのエッジ(上下のエッジ)とフェイスを分割することによって、矩形のフェイスを(横に並んだ)2つの小さな矩形フェイスに分割します。履歴情報表には、2つの新しいエッジ(新しい各エッジの親は分割された既存のエッジ)のそれぞれの挿入操作および新しいフェイス(親は分割された元の矩形フェイス)の挿入操作に対する3つの行が追加されています。

    次の文に、これまでに追加された履歴情報表の行を示します。このステップで追加された行は太字で示しています。

    SELECT topo_id, topo_type, topo_op, parent_id
      FROM hist_test_history$ ORDER BY topo_tx_id, topo_sequence, topology;
     
       TOPO_ID  TOPO_TYPE TOP  PARENT_ID
    ---------- ---------- --- ----------
             1          3 I           -1
             6          2 I            2
             7          2 I            4
             2          3 I            1
     
    4 rows selected.
    
  4. (既存のノードを使用して)左の小さな矩形フェイスに対角線のエッジを追加し、ステップ3で追加された垂直のエッジを削除しています。履歴情報表には、エッジを追加した結果として作成された新しいフェイスの挿入操作(新しい各フェイスの親は分割された左の小さな矩形フェイス)と、エッジを削除した際の削除操作(結果として生成されるフェイスはマージされた親フェイスの1つから位相オブジェクトIDを取得)に対する2つの行が追加されています。

    次の文に、これまでに追加された履歴情報表の行を示します。このステップで追加された行は太字で示しています。

    SELECT topo_id, topo_type, topo_op, parent_id
      FROM hist_test_history$ ORDER BY topo_tx_id, topo_sequence, topology;
     
       TOPO_ID  TOPO_TYPE TOP  PARENT_ID
    ---------- ---------- --- ----------
             1          3 I           -1
             6          2 I            2
             7          2 I            4
             2          3 I            1
             3          3 I            2
             1          3 D            2
     
    6 rows selected.