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に示す操作の結果は、次のとおりです。
-
エッジE1が、元のエッジの開始点とノード(N3)の追加点の間に再定義されます。
-
エッジE2が作成されます。開始点はノードN3の点で、終了点は元のエッジの終了点です。
-
元のエッジに線形フィーチャが定義されていた場合、線形フィーチャは結果として生成された両方のエッジに自動的に再定義され、エッジは分割され、トポロジの履歴情報表(「履歴情報表」を参照)に記録が追加されます。たとえば、図2-3の元のエッジE1に大通りという名前の通りが定義されていた場合、ノードN3の追加後、大通りがエッジE1とE2の両方に定義されます。
図2-4に、より複雑なノードの追加例を示します。この例では、追加されたノードが元のエッジの新しい形状点であるかどうか(つまり、SDO_TOPO_MAP.ADD_NODEファンクションの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-6に、ノードN1を移動した後の元のトポロジの2つの状態を示します。一方では、リシェイプが実行されていません。つまり、移動の影響を受けるすべてのエッジが直線として指定されています。もう一方では、リシェイプが行われています。この場合、影響を受ける1つ以上のエッジが、複数の頂点のある線セグメントとして指定されています。
次に、図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.2.2.1 許可および禁止されたノードの移動の他の例
この項では、許可または禁止されたノードの移動操作の他の例を示します。すべての例で、図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に示す操作の結果は、次のとおりです。
-
エッジE1が、元のエッジE1およびE2を表していた線セグメントで構成されるように再定義されます。
-
エッジE2が削除されます。
-
両方の元のエッジに線形フィーチャが定義されていた場合、線形フィーチャは結果として生成されたエッジに自動的に再定義され、トポロジの履歴情報表(「履歴情報表」を参照)に記録が追加されます。たとえば、図2-9の元のエッジE1およびE2に大通りという名前の通りが定義されていた場合、ノードN1の削除後に大通りがエッジE1に定義されます。
次の1つ以上の条件に該当する場合、ノードは削除できません。
親トピック: ノードでの操作の実行
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では、N2のみが不要ノードのすべての条件を満たしているため、このノードのみが削除されます。次に、他のノードについて説明します。
-
N1は1つのエッジ(E1)のみに接続されています。また、このノードには点フィーチャ(美術館)が定義されています。
-
N3には点フィーチャ(市庁舎)が定義されています。
-
N4は、2つの異なる線形フィーチャ(大通りとファースト・アベニュー)間の境界です。
-
N5は、1つのエッジ(E4)にのみ接続されています。
-
ノードN6は、孤立ノード(どのエッジにも接続されていないノード)です。
また、図2-10に示す操作の結果として、ノードN2を削除したためにエッジE2が削除されています。
親トピック: ノードでの操作の実行