2.2 ノードでの操作の実行

このトピックでは、ノードの追加、移動および削除の影響と、PL/SQL APIを使用してこれらの操作を実行する方法について説明します。

2.2.1 ノードの追加

連結ノードを追加すると、現在のエッジ上の点にノードが追加されます。また、この操作によって元のエッジが2つのエッジに分割されます。Spatialによって元のエッジの定義が自動的に調整され、新しいエッジが作成されます(新しいエッジに、トポロジ内のエッジで一意のID値が割り当てられます)。

連結ノードを追加するには、SDO_TOPO_MAP.ADD_NODEファンクションを使用します。孤立ノードを追加するには、SDO_TOPO_MAP.ADD_ISOLATED_NODEファンクションを使用します。

図2-3に、エッジE1へのノード(N3)の追加を示します。

図2-3 連結ノードの追加

図2-3の説明が続きます
図2-3「連結ノードの追加」の説明

図2-3に示す操作の結果は、次のとおりです。

  • エッジE1が、元のエッジの開始点とノード(N3)の追加点の間に再定義されます。

  • エッジE2が作成されます。開始点はノードN3の点で、終了点は元のエッジの終了点です。

  • 元のエッジに線形フィーチャが定義されていた場合、線形フィーチャは結果として生成された両方のエッジに自動的に再定義され、エッジは分割され、トポロジの履歴情報表(「履歴情報表」を参照)に記録が追加されます。たとえば、図2-3の元のエッジE1に大通りという名前の通りが定義されていた場合、ノードN3の追加後、大通りがエッジE1とE2の両方に定義されます。

図2-4に、より複雑なノードの追加例を示します。この例では、追加されたノードが元のエッジの新しい形状点であるかどうか(つまり、SDO_TOPO_MAP.ADD_NODEファンクションのis_new_shape_pointパラメータの値)に応じて結果が異なります。

図2-4 ノードの追加に及ぼすis_new_shape_point値の影響

図2-4の説明が続きます
図2-4「ノードの追加に及ぼすis_new_shape_point値の影響」の説明

次に、図2-4について説明します。

  • 1つ目の図では、元のエッジ(E1)がノードN1から開始してN2で終了し、中間に2つの形状点があります。

  • 2つ目の図では、新しいノード(N3)が追加されていますが、このノードは元のエッジの形状点ではなく、新しい形状点です(つまり、is_new_shape_point=>'TRUE'です)。新しいノードは、pointパラメータで指定した場所に追加され、coord_indexパラメータで指定した頂点より後(この場合、coord_index=>1となるため最初の頂点の後)に追加されます。新しいノードは、エッジE1の終了ノード、および新しいエッジE2の開始ノードとなり、エッジE2はノードN2で終了します。

  • 3つ目の図では、新しいノード(N3)が追加されていますが、このノードは元のエッジの形状点であるため、新しい形状点ではありません(つまり、is_new_shape_point=>'FALSE'です)。追加されたノードが新しい形状点ではないため、ノードはcoord_indexパラメータ(この場合はcoord_index=>2)で指定された頂点に追加されます。2つ目の図で示すように、新しいノードは、エッジE1の終了ノード、および新しいエッジE2の開始ノードとなり、エッジE2はノードN2で終了します。

2.2.2 ノードの移動

連結ノードを新しい位置に移動すると、ノードに接するすべてのエッジの点が、ノードとともに移動します。ノードの移動によって影響を受けるすべてのエッジの頂点を指定する必要があります。移動したノードに接する各点(開始点または終了点)は、ノードの新しい位置と同じ座標を持つ必要があり、影響を受ける各エッジのもう一方の点(移動したノードではない点)は、変わらないままである必要があります。

連結ノードを移動するには、SDO_TOPO_MAP.MOVE_NODEプロシージャを使用します。孤立ノードを移動するには、SDO_TOPO_MAP.MOVE_ISOLATED_NODEプロシージャを使用します。

図2-5に、ノードN1を移動する前の元のトポロジを示します。

図2-5 連結ノードの移動前のトポロジ

図2-5の説明が続きます
図2-5「連結ノードの移動前のトポロジ」の説明

図2-6に、ノードN1を移動した後の元のトポロジの2つの状態を示します。一方では、リシェイプが実行されていません。つまり、移動の影響を受けるすべてのエッジが直線として指定されています。もう一方では、リシェイプが行われています。この場合、影響を受ける1つ以上のエッジが、複数の頂点のある線セグメントとして指定されています。

図2-6 連結ノードの移動後のトポロジ

図2-6の説明が続きます
図2-6「連結ノードの移動後のトポロジ」の説明

次に、図2-6に示す両方の状態について説明します。

  • トポロジは変更されません。つまり、ノード、エッジおよびフェイスの数およびそれらの関係(近接性、接続性など)は変更されません。

  • ノード、エッジおよびフェイスに定義されたすべてのフィーチャは、そのまま保持されます。

連結ノードの移動操作の結果、孤立ノードおよび孤立エッジは同じフェイス内に残るか、別のフェイスに移動します。SDO_TOPO_MAP.MOVE_NODEプロシージャには、moved_iso_nodesおよびmoved_iso_edgesの2つの出力パラメータがあります。これらのパラメータには、操作の結果として別のフェイスに移動した孤立ノードおよび孤立エッジのID番号が格納されます。

移動の結果として次のことが発生する場合は、ノードを移動できません。

  • ノードに接するエッジがその他のエッジと交差する。たとえば、図2-6に示す元のトポロジが、ノードN1のすぐ右上を通る別のエッジE20を含むとします。ノードN1の移動によってエッジE3、E4、E6、E8またはE9がエッジE20と交差する場合、その移動操作は実行されません。

  • 現在隣接していないフェイスにノードが移動される。たとえば、図2-6に示す元のトポロジの外側にノードN1を移動する場合、その移動操作は実行されません。

  • 孤立フェイスの反対側にノードが移動される。この移動では、フェイスの周りのエッジの関係または順序、および各エッジの左右のフェイスのうち、1つ以上のものが変更されるため、この移動は許可されません。図2-7に、許可されないノードの移動(孤立フェイスF1の反対側へのノードN1の反転)を示します。

    図2-7 許可されないノードの移動

    図2-7の説明が続きます
    図2-7「許可されないノードの移動」の説明

2.2.2.1 許可および禁止されたノードの移動の他の例

この項では、許可または禁止されたノードの移動操作の他の例を示します。すべての例で、図2-8に示すトポロジを参照します。

図2-8 ノードの移動例用のトポロジ

図2-8の説明が続きます
図2-8「ノードの移動例用のトポロジ」の説明

次に、図2-8に示すトポロジについて説明します。

  • 点P1、P2、P3およびP4へのノードN1の移動が試行されます。(これらの点は単なる位置であり、既存のノードではありません。)

  • 移動操作の前後のいずれにも、エッジに形状点はありません。

  • 新しい頂点がエッジE1、E2、E3およびE4に指定されますが、エッジの開始点および終了点のID値は同じままです。

図2-8に示すトポロジを使用した、ノードの移動操作の試行とその結果を次に示します。

  • ノードN1の点P1への移動: ノードN1に接する4つのエッジのうち1つ以上がエッジE5と交差するため、許可されません。(移動を実行すると、エッジE3がエッジE5と必ず交差します。)

  • ノードN1の点P2への移動: 許可されます。

  • ノードN1の点P3への移動: 許可されます。ただし、この操作によって孤立ノードN2がフェイスF2からフェイスF1に変更されるため、アプリケーションでノードN1の移動がロールバックされるか、または拒否される場合があります。同様に、ノードの移動によって孤立エッジまたは孤立フェイスが1つのフェイスから別のフェイスに変更される場合、アプリケーションでノードの移動操作がロールバックされるか、または拒否される場合があります。

  • ノードN1の点P4への移動: ノードは元の(現在の)位置と隣接するフェイス内の点に移動する必要があるため、許可されません。

2.2.3 ノードの削除

個々のノード(孤立ノードまたは連結ノード)を削除することができます(この項を参照)。また、トポロジ内のすべての不要ノードも削除することができます(「不要ノードの削除」を参照)。

連結ノードを削除すると、そのノードが削除され、ノードに接していたエッジが1つのエッジにマージされます。(Spatialは、複雑な規則(このマニュアルでは説明していません)を適用して、結果として生成されるエッジのID値および方向を決定します。)

連結ノードまたは孤立ノードを削除するには、SDO_TOPO_MAP.REMOVE_NODEプロシージャを使用します。

図2-9に、エッジE1およびE2に接するノード(N1)の削除を示します。

図2-9 連結ノードの削除

図2-9の説明が続きます
図2-9「連結ノードの削除」の説明

図2-9に示す操作の結果は、次のとおりです。

  • エッジE1が、元のエッジE1およびE2を表していた線セグメントで構成されるように再定義されます。

  • エッジE2が削除されます。

  • 両方の元のエッジに線形フィーチャが定義されていた場合、線形フィーチャは結果として生成されたエッジに自動的に再定義され、トポロジの履歴情報表(「履歴情報表」を参照)に記録が追加されます。たとえば、図2-9の元のエッジE1およびE2に大通りという名前の通りが定義されていた場合、ノードN1の削除後に大通りがエッジE1に定義されます。

次の1つ以上の条件に該当する場合、ノードは削除できません。

  • 点フィーチャがノードに定義されている。たとえば、メトロポリタン美術館という名前の点フィーチャが図2-9のノードN1に定義されていた場合、ノードN1は削除できません。この場合、ノードを削除する前に、ノード上の点フィーチャの定義を削除する必要があります。

  • 元のエッジのいずれかに定義されている線形フィーチャが、両方のエッジに定義されていない。たとえば、大通りという名前の線形フィーチャが、図2-9のエッジE1に定義されていたがエッジE2には定義されていなかった場合、ノードN1は削除できません。

2.2.4 不要ノードの削除

不要ノードとは、2つの個別のエッジのみに接続され、どの点フィーチャにも割り当てられておらず、異なる線形フィーチャ間の境界としても機能しないノードです。不要ノードは、トポロジを作成するためにSDO_TOPO_MAP.ADD_POLYGON_GEOMETRYファンクションを繰り返し使用した場合や、編集操作中にエッジが削除されて不要なノードが残された場合に発生します。そのため、このような場合には、SDO_TOPO_MAP.REMOVE_OBSOLETE_NODESプロシージャを使用して不要ノードを削除することをお薦めします。

Spatialは、<topology-name>_NODE$表と<topology-name>_EDGE$表、および必要に応じて<topology-name>_FACE$表の該当するエントリを自動的に更新します。

図2-10に、単純なトポロジ内の不要ノードの削除を示します。このトポロジでは、ノードN1に美術館という名前の点フィーチャが定義され、ノードN3には市庁舎という名前の点フィーチャが定義されています。エッジE1、E2およびE3には大通りという名前の線形フィーチャが定義され、エッジE4にはファースト・アベニューという名前の線形フィーチャが定義されています。

図2-10 不要ノードの削除

図2-10の説明が続きます
図2-10「不要ノードの削除」の説明

図2-10では、N2のみが不要ノードのすべての条件を満たしているため、このノードのみが削除されます。次に、他のノードについて説明します。

  • N1は1つのエッジ(E1)のみに接続されています。また、このノードには点フィーチャ(美術館)が定義されています。

  • N3には点フィーチャ(市庁舎)が定義されています。

  • N4は、2つの異なる線形フィーチャ(大通りとファースト・アベニュー)間の境界です。

  • N5は、1つのエッジ(E4)にのみ接続されています。

  • ノードN6は、孤立ノード(どのエッジにも接続されていないノード)です。

また、図2-10に示す操作の結果として、ノードN2を削除したためにエッジE2が削除されています。