プライマリ・コンテンツに移動
Oracle® Spatial and Graphトポロジ・データ・モデルおよびネットワーク・データ・モデル・グラフ開発者ガイド
12cリリース1 (12.1)
B72471-05
目次へ移動
目次
索引へ移動
索引

前
次

1 トポロジ・データ・モデルの概要

Oracle Spatial and Graphのトポロジ・データ・モデル機能を使用すると、トポロジ内のノード、エッジおよびフェイス関するデータを管理できます。たとえば、米国の国勢調査の地理データは、ノード、チェーンおよびポリゴンで提供されており、このデータは、Spatial and Graphのトポロジ・データ・モデル機能で表現できます。Oracle Spatial and Graphの表およびメタデータ・ビューには、位相要素およびジオメトリ・レイヤーに関する情報を格納できます。その後、その位相要素を参照する特定の空間操作(たとえば、特定のポリゴン・エンティティ(公園など)と空間的に相互作用するチェーン(通りなど)の検索)を実行できます。

この章では、トポロジ・データ・モデル機能をサポートする空間データ構造およびデータ型について説明します。また、この構造の移入および操作の手順も示します。この章に示す情報を利用して、トポロジ・データをSpatial and Graphで使用可能な形式に変換するプログラムを作成できます。

注意:

この章では、Oracle Spatial and Graphに関連するいくつかのトポロジ用語について説明しますが、ユーザーがトポロジの基本的な概念を十分に理解していると想定しています。

また、ユーザーは、『Oracle Spatial and Graph開発者ガイド』に記載されているSpatial and Graphの主な概念、データ型および操作を理解しておく必要があります。

この章には次の項が含まれます。

トポロジ・データを使用するための主な手順

この項では、トポロジ・データを使用するための主な手順の概要を示します。また、重要な概念、構造および操作を示します(詳細は他の項を参照してください)。

具体的な主要手順は、2つある基本的な方法のいずれを採用するかによって異なります。どちらの方法を採用するかは、トポロジの作成に使用するデータの種類によって決定します。

トポロジ・データ・モデルのPL/SQL APIおよびJava APIを使用すると、トポロジを更新(たとえば、エッジ、ノードまたはフェイスに関するデータを変更)できます。ほとんどの編集操作用のPL/SQL APIは、SDO_TOPO_MAPパッケージ(「SDO_TOPO_MAPパッケージ・サブプログラム」を参照)です。Java APIの詳細は、「トポロジ・データ・モデルのJavaインタフェース」を参照してください。

トポロジ・データから作成したトポロジの使用

トポロジ・データから作成したトポロジを使用するための主な手順は次のとおりです。

  1. SDO_TOPO.CREATE_TOPOLOGYプロシージャを使用して、トポロジを作成します。これによって、<topology-name>_EDGE$表、<topology-name>_NODE$表、<topology-name>_FACE$表および<topology-name>_HISTORY$表が作成されます。(これらの表は、それぞれ「エッジ情報表」「ノード情報表」「フェイス情報表」および「履歴情報表」を参照してください。)
  2. 手順1で作成したノード表、エッジ表およびフェイス表にトポロジ・データをロードします。これは、通常、バルク・ロード・ユーティリティを使用して実行しますが、SQLのINSERT文を使用して実行することもできます。
  3. トポロジ内のトポロジ・ジオメトリ・レイヤーのタイプごとに1つのフィーチャ表を作成します。たとえば、都市データ・トポロジには、土地区画、通りおよび道路標識用の個別のフィーチャ表が含まれる場合があります。
  4. 各フィーチャ表に対してSDO_TOPO.ADD_TOPO_GEOMETRY_LAYERプロシージャを使用して、フィーチャ表をトポロジに関連付けます。これによって、<topology-name>_RELATION$表が作成されます。(この表の詳細は、「関係情報表」を参照してください。)
  5. SDO_TOPO.INITIALIZE_METADATAプロシージャを使用して、トポロジ・メタデータを初期化します。(このプロシージャによって、<topology-name>_EDGE$表、<topology-name>_NODE$表および<topology-name>_FACE$表に空間索引が作成され、<topology-name>_EDGE$表および<topology-name>_NODE$表にBツリー索引が追加で作成されます。)
  6. SDO_TOPO_GEOMETRYのコンストラクタを使用して、フィーチャ表をロードします。(このコンストラクタの詳細は、「SDO_TOPO_GEOMETRYのコンストラクタ」を参照してください。)
  7. トポロジ・データを(たとえば、「トポロジ演算子」で説明するトポロジ演算子の1つを使用して)問い合せます。
  8. オプションで、PL/SQL Application Program Interface(API)またはJava APIを使用してトポロジ・データを編集します。

これらの主な手順のPL/SQLでの実行例を、「トポロジ・データから作成したトポロジの使用」に示します。

空間ジオメトリから作成したトポロジの使用

空間ジオメトリからトポロジを作成するには、最初に、Oracle Spatial and Graphで使用できるデータを準備するための一般的な操作を実行する必要があります(『Oracle Spatial and Graph開発者ガイド』を参照)。

  1. 空間表を作成します。

  2. 空間メタデータ(USER_SDO_GEOM_METADATAビュー)を更新します。

  3. データを空間表にロードします。

  4. 空間データを検証します。

  5. 空間索引を作成します。

Oracle Spatial and Graphのジオメトリから作成したトポロジを使用するための主な手順は次のとおりです。

  1. SDO_TOPO.CREATE_TOPOLOGYプロシージャを使用して、トポロジを作成します。これによって、<topology-name>_EDGE$表、<topology-name>_NODE$表、<topology-name>_FACE$表および<topology-name>_HISTORY$表が作成されます。(これらの表は、それぞれ「エッジ情報表」「ノード情報表」「フェイス情報表」および「履歴情報表」を参照してください。)
  2. ユニバース・フェイス(「トポロジ・データ・モデルの概念」で定義されているF0)を作成します。
  3. トポロジ内のトポロジ・ジオメトリ・レイヤーのタイプごとに1つのフィーチャ表を作成します。たとえば、都市データ・トポロジには、土地区画、通りおよび道路標識用の個別のフィーチャ表が含まれる場合があります。
  4. 各フィーチャ表に対してSDO_TOPO.ADD_TOPO_GEOMETRY_LAYERプロシージャを使用して、フィーチャ表をトポロジに関連付けます。これによって、<topology-name>_RELATION$表が作成されます。(この表の詳細は、「関係情報表」を参照してください。)
  5. SDO_TOPO.INITIALIZE_METADATAプロシージャを使用して、トポロジ・メタデータを初期化します。(このプロシージャによって、<topology-name>_EDGE$表、<topology-name>_NODE$表および<topology-name>_FACE$表に空間索引が作成され、<topology-name>_EDGE$表および<topology-name>_NODE$表にBツリー索引が追加で作成されます。)
  6. TopoMapオブジェクトを作成し、トポロジ全体をキャッシュにロードします。
  7. 空間表からデータを挿入し、SDO_TOPO_MAP.CREATE_FEATUREファンクションを使用して、フィーチャ表をロードします。
  8. トポロジ・データを(「トポロジ演算子」で説明するトポロジ演算子の1つを使用して)問い合せます。
  9. オプションで、PL/SQL Application Program Interface(API)またはJava APIを使用してトポロジ・データを編集します。

これらの主な手順のPL/SQLでの実行例を、「空間ジオメトリから作成したトポロジ」に示します。

トポロジ・データ・モデルの概念

トポロジとは、空間内のオブジェクトに関する数学の1つの分野です。位相関係には、包含内部覆う覆われる接触境界が交差する重なりなどがあります。位相関係は、座標空間が(ねじりや伸張などで)変形しても変化しません。(位相的でない関係には、長さ2物間の距離面積などがあります。)

トポロジの基本的な要素は、ノード、エッジおよびフェイスです。

ノードは点で表現され、孤立したものを表すか、またはエッジの境界を示すために使用されます。2つ以上のエッジの連結部は、孤立していないノードです。ノードには、そのノードの空間位置を表す1組の座標値が関連付けられます。ノードとして表現できる地理エンティティには、通りの開始点と終了点、史跡、空港(非常に広域な地図の場合)などがあります。

エッジは、開始ノード(基点)と終了ノード(終点)の2つのノードで定義されます。1つのエッジには、1つのジオメトリ・オブジェクトが関連付けられます。このオブジェクトは、通常、エッジの空間表現を表す一連の座標です。エッジには複数の頂点が含まれる場合があり、それらによって線ストリングが表現されます。(トポロジでは円弧はサポートされていません。)エッジとして表現できる地理エンティティには、通りや川の区画があります。

座標の順序によって、エッジの方向が決まります。方向は、位相関係を判断する際に重要です。正の方向は基礎となるエッジの方向で、負の方向はそれとは逆の方向です。エッジの各方向は、有向エッジと呼ばれます。各有向エッジは、そのエッジの他方の有向エッジのミラー・イメージです。正の有向エッジの開始ノードは、負の有向エッジの終了ノードです。エッジは2つのフェイスの境界でもあります。このエッジは両方のフェイスへの参照を含んでいます。フェイスの連続した周囲の各有向エッジは、それぞれ左側の次のエッジへの参照を含んでいます。ポリゴンに対応しているフェイスは、その外側の境界の有向エッジごとに1つの参照を含んでいます。また、孤立ノードや孤立エッジが存在する場合、フェイスは各孤立要素の境界上の1つの有向エッジへの参照を含んでいます。フェイスとして表現できる地理エンティティには、公園、湖、郡、州などがあります。

図1-1に、ノード、エッジおよびフェイスを含む単純なトポロジを示します。各エッジ上の矢印は、エッジの正の方向(正確には、エッジの正の方向の基準となる線ストリング・ジオメトリまたは曲線ジオメトリの方向)を示しています。

図1-1 単純なトポロジ

図1-1の説明が続きます
図1-1「単純なトポロジ」の説明

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

  • E 要素(E1、E2など)はエッジ、F 要素(F0、F1など)はフェイス、N 要素(N1、N2など)はノードです。

  • F0(フェイス0(ゼロ))は、すべてのトポロジに作成されます。これは、トポロジ内の他のすべてのものを含むユニバース・フェイスです。このユニバース・フェイスには、ジオメトリは関連付けられません。F0のフェイスID値は-1(負の1)です。

  • 各点ジオメトリ、およびエッジの各開始ノードと各終了ノードに対して、1つのノードが作成されます。たとえば、フェイスF1には、E1というエッジ(閉じたエッジ)が1つのみ存在します。このエッジには、開始ノードと終了ノードとして同じノード(N1)が含まれています。F1には、開始ノードN21と終了ノードN22で構成されたエッジE25も含まれています。

  • 孤立ノード(島ノード)は、フェイス内で孤立しているノードです。たとえば、ノードN4はフェイスF2内の孤立ノードです。

  • 孤立エッジ(島エッジ)は、フェイス内で孤立しているエッジです。たとえば、エッジE25はフェイスF1内の孤立エッジです。

  • ループ・エッジは、同じノードを開始ノードと終了ノードとして使用するエッジです。たとえば、エッジE1は、ノードN1から開始してノードN1で終了するループ・エッジです。

  • エッジ上には孤立ノードは含まれません。エッジ上にノードを追加することで、エッジを2つに分割できます。たとえば、ノードN16とN18の間が最初は単一のエッジであった場合、ノードN17を追加したことによってE6とE7の2つのエッジが作成されています。

  • 位相関係に関する情報は、特別なエッジ情報表、フェイス情報表およびノード情報表に格納されます。たとえば、エッジ情報表には、エッジE9およびE10に関する次の情報が格納されます。(各エッジの矢印の方向に注意してください。)次のエッジと前のエッジは、エッジの左と右のフェイスに基づいています。

    エッジE9の場合、開始ノードはN15で、終了ノードはN14です。左の次のエッジはE19、左の前のエッジは-E21、右の次のエッジは-E22、右の前のエッジはE20です。左のフェイスはF3で、右のフェイスはF6です。

    エッジE10の場合、開始ノードはN13で、終了ノードはN14です。左の次のエッジは-E20、左の前のエッジはE18、右の次のエッジはE17、右の前のエッジは-E19です。左のフェイスはF7で、右のフェイスはF4です。

    エッジに関連するデータの、図および説明を含むその他の例については、「エッジ情報表」を参照してください。

図1-2に、図1-1と同じトポロジにグリッドおよびX軸とY軸の目盛りを追加したものを示します。図1-2は、「SDO_TOPOパッケージ・サブプログラム」および「SDO_TOPO_MAPパッケージ・サブプログラム」のいくつかの例の出力を理解するのに役立ちます。

図1-2 グリッド線と目盛りを追加した単純なトポロジ

図1-2の説明が続きます
図1-2「グリッド線と目盛りを追加した単純なトポロジ」の説明

トポロジ・データ・モデルの許容差

許容差は、空間データに精度レベルを関連付けるために使用します。許容差は、(たとえば、丸めの誤差の調整のために、)2つの点が一致しない場合でも、2点が同一の点とみなされる最大距離に影響します。許容差には、0(ゼロ)より大きい正の数字を指定する必要があります。

ただし、トポロジ・データ・モデルの許容差には、実行されている操作によって異なる2つの意味があり、一方の意味は従来のOracle Spatial and Graphの許容差の定義であり、もう一方の意味は固定許容差10E-15です。

  • SDO_TOPO.CREATE_TOPOLOGYプロシージャへのコールに指定される許容差は、従来のOracle Spatial and Graphの定義を参照します(『Oracle Spatial and Graph開発者ガイド』を参照)。この許容差は、索引がノード表、エッジ表およびフェイス表に作成される場合と、これらの表を問い合せるために空間演算子が使用される場合に使用されます。

  • トポロジの編集操作中、内部計算(エッジの交差点の検出など)に使用される許容差は、常に(Java倍精度演算に基づく)10E-15です。この許容差は、SDO_TOPO_MAP.VALIDATE_TOPO_MAPファンクションおよびSDO_TOPO_MAP.VALIDATE_TOPOLOGYファンクションによる妥当性チェックの実行中に使用されます

したがって、たとえば、あるエッジ・ジオメトリがSDO_TOPO_MAP.VALIDATE_TOPO_MAPファンクションまたはSDO_TOPO_MAP.VALIDATE_TOPOLOGYファンクションによって有効とみなされていても、そのエッジ・ジオメトリがSDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXTファンクションに渡されると、有効でない可能性があります。

トポロジ・ジオメトリおよびトポロジ・ジオメトリ・レイヤー

トポロジ ジオメトリ(フィーチャともいう)は、実際のオブジェクトの空間表現です。たとえば、Main Street(大通り)やWalden State Park(ウォールデン州立公園)というトポロジ・ジオメトリが存在する場合があります。ジオメトリは、位相要素(ノード、エッジおよびフェイス)のセットとして格納され、位相要素はプリミティブとも呼ばれます。各トポロジ・ジオメトリには、(レコードのインポートまたはロード時にSpatial and Graphが割り当てた)一意のIDが関連付けられています。

トポロジ・ジオメトリ・レイヤーは、複数のトポロジ・ジオメトリ・タイプの集合で構成することもできますが、一般的には特定のタイプで構成されています(コレクション・レイヤーについては、「コレクション・レイヤー」を参照してください)。たとえば、Main Streetトポロジ・ジオメトリを含むトポロジ・ジオメトリ・レイヤーは、Streets (通り)とすることができます。また、Walden State Parkトポロジ・ジオメトリを含むトポロジ・ジオメトリ・レイヤーは、State Parks (州立公園)とすることができます。各トポロジ・ジオメトリ・レイヤーには、(Spatial and Graphが割り当てた)一意のIDが関連付けられています。各トポロジ・ジオメトリ・レイヤーのデータは、フィーチャ表に格納されます。たとえば、CITY_STREETSというフィーチャ表には、Streetsトポロジ・ジオメトリ・レイヤー内のすべてのトポロジ・ジオメトリ(個々の道路および通り)に関する情報が含まれています。

各トポロジ・ジオメトリ(フィーチャ)は、SDO_TOPO_GEOMETRY型のオブジェクト(「SDO_TOPO_GEOMETRY型」を参照)として定義します。このオブジェクトでは、トポロジのトポロジ・ジオメトリ・タイプ、トポロジ・ジオメトリID、トポロジ・ジオメトリ・レイヤーIDおよびトポロジIDを定義します。

トポロジ・メタデータは、Spatial and Graphによって自動的にUSER_SDO_TOPO_METADATAビューおよびALL_SDO_TOPO_METADATAビュー(「xxx_SDO_TOPO_METADATAビュー」を参照)に保持されます。USER_SDO_TOPO_INFOビューおよびALL_SDO_TOPO_INFOビュー(「xxx_SDO_TOPO_INFOビュー」を参照)には、このトポロジ・メタデータのサブセットが含まれます。

フィーチャ

多くの場合、トポロジ内にはフィーチャより多くの位相要素(ノード、エッジおよびフェイス)が含まれます。たとえば、1つの道路フィーチャが多くのエッジで構成されたり、公園などの1つの領域フィーチャが多くのフェイスで構成される場合があります。また、点フィーチャにノードが関連付けられない場合もあります。図1-3に、「トポロジ・データ・モデルの概念」図1-1に示したトポロジに関連付けられた点フィーチャ、線フィーチャおよび領域フィーチャを示します。

図1-3 トポロジ内のフィーチャ

図1-3の説明が続きます
図1-3「トポロジ内のフィーチャ」の説明

図1-3に示すトポロジ内のフィーチャの種類は次のとおりです。

  • 点フィーチャ(道路標識): 黒い丸S1S2S3およびS4として示しています。

  • 線フィーチャ(道路または通り): 破線R1R2R3およびR4として示しています。

  • 領域フィーチャ(土地区画): 矩形P1P2P3P4およびP5として示しています。

    土地区画P5の領域には、グレーの領域は含まれません。(つまり、P5はフェイスF1を含みますが、フェイスF9は含みません。これらのフェイスは、「トポロジ・データ・モデルの概念」図1-1で示しています。)

「トポロジ・データから作成したトポロジ」例1-12では、これらのフィーチャを定義します。

コレクション・レイヤー

コレクション・レイヤーは、異なるトポロジ・ジオメトリ・タイプの位相要素を含めることのできるトポロジ・ジオメトリ・レイヤーです。たとえば、「トポロジの例(PL/SQL)」の例のCITY_DATAトポロジを使用すると、特定の土地区画、通りおよび道路標識の要素を含むコレクション・レイヤーを作成できます。

コレクション・レイヤーを作成するには、基本的に他のタイプのレイヤーを作成するのと同じ手順を実行します。次の例のように、レイヤーのフィーチャ表を作成します。

CREATE TABLE collected_features ( -- Selected heterogeneous features
  feature_name VARCHAR2(30) PRIMARY KEY,
  feature SDO_TOPO_GEOMETRY);

次の例のように、SDO_TOPO.ADD_TOPO_GEOMETRY_LAYERプロシージャのコール時に、topo_geometry_layer_typeパラメータにCOLLECTIONを指定して、フィーチャ表をトポロジに関連付けます。

EXECUTE SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('CITY_DATA', COLLECTED_FEATURES', 'FEATURE', 'COLLECTION');

コレクション・レイヤーのフィーチャ表をロードするには、例1-1に示すように、必要な行を挿入します。

例1-1 コレクション・レイヤーのフィーチャ表のロード

-- Take R5 from the CITY_STREETS layer.
INSERT INTO collected_features VALUES(
  'C_R5',
  SDO_TOPO_GEOMETRY('CITY_DATA',
    2,  -- tg_type = line/multiline
    4,  -- tg_layer_id
    SDO_TOPO_OBJECT_ARRAY(
      SDO_TOPO_OBJECT(20, 2),
      SDO_TOPO_OBJECT(-9, 2)))
);
 
-- Take S3 from the TRAFFIC_SIGNS layer.
INSERT INTO collected_features VALUES(
  'C_S3',
  SDO_TOPO_GEOMETRY('CITY_DATA',
    1,  -- tg_type = point/multipoint 
    4,  -- topo layer id
    SDO_TOPO_OBJECT_ARRAY(
       SDO_TOPO_OBJECT(6, 1)))
);
 
-- Take P3 from the LAND_PARCELS layer.
INSERT INTO collected_features VALUES(
  'C_P3',
  SDO_TOPO_GEOMETRY('CITY_DATA',
    3,  -- tg_type = (multi)polygon
    4,
    SDO_TOPO_OBJECT_ARRAY(
      SDO_TOPO_OBJECT(5, 3),
      SDO_TOPO_OBJECT(8, 3)))
);
 
-- Create a collection from a polygon and a point.
INSERT INTO collected_features VALUES(
  'C1',
  SDO_TOPO_GEOMETRY('CITY_DATA',
    4,  -- tg_type = collection
    4,
    SDO_TOPO_OBJECT_ARRAY(
      SDO_TOPO_OBJECT(5, 3),
      SDO_TOPO_OBJECT(6, 1)))
);
 
-- Create a collection from a polygon and a line.
INSERT INTO collected_features VALUES(
  'C2',
  SDO_TOPO_GEOMETRY('CITY_DATA',
    4,  -- tg_type = collection
    4,
    SDO_TOPO_OBJECT_ARRAY(
      SDO_TOPO_OBJECT(8, 3),
      SDO_TOPO_OBJECT(10, 2)))
);
                  
-- Create a collection from a line and a point.
INSERT INTO collected_features VALUES(
  'C3',
  SDO_TOPO_GEOMETRY('CITY_DATA',
     4,  -- tg_type = collection
     4,
     SDO_TOPO_OBJECT_ARRAY(
       SDO_TOPO_OBJECT(-5, 2),
       SDO_TOPO_OBJECT(10, 1)))
);

トポロジ・ジオメトリ・レイヤー階層

一部のトポロジには、トポロジ・ジオメトリ・レイヤー(フィーチャ・レイヤー)が1つ以上の親子関係を持つトポロジ階層が含まれます。つまり、最上位レベルのレイヤーは階層の1つ下のレベルの子レイヤーのフィーチャで構成され、その子レイヤーはさらに1つ下のレベルの子レイヤーのフィーチャで構成されます(以降のレイヤーも同様です)。たとえば、土地利用トポロジには、次のトポロジ・ジオメトリ・レイヤーが階層の個別のレベルとして含まれる場合があります。

  • 最上位レベルは州です。このレベルは、その子レイヤーである郡のフィーチャで構成されます。

  • 州の1つ下のレベルは郡です。このレベルは、その子レイヤーである地域のフィーチャで構成されます。

  • 郡の1つ下のレベルは地域です。このレベルは、その子レイヤーである区域のフィーチャで構成されます。

  • 地域の1つ下のレベルは区域です。このレベルは、その子レイヤーである土地区画のフィーチャで構成されます。

  • 土地区画は、階層の最下位レベルです。

トポロジ内のトポロジ・ジオメトリ・レイヤーがこの階層関係を持つ場合、すべてのトポロジ・ジオメトリ・レイヤーを単一レベルで(階層を使用せずに)指定するより、それらのレイヤーを階層としてモデル化する方が大幅に効率的です。たとえば、郡のSDO_TOPO_GEOMETRYオブジェクトを構成する場合、郡内のすべての地域のすべての区域のすべての土地区画を指定するよりも、郡内の地域のみを指定する方がより効率的です。

階層内の最も低いレベル(最も小さい種類のフィーチャを含むトポロジ・ジオメトリ・レイヤー)はレベル0 (ゼロ)で、これより高いレベルは順にレベル1、レベル2のように番号が付けられます。階層内で隣接するレベルのトポロジ・ジオメトリ・レイヤーには、親子関係があります。上位レベルの各トポロジ・ジオメトリ・レイヤーは、1つ下のレベルのレイヤーに対する親レイヤーになります。1つ下のレベルのレイヤーは、上位レベルのレイヤーの子レイヤーになります。親レイヤーは子レイヤーを1つのみ持つことができますが、子レイヤーは1つ以上の親レイヤーを持つことができます。前述の例では、郡レイヤーは子レイヤーとして地域のみを持つことができますが、地域レイヤーは親レイヤーとして郡および水道地域を持つことができます。

注意:

トポロジ・ジオメトリ・レイヤーの階層は、「ネットワークの階層」に示すネットワーク階層に類似しています。ただし、これらの階層には大きな違いがあるため、混同しないように注意してください。たとえば、トポロジ・ジオメトリ・レイヤー階層の最下位レベルは0 (ゼロ)ですが、ネットワーク階層の最下位レベルは1です。また、トポロジ・ジオメトリ・レイヤー階層内の1つの親が持つ子は常に1つで、1つの子は複数の親を持つことができますが、ネットワーク階層では、1つの親は複数の子を持つことができ、1つの子が持つ親は常に1つです。

図1-4に、前述の例のトポロジ・ジオメトリ・レイヤー階層を示します。階層の各レベルには、レベル番号と、そのレベルのトポロジ・ジオメトリ・レイヤーを示しています。

図1-4 トポロジ・ジオメトリ・レイヤー階層

図1-4の説明が続きます
図1-4「トポロジ・ジオメトリ・レイヤー階層」の説明

例1-2 トポロジ・ジオメトリ・レイヤー階層のモデル化

トポロジ・ジオメトリ・レイヤーを階層としてモデル化するには、SDO_TOPO.ADD_TOPO_GEOMETRY_LAYERプロシージャをコールして、親トポロジ・ジオメトリ・レイヤーをトポロジに追加するときに、child_layer_idパラメータに子レイヤーを指定します。最初に最下位レベル(レベル0 (ゼロ))のトポロジ・ジオメトリ・レイヤーを追加し、次にレベル1のレイヤーを追加してレベル0のレイヤーをその子として指定します。次に、レベル2のレイヤーを追加してレベル1のレイヤーをその子として指定します。他のレイヤーも同様に指定します。例1-2に、5つのトポロジ・ジオメトリ・レイヤーを追加して、5レベルの階層を作成する例を示します。

-- Create the topology. (Null SRID in this example.)
EXECUTE SDO_TOPO.CREATE_TOPOLOGY('LAND_USE_HIER', 0.00005);
 
-- Create feature tables.
CREATE TABLE land_parcels ( -- Land parcels (selected faces)
  feature_name VARCHAR2(30) PRIMARY KEY,
  feature SDO_TOPO_GEOMETRY);
 
CREATE TABLE block_groups (
  feature_name VARCHAR2(30) PRIMARY KEY,
  feature SDO_TOPO_GEOMETRY);
 
CREATE TABLE tracts (
  feature_name VARCHAR2(30) PRIMARY KEY,
  feature SDO_TOPO_GEOMETRY);
 
CREATE TABLE counties (
  feature_name VARCHAR2(30) PRIMARY KEY,
  feature SDO_TOPO_GEOMETRY);
 
CREATE TABLE states (
  feature_name VARCHAR2(30) PRIMARY KEY,
  feature SDO_TOPO_GEOMETRY);
 
-- (Other steps not shown here, such as populating the feature tables
-- and initializing the metadata.)
. . .
-- Associate feature tables with the topology; include hierarchy information.

DECLARE
  land_parcels_id NUMBER;
  block_groups_id NUMBER;
  tracts_id NUMBER;
  counties_id NUMBER;
BEGIN
SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('LAND_USE_HIER', 'LAND_PARCELS',
  'FEATURE','POLYGON');
SELECT tg_layer_id INTO land_parcels_id FROM user_sdo_topo_info 
  WHERE topology = 'LAND_USE_HIER' AND table_name = 'LAND_PARCELS';
SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('LAND_USE_HIER', 'BLOCK_GROUPS',
  'FEATURE','POLYGON', NULL, land_parcels_id);
SELECT tg_layer_id INTO block_groups_id FROM user_sdo_topo_info 
  WHERE topology = 'LAND_USE_HIER' AND table_name = 'BLOCK_GROUPS';
SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('LAND_USE_HIER', 'TRACTS',
  'FEATURE','POLYGON', NULL, block_groups_id);
SELECT tg_layer_id INTO tracts_id FROM user_sdo_topo_info 
  WHERE topology = 'LAND_USE_HIER' AND table_name = 'TRACTS';
SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('LAND_USE_HIER', 'COUNTIES',
  'FEATURE','POLYGON', NULL, tracts_id);
SELECT tg_layer_id INTO counties_id FROM user_sdo_topo_info 
  WHERE topology = 'LAND_USE_HIER' AND table_name = 'COUNTIES';
SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('LAND_USE_HIER', 'STATES',
  'FEATURE','POLYGON', NULL, counties_id);
END;/
 

レベル0(ゼロ)より上の各レベル内では、各レイヤーに、(例1-2で作成したような)1つ下のレベルのフィーチャから作成されたフィーチャ、位相要素(フェイス、ノードおよびエッジ)から作成されたフィーチャまたはこれらの組合せを含めることができます。たとえば、地域レイヤーには、区域から作成した地域またはフェイスから作成した地域、あるいはその両方を含めることができます。ただし、レイヤー内の各フィーチャは、1つ下のレベルのフィーチャまたは位相要素のいずれかのみから作成されている必要があります。たとえば、特定の地域を区域から構成することもフェイスから構成することもできますが、区域とフェイスを組み合せて構成することはできません。

階層内のレベルのフィーチャ表に対してトポロジ・ジオメトリ・オブジェクトの挿入または更新を行うには、SDO_TOPO_GEOMETRYコンストラクタの適切な形式を使用します。フィーチャ表については、「トポロジ・ジオメトリおよびトポロジ・ジオメトリ・レイヤー」を参照してください。SDO_TOPO_GEOMETRYのコンストラクタについては、「SDO_TOPO_GEOMETRYのコンストラクタ」を参照してください。

関係情報表内のTOPO_ID属性およびTOPO_TYPE属性は、トポロジ・ジオメトリ・レイヤー階層を持つトポロジ内の親レイヤーの場合は特別な意味を持つことに注意してください。「関係情報表」表1-5のこれらの属性の説明を参照してください。

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

Spatial and Graphのトポロジ機能を使用するには、最初に特別なエッジ表、ノード表およびフェイス表にデータを挿入する必要があり、これらの表は、トポロジの作成時にSpatial and Graphによって作成されます。エッジ表、ノード表およびフェイス表については、それぞれ「エッジ情報表」「ノード情報表」および「フェイス情報表」を参照してください。

Spatial and Graphは、各トポロジの関係情報(<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 and Graphによって割り当てられる一意の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 and Graphメタデータ・ビューに格納されている列名に適用されます。たとえば、これらの注意事項は、エッジ表、ノード表、フェイス表、関係情報表および履歴情報表の名前に適用されます。また、これらの表内の任意の列の名前や、「トポロジ・メタデータ・ビュー」で説明するトポロジ・メタデータ・ビューに格納されるこれらの表のスキーマにも適用されます。

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

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

エッジ情報表

トポロジ内のエッジに関する情報は、<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に関連付けられたエッジ表の行に表示されません。

ノード情報表

トポロジ内のノードに関する情報は、<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である場合、ノードは孤立ノードではなく、エッジの開始ノードまたは終了ノードです。

フェイス情報表

トポロジ内のフェイスに関する情報は、<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プロシージャによって、この列に空間索引が作成されます。

関係情報表

位相要素を処理すると、各オブジェクトの情報が、Spatial and Graphによって自動的に<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つ以上のフィーチャ表が関連付けられ、さらに次の条件のいずれかに該当する場合のみです。

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

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

これらの操作の情報は、Spatial and Graphによって自動的に<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.

トポロジ・データ型

トポロジ・データ・モデルに関連付けられる主なデータ型は、トポロジ・ジオメトリを表すSDO_TOPO_GEOMETRYです。SDO_TOPO_GEOMETRY型には、複数のコンストラクタとメンバー・ファンクションが含まれます。この項では、トポロジ・モデルの型、コンストラクタおよびメンバー・ファンクションについて説明します。

SDO_TOPO_GEOMETRY型

トポロジ・ジオメトリの記述は、ユーザーが定義した表のSDO_TOPO_GEOMETRYオブジェクト型の1列に、1行で格納されます。SDO_TOPO_GEOMETRYオブジェクト型の定義は次のとおりです。

CREATE TYPE sdo_topo_geometry AS OBJECT
  (tg_type      NUMBER,
   tg_id        NUMBER,
   tg_layer_id  NUMBER,
   topology_id  NUMBER);

SDO_TOPO_GEOMETRY型には、表1-7に示す属性が含まれます。

表1-7 SDO_TOPO_GEOMETRY型の属性

属性 説明

TG_TYPE

トポロジ・ジオメトリのタイプです。1は点または複数の点、2は線ストリングまたは複数の線で構成されるストリング、3はポリゴンまたは複数のポリゴン、4は異種の集合です。

TG_ID

トポロジ・ジオメトリの一意のID番号(Spatial and Graphが生成)です。

TG_LAYER_ID

トポロジ・ジオメトリが属するトポロジ・ジオメトリ・レイヤーのID番号です。(この番号は、Spatial and Graphが生成し、トポロジ・ジオメトリ・レイヤー内で一意です。)

TOPOLOGY_ID

トポロジの一意のID番号(Spatial and Graphが生成)です。

トポロジ内の各トポロジ・ジオメトリは、TG_ID値とTG_LAYER_ID値の組合せによって一意に識別されます。

属性名は、SDO_TOPO_GEOMETRY型のオブジェクトに対する問合せ内で使用できます。例1-3に、「トポロジの例(PL/SQL)」例1-12で定義するCITY_STREETS表のFEATURE列の各属性を問い合せるSELECT文を示します。

例1-3 問合せ内でのSDO_TOPO_GEOMETRY属性の使用

SELECT s.feature.tg_type FROM city_streets s;
SELECT s.feature.tg_id FROM city_streets s;
SELECT s.feature.tg_layer_id FROM city_streets s;
SELECT s.feature.topology_id FROM city_streets s;

SDO_TOPO_GEOMETRYのコンストラクタ

SDO_TOPO_GEOMETRY型には、トポロジ・ジオメトリ・オブジェクトの挿入および更新のためのコンストラクタが存在します。このコンストラクタは、使用するオブジェクトの種類に応じて、次の2つのタイプに分類されます。

  • 最下位レベルの位相要素(ノード、エッジおよびフェイス)を指定するコンストラクタ。これらのコンストラクタには、SDO_TOPO_OBJECT_ARRAY型の属性を1つ以上含め、SDO_TGL_OBJECT_ARRAY型の属性を含めません。

  • 子レベルの要素を指定するコンストラクタ。これらのコンストラクタには、SDO_TGL_OBJECT_ARRAY型の属性を1つ以上含め、SDO_TOPO_OBJECT_ARRAY型の属性を含めません。

対象のトポロジにトポロジ・ジオメトリ・レイヤー階層が含まれない場合、または実行する操作が階層内の最下位レベル(レベル0(ゼロ))に影響を及ぼす場合、トポロジ・ジオメトリ・オブジェクトを挿入および更新するには、最下位レベルの位相要素(ノード、エッジおよびフェイス)を指定するコンストラクタを使用する必要があります。(トポロジ・ジオメトリ・レイヤー階層については、「トポロジ・ジオメトリ・レイヤー階層」を参照してください。)

対象のトポロジにトポロジ・ジオメトリ・レイヤー階層が含まれ、実行する操作が階層内の最下位レベル以外のレベルに影響を及ぼす場合、トポロジ・ジオメトリ・オブジェクトを挿入および更新するには、2つのタイプのコンストラクタのいずれかまたは両方を使用できます。つまり、挿入または更新されるトポロジ・ジオメトリ・オブジェクトごとに、次のいずれかを使用できます。

  • (たとえば、フェイスから地域を作成するために)最下位レベルの位相要素で構成されているトポロジ・ジオメトリ・オブジェクトを挿入および更新するには、少なくとも1つのSDO_TOPO_OBJECT_ARRAY型の属性を含み、SDO_TGL_OBJECT_ARRAY型の属性を含まない形式を使用します。

  • (たとえば、区域から地域を作成するために)1つ下のレベルのフィーチャで構成されているトポロジ・ジオメトリ・オブジェクトを挿入および更新するには、少なくとも1つのSDO_TGL_OBJECT_ARRAY型の属性を含み、SDO_TOPO_OBJECT_ARRAY型の属性を含まない形式を使用します。

この項では、使用可能なSDO_TOPO_GEOMETRYのコンストラクタについて説明します。

注意:

型定義(tg_type、tg_id、tg_layer_id、topology_id)と同じ属性を使用する追加のSDO_TOPO_GEOMETRYコンストラクタは、Oracle内部のみで使用します。

挿入操作用のコンストラクタ: 位相要素の指定

SDO_TOPO_GEOMETRY型の次のコンストラクタは、位相要素(フェイス、ノードまたはエッジ)を指定する挿入操作に使用します。トポロジにトポロジ・ジオメトリ・レイヤー階層が含まれない場合、または実行する操作が階層内の最下位レベル(レベル0 (ゼロ))に影響を及ぼす場合は、これらの形式の1つを使用して、新しいトポロジ・ジオメトリ・オブジェクトを作成する必要があります。また、実行する操作が階層内のレベル0 (ゼロ)より高いレベルに影響を及ぼす場合は、これらの形式の1つを使用して新しいトポロジ・ジオメトリ・オブジェクトを作成できます。

SDO_TOPO_GEOMETRY (topology     VARCHAR2,
                   tg_type      NUMBER,
                   tg_layer_id  NUMBER,
                   topo_ids     SDO_TOPO_OBJECT_ARRAY)

SDO_TOPO_GEOMETRY (topology      VARCHAR2,
                   table_name    VARCHAR2,
                   column_name   VARCHAR2,
                   tg_type       NUMBER,
                   topo_ids      SDO_TOPO_OBJECT_ARRAY)

SDO_TOPO_OBJECT_ARRAY型は、SDO_TOPO_OBJECTオブジェクトのVARRAYとして定義されています。

SDO_TOPO_OBJECT型には、次の2つの属性が含まれます。

(topo_id NUMBER, topo_type NUMBER)

TG_TYPE属性値およびTOPO_IDS属性値は、指定したトポロジの<topology-name>_RELATION$表(「関係情報表」を参照)の値の範囲内である必要があります。

例1-4に、SDO_TOPO_GEOMETRYの2つの形式のコンストラクタの例を示します。各コンストラクタは、「トポロジの例(PL/SQL)」例1-12で定義するLAND_PARCELS表にトポロジ・ジオメトリを挿入します。

例1-4 SDO_TOPO_OBJECT_ARRAYを含むコンストラクタを使用した挿入

INSERT INTO land_parcels VALUES ('P1', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    3, -- Topology geometry type (polygon/multipolygon)
    1, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (3, 3), -- face_id = 3
      SDO_TOPO_OBJECT (6, 3))) -- face_id = 6
);

INSERT INTO land_parcels VALUES ('P1A', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    'LAND_PARCELS', -- Table name
    'FEATURE', -- Column name
    3, -- Topology geometry type (polygon/multipolygon)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (3, 3), -- face_id = 3
      SDO_TOPO_OBJECT (6, 3))) -- face_id = 6
);

挿入操作用のコンストラクタ: 下位レベルのフィーチャの指定

SDO_TOPO_GEOMETRY型の次のコンストラクタは、階層の1つ下のレベルのフィーチャを指定する挿入操作に使用します。実行する操作が階層内のレベル0(ゼロ)より高いレベルに影響を及ぼす場合は、これらの形式の1つを使用して、新しいトポロジ・ジオメトリ・オブジェクトを作成できます。

SDO_TOPO_GEOMETRY (topology     VARCHAR2,
                   tg_type      NUMBER,
                   tg_layer_id  NUMBER,
                   topo_ids     SDO_TGL_OBJECT_ARRAY)

SDO_TOPO_GEOMETRY (topology      VARCHAR2,
                   table_name    VARCHAR2,
                   column_name   VARCHAR2,
                   tg_type       NUMBER,
                   topo_ids      SDO_TGL_OBJECT_ARRAY)

SDO_TGL_OBJECT_ARRAY型は、SDO_TGL_OBJECTオブジェクトのVARRAYとして定義されています。

SDO_TGL_OBJECT型には、次の2つの属性が含まれます。

(tgl_id NUMBER, tg_id NUMBER)

例1-5に、トポロジ・ジオメトリ・レイヤー階層内の区域レベルのフィーチャ表であるBLOCK_GROUPS表に行を挿入するSDO_TOPO_GEOMETRYのコンストラクタを示します。区域レベルは、階層の最下位レベルである土地区画レベルの親レベルです。

例1-5 SDO_TGL_OBJECT_ARRAYを含むコンストラクタを使用した挿入

INSERT INTO block_groups VALUES ('BG1', -- Feature name
  SDO_TOPO_GEOMETRY('LAND_USE_HIER',
    3, -- Topology geometry type (polygon/multipolygon)
    2, -- TG_LAYER_ID for block groups (from ALL_SDO_TOPO_METADATA)
    SDO_TGL_OBJECT_ARRAY (
      SDO_TGL_OBJECT (1, 1), -- land parcel ID = 1
      SDO_TGL_OBJECT (1, 2))) -- land parcel ID = 2
);

更新操作用のコンストラクタ: 位相要素の指定

SDO_TOPO_GEOMETRY型の次のコンストラクタは、位相要素(フェイス、ノードまたはエッジ)を指定する更新操作に使用します。トポロジにトポロジ・ジオメトリ・レイヤー階層が含まれない場合、または実行する操作が階層内の最下位レベル(レベル0 (ゼロ))に影響を及ぼす場合は、これらの形式の1つを使用して、トポロジ・ジオメトリ・オブジェクトを更新する必要があります。また、実行する操作が階層内のレベル0 (ゼロ)より高いレベルに影響を及ぼす場合は、これらの形式の1つを使用してトポロジ・ジオメトリ・オブジェクトを更新できます。

SDO_TOPO_GEOMETRY (topology         VARCHAR2,
                   tg_type          NUMBER,
                   tg_layer_id      NUMBER,
                   add_topo_ids     SDO_TOPO_OBJECT_ARRAY,
                   delete_topo_ids  SDO_TOPO_OBJECT_ARRAY)

SDO_TOPO_GEOMETRY (topology         VARCHAR2,
                   table_name       VARCHAR2,
                   column_name      VARCHAR2,
                   tg_type          NUMBER,
                   add_topo_ids     SDO_TOPO_OBJECT_ARRAY,
                   delete_topo_ids  SDO_TOPO_OBJECT_ARRAY)

たとえば、これらのコンストラクタ形式の1つを使用して、線形フィーチャにエッジを追加したり、不要になったエッジをフィーチャから削除することができます。

SDO_TOPO_OBJECT_ARRAY型の定義、およびTG_TYPE属性値とTOPO_IDS属性値の要件の詳細は、「挿入操作用のコンストラクタ: 位相要素の指定」を参照してください。

ADD_TOPO_IDS属性とDELETE_TOPO_IDS属性の両方に値を指定するか、または一方の属性に値を指定して他方の属性にNULLを指定できます。ただし、ADD_TOPO_IDSとDELETE_TOPO_IDSの両方にNULL値を指定することはできません。

例1-6に、SDO_TOPO_GEOMETRYの2つの形式のコンストラクタの例を示します。各コンストラクタは、「トポロジの例(PL/SQL)」例1-12で定義するLAND_PARCELS表のCITY_DATAトポロジから2つのフェイスを削除します。

例1-6 SDO_TOPO_OBJECT_ARRAYを含むコンストラクタを使用した更新

UPDATE land_parcels l SET l.feature = SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    3, -- Topology geometry type (polygon/multipolygon)
    1, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    NULL, -- No topological elements to be added
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (3, 3), -- face_id = 3
      SDO_TOPO_OBJECT (6, 3))) -- face_id = 6
WHERE l.feature_name = 'P1';
 
UPDATE land_parcels l SET l.feature = SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    'LAND_PARCELS', -- Table name
    'FEATURE', -- Column name
    3, -- Topology geometry type (polygon/multipolygon)
    NULL, -- No topological elements to be added
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (3, 3), -- face_id = 3
      SDO_TOPO_OBJECT (6, 3))) -- face_id = 6
WHERE l.feature_name = 'P1A';

更新操作用のコンストラクタ: 下位レベルのフィーチャの指定

SDO_TOPO_GEOMETRY型の次のコンストラクタは、階層の1つ下のレベルのフィーチャを指定する更新操作に使用します。実行する操作が階層内のレベル0(ゼロ)より高いレベルに影響を及ぼす場合は、これらの形式の1つを使用して、トポロジ・ジオメトリ・オブジェクトを更新できます。

SDO_TOPO_GEOMETRY (topology         VARCHAR2,
                   tg_type          NUMBER,
                   tg_layer_id      NUMBER,
                   add_topo_ids     SDO_TGL_OBJECT_ARRAY,
                   delete_topo_ids  SDO_TGL_OBJECT_ARRAY)

SDO_TOPO_GEOMETRY (topology         VARCHAR2,
                   table_name       VARCHAR2,
                   column_name      VARCHAR2,
                   tg_type          NUMBER,
                   add_topo_ids     SDO_TGL_OBJECT_ARRAY,
                   delete_topo_ids  SDO_TGL_OBJECT_ARRAY)

たとえば、これらのコンストラクタ形式の1つを使用して、線形フィーチャにエッジを追加したり、不要になったエッジをフィーチャから削除することができます。

SDO_TGL_OBJECT_ARRAY型の定義、およびその属性値の要件の詳細は、「挿入操作用のコンストラクタ: 下位レベルのフィーチャの指定」を参照してください。

ADD_TOPO_IDS属性とDELETE_TOPO_IDS属性の両方に値を指定するか、または一方の属性に値を指定して他方の属性にNULLを指定できます。ただし、ADD_TOPO_IDSとDELETE_TOPO_IDSの両方にNULL値を指定することはできません。

例1-7に、SDO_TOPO_GEOMETRYの2つの形式のコンストラクタの例を示します。各コンストラクタは、トポロジ・ジオメトリ・レイヤー階層内の区域レベルのフィーチャ表であるBLOCK_GROUPS表内のCITY_DATAトポロジの(同じ定義を持つが、第1の形式ではBG1および第2の形式ではBG1Aという名前の付いた)フィーチャから、ID値が2である土地区域を削除します。区域レベルは、階層の最下位レベルである土地区画レベルの親レベルです。

例1-7 SDO_TGL_OBJECT_ARRAYを含むコンストラクタを使用した更新

UPDATE block_groups b SET b.feature = SDO_TOPO_GEOMETRY(
  'LAND_USE_HIER',
  3, -- Topology geometry type (polygon/multipolygon)
  2, -- TG_LAYER_ID for block groups (from ALL_SDO_TOPO_METADATA)
  null, -- No IDs to add
  SDO_TGL_OBJECT_ARRAY (
    SDO_TGL_OBJECT (1, 2)) -- land parcel ID = 2
  )
WHERE b.feature_name = 'BG1';
 
UPDATE block_groups b SET b.feature = SDO_TOPO_GEOMETRY(
  'LAND_USE_HIER',
  'BLOCK_GROUPS', -- Feature table
  'FEATURE', -- Feature column
  3, -- Topology geometry type (polygon/multipolygon)
  null, -- No IDs to add
  SDO_TGL_OBJECT_ARRAY (
    SDO_TGL_OBJECT (1, 2)) -- land parcel ID = 2
  )
WHERE b.feature_name = 'BG1A';

GET_GEOMETRYメンバー・ファンクション

SDO_TOPO_GEOMETRY型には、GET_GEOMETRYという1つのメンバー・ファンクションが含まれます。このファンクションを使用して、トポロジ・ジオメトリ・オブジェクトのSDO_GEOMETRYオブジェクトを戻すことができます。

例1-8では、GET_GEOMETRYメンバー・ファンクションを使用して、P1という土地区画に関連付けられたトポロジ・ジオメトリ・オブジェクトのSDO_GEOMETRYオブジェクトを戻します。

例1-8 GET_GEOMETRYメンバー・ファンクション

SELECT l.feature_name, l.feature.get_geometry()
  FROM land_parcels l WHERE l.feature_name = 'P1';
 
FEATURE_NAME                                                                    
------------------------------                                                  
L.FEATURE.GET_GEOMETRY()(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO,
--------------------------------------------------------------------------------
P1                                                                              
SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 3, 1), SDO_ORDINATE_ARRAY(
21, 14, 21, 22, 9, 22, 9, 14, 9, 6, 21, 6, 21, 14)) 

GET_TGL_OBJECTSメンバー・ファンクション

SDO_TOPO_GEOMETRY型には、GET_TGL_OBJECTSというメンバー・ファンクションが含まれます。このファンクションを使用して、トポロジ・ジオメトリ・レイヤー階層を含むトポロジで階層レベルが0 (ゼロ)より上のジオメトリ・レイヤー内のトポロジ・ジオメトリ・オブジェクトのSDO_TOPO_OBJECT_ARRAYオブジェクトを戻すことができます。(レイヤーの階層レベルが0 (ゼロ)の場合またはトポロジにトポロジ・ジオメトリ・レイヤー階層が含まれていない場合は、このメソッドはNULL値を戻します。)

SDO_TGL_OBJECT_ARRAY型の詳細は、「挿入操作用のコンストラクタ: 下位レベルのフィーチャの指定」を参照してください。

例1-9では、GET_TGL_OBJECTSメンバー・ファンクションを使用して、BG2という名前の区域に関連付けられているトポロジ・ジオメトリ・オブジェクトのSDO_TOPO_OBJECT_ARRAYオブジェクトを戻します。

例1-9 GET_TGL_OBJECTSメンバー・ファンクション

SELECT bg.feature_name, bg.feature.get_tgl_objects()
  FROM block_groups bg WHERE bg.feature_name = 'BG2';
 
FEATURE_NAME                                                                    
------------------------------                                                  
BG.FEATURE.GET_TGL_OBJECTS()(TGL_ID, TG_ID)                                     
--------------------------------------------------------------------------------
BG2                                                                             
SDO_TGL_OBJECT_ARRAY(SDO_TGL_OBJECT(1, 3), SDO_TGL_OBJECT(1, 4))

GET_TOPO_ELEMENTSメンバー・ファンクション

SDO_TOPO_GEOMETRY型には、GET_TOPO_ELEMENTSという1つのメンバー・ファンクションが含まれます。このファンクションを使用して、トポロジ・ジオメトリ・オブジェクトのSDO_TOPO_OBJECT_ARRAYオブジェクトを戻すことができます。

SDO_TOPO_OBJECT_ARRAY型の詳細は、「挿入操作用のコンストラクタ: 位相要素の指定」を参照してください。

例1-8では、GET_TOPO_ELEMENTSメンバー・ファンクションを使用して、P1という土地区画に関連付けられたトポロジ・ジオメトリ・オブジェクトのSDO_TOPO_OBJECT_ARRAYオブジェクトを戻します。

例1-10 GET_TOPO_ELEMENTSメンバー・ファンクション

SELECT l.feature_name, l.feature.get_topo_elements()
  FROM land_parcels l WHERE l.feature_name = 'P1';
 
FEATURE_NAME                                                                    
------------------------------                                                  
L.FEATURE.GET_TOPO_ELEMENTS()(TOPO_ID, TOPO_TYPE)                               
--------------------------------------------------------------------------------
P1                                                                              
SDO_TOPO_OBJECT_ARRAY(SDO_TOPO_OBJECT(3, 3), SDO_TOPO_OBJECT(6, 3))

SDO_LIST_TYPE型

SDO_LIST_TYPE型は、フェイス内の孤立エッジのEDGE_ID値および孤立ノードのNODE_ID値を格納するために使用します。SDO_LIST_TYPE型の定義は次のとおりです。

CREATE TYPE sdo_list_type as VARRAY(2147483647) OF NUMBER;

SDO_EDGE_ARRAY型およびSDO_NUMBER_ARRAY型

SDO_EDGE_ARRAY型は、ノードの移動操作によって影響を受ける、そのノードに接したエッジの座標を指定するために使用します。SDO_EDGE_ARRAY型の定義は次のとおりです。

CREATE TYPE sdo_edge_array as VARRAY(1000000) OF MDSYS.SDO_NUMBER_ARRAY;

SDO_NUMBER_ARRAY型は、Spatial and Graphが配列に使用する汎用型です。SDO_NUMBER_ARRAY型の定義は次のとおりです。

CREATE TYPE sdo_number_array as VARRAY(1048576) OF NUMBER;

トポロジのメタデータ・ビュー

各スキーマ(ユーザー)に対して、xxx_SDO_TOPO_INFOおよびxxx_SDO_TOPO_METADATAという2つの一連のトポロジ・メタデータ・ビューが存在します(xxxはUSERまたはALLです)。これらのビューは、ユーザーに対して読取り専用であり、Spatial and Graphによって作成および管理されます。

xxx_SDO_TOPO_METADATAビューには最も詳細な情報が格納され、各xxx_SDO_TOPO_INFOビューには対応するxxx_SDO_TOPO_METADATAビュー内の情報のサブセットが格納されます。

xxx_SDO_TOPO_INFOビュー

次のビューには、トポロジに関する基本情報が含まれます。

  • USER_SDO_TOPO_INFOには、ユーザーが所有するすべてのフィーチャ表のトポロジ情報が含まれます。

  • ALL_SDO_TOPO_INFOには、ユーザーがSELECT権限を持つすべてのフィーチャ表に関するトポロジ情報が含まれます。

表1-8に示すとおり、USER_SDO_TOPO_INFOビューとALL_SDO_TOPO_INFOビューには同じ列が含まれます。列をビュー定義の順に示します。

表1-8 xxx_SDO_TOPO_INFOビューの列

列名 データ型 目的

OWNER

VARCHAR2

トポロジの所有者です。

TOPOLOGY

VARCHAR2

トポロジ名です。

TOPOLOGY_ID

NUMBER

トポロジのID番号です。

TOLERANCE

NUMBER

トポロジ内のトポロジ・ジオメトリに関連付けられた許容差を指定します。(許容差については、「トポロジ・データ・モデルの許容差」を参照してください。)

SRID

NUMBER

トポロジ内のすべてのトポロジ・ジオメトリ・レイヤーに関連付けられた座標系(空間参照システム)です。座標系が関連付けられていない場合はNULLです。座標系が関連付けられている場合、MDSYS.CS_SRS表(『Oracle Spatial and Graph開発者ガイド』を参照)のSRID列の値が含まれます。

TABLE_SCHEMA

VARCHAR2

トポロジ・ジオメトリ・レイヤー列を含む表を所有するスキーマの名前です。

TABLE_NAME

VARCHAR2

トポロジ・ジオメトリ・レイヤー列を含む表の名前です。

COLUMN_NAME

VARCHAR2

トポロジ・ジオメトリ・レイヤー・データを含む列の名前です。

TG_LAYER_ID

NUMBER

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

TG_LAYER_TYPE

VARCHAR2

POINT、LINE、CURVE、POLYGONまたはCOLLECTIONのいずれかです。(LINEとCURVEの意味は同じです。)

TG_LAYER_LEVEL

NUMBER

このトポロジ・ジオメトリ・レイヤーの階層レベル番号です。(トポロジ・ジオメトリ・レイヤー階層については、「トポロジ・ジオメトリ・レイヤー階層」を参照してください。)

CHILD_LAYER_ID

NUMBER

トポロジ・ジオメトリ・レイヤー階層内のこのレイヤーの子レイヤーであるトポロジ・ジオメトリ・レイヤーのID番号です。このレイヤーに子レイヤーがない場合、またはトポロジにトポロジ・ジオメトリ・レイヤー階層が含まれない場合、NULLです。(トポロジ・ジオメトリ・レイヤー階層については、「トポロジ・ジオメトリ・レイヤー階層」を参照してください。)

DIGITS_RIGHT_OF_DECIMAL

NUMBER

既存のトポロジにフィーチャを追加する際に、任意の座標位置を表すために小数点の右側で使用できる桁数です。追加されるすべてのフィーチャ(Java APIまたは同等のPL/SQLサブプログラムでaddLinearGeometryメソッド、addPolygonGeometryメソッドまたはaddPointGeometryメソッドへの引数として渡されるフィーチャ)は、自動的にこの小数点の右側の桁数に切り捨てられます。デフォルトは16です。

xxx_SDO_TOPO_METADATAビュー

次のビューには、トポロジに関する詳細情報が含まれます。

  • USER_SDO_TOPO_METADATAには、ユーザーが所有するすべての表のトポロジ情報が含まれます。

  • ALL_SDO_TOPO_METADATAには、ユーザーがSELECT権限を持つすべての表に関するトポロジ情報が含まれます。

表1-9に示すとおり、USER_SDO_TOPO_METADATAビューとALL_SDO_TOPO_METADATAビューには同じ列が含まれます。列をビュー定義の順に示します。

表1-9 xxx_SDO_TOPO_METADATAビューの列

列名 データ型 目的

OWNER

VARCHAR2

トポロジの所有者です。

TOPOLOGY

VARCHAR2

トポロジ名です。

TOPOLOGY_ID

NUMBER

トポロジのID番号です。

TOLERANCE

NUMBER

トポロジ内のトポロジ・ジオメトリに関連付けられた許容差を指定します。(許容差については、「トポロジ・データ・モデルの許容差」を参照してください。)

SRID

NUMBER

トポロジ内のすべてのトポロジ・ジオメトリ・レイヤーに関連付けられた座標系(空間参照システム)です。座標系が関連付けられていない場合はNULLです。座標系が関連付けられている場合、MDSYS.CS_SRS表(『Oracle Spatial and Graph開発者ガイド』を参照)のSRID列の値が含まれます。

TABLE_SCHEMA

VARCHAR2

トポロジ・ジオメトリ・レイヤー列を含む表を所有するスキーマの名前です。

TABLE_NAME

VARCHAR2

トポロジ・ジオメトリ・レイヤー列を含む表の名前です。

COLUMN_NAME

VARCHAR2

トポロジ・ジオメトリ・レイヤー・データを含む列の名前です。

TG_LAYER_ID

NUMBER

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

TG_LAYER_TYPE

VARCHAR2

POINT、LINE、CURVE、POLYGONまたはCOLLECTIONのいずれかです。(LINEとCURVEの意味は同じです。)

TG_LAYER_LEVEL

NUMBER

このトポロジ・ジオメトリ・レイヤーの階層レベル番号です。(トポロジ・ジオメトリ・レイヤー階層については、「トポロジ・ジオメトリ・レイヤー階層」を参照してください。)

CHILD_LAYER_ID

NUMBER

トポロジ・ジオメトリ・レイヤー階層内のこのレイヤーの子レイヤーであるトポロジ・ジオメトリ・レイヤーのID番号です。このレイヤーに子レイヤーがない場合、またはトポロジにジオメトリ・レイヤー階層が含まれない場合、NULLです。(トポロジ・ジオメトリ・レイヤー階層については、「トポロジ・ジオメトリ・レイヤー階層」を参照してください。)

NODE_SEQUENCE

VARCHAR2

使用可能な次のノードID番号を含む順序の名前です。

EDGE_SEQUENCE

VARCHAR2

使用可能な次のエッジID番号を含む順序の名前です。

FACE_SEQUENCE

VARCHAR2

使用可能な次のフェイスID番号を含む順序の名前です。

TG_SEQUENCE

VARCHAR2

使用可能な次のトポロジ・ジオメトリID番号を含む順序の名前です。

DIGITS_RIGHT_OF_DECIMAL

NUMBER

既存のトポロジにフィーチャを追加する際に、任意の座標位置を表すために小数点の右側で使用できる桁数です。追加されるすべてのフィーチャ(Java APIまたは同等のPL/SQLサブプログラムでaddLinearGeometryメソッド、addPolygonGeometryメソッドまたはaddPointGeometryメソッドへの引数として渡されるフィーチャ)は、自動的にこの小数点の右側の桁数に切り捨てられます。デフォルトは16です。

トポロジのApplication Program Interface

トポロジ・データ・モデルのApplication Program Interface (API)は、次のもので構成されます。

トポロジ演算子

トポロジ・データ・モデルPL/SQL APIを使用して、次を除くOracle Spatial and Graphの演算子を使用できます。

  • SDO_RELATE(ただし、maskパラメータを使用しないSDO_RELATEの簡易演算子は使用できます)

  • SDO_NN

  • SDO_NN_DISTANCE

  • SDO_WITHIN_DISTANCE

トポロジ・データ・モデルで空間演算子を使用するには、Spatialの演算子の使用方法およびリファレンス情報(『Oracle Spatial and Graph開発者ガイド』を参照)を理解しておく必要があります。この項では、トポロジでの空間演算子の使用に適用される追加情報または相違点についてのみ説明します。この項で特に指定されていないかぎり、『Oracle Spatial and Graph開発者ガイド』に記載されている演算子関連の情報は、トポロジ・データで演算子を使用する場合に適用されます。

トポロジで空間演算子を使用する場合、最初の2つのパラメータの形式には次のいずれかを使用できます。

  • 2つのトポロジ・ジオメトリ・オブジェクト(SDO_TOPO_GEOMETRY型)

    たとえば、次の文は、P3という名前の土地区画フィーチャと相互作用するすべての通りを検出します。(この例では、「トポロジ・データから作成したトポロジ」の定義およびデータを使用しています。)

    SELECT c.feature_name FROM city_streets c, land_parcels l
      WHERE l.feature_name = 'P3' AND
        SDO_ANYINTERACT (c.feature, l.feature) = 'TRUE';
     
    FEATURE_NAME                                                                    
    ------------------------------                                                  
    R1 
    
  • 第1のパラメータとしてのトポロジ・ジオメトリ・オブジェクト(SDO_TOPO_GEOMETRY型)および第2のパラメータとしての空間ジオメトリ(SDO_GEOMETRY型)

    たとえば、次の文は、P3という名前の土地区画フィーチャの境界と同じポリゴンになったジオメトリ・オブジェクトと相互作用するすべての通りを検出します。(この例では、「空間ジオメトリから作成したトポロジの使用」の定義およびデータを使用しています。)

    SELECT c.feature_name FROM city_streets c
      WHERE SDO_ANYINTERACT (c.feature,
        SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,1),
          SDO_ORDINATE_ARRAY(35,6, 47,6, 47,14, 47,22, 35,22, 35,14, 35,6))) = 'TRUE';
     
    FEATURE_NAME                                                                    
    ------------------------------                                                  
    R1
    
  • 第1のパラメータとしてのトポロジ・ジオメトリ・オブジェクト(SDO_TOPO_GEOMETRY型)および第2のパラメータとしてのトポロジ・オブジェクト配列オブジェクト(SDO_TOPO_OBJECT_ARRAY型)

    たとえば、次の文は、P3という名前の土地区画フィーチャと同じになったSDO_TOPO_OBJECT_ARRAYオブジェクトと相互作用するすべての通りを検出します。(この例では、「空間ジオメトリから作成したトポロジの使用」の定義およびデータを使用しています。)

    SELECT c.feature_name FROM city_streets c WHERE
      SDO_ANYINTERACT (c.feature,
       SDO_TOPO_OBJECT_ARRAY (SDO_TOPO_OBJECT (5, 3), SDO_TOPO_OBJECT (8, 3)))
       = 'TRUE';
     
    FEATURE_NAME                                                                    
    ------------------------------                                                  
    R1
    

例1-11では、通りのフィーチャとP3という名前の土地区画との特別な関係をチェックする、別のトポロジ演算子を示しています。最初の文はSDO_FILTER演算子を示しています。残りの文は、演算子名にマスクが含まれているSDO_RELATEの簡易演算子を示しています。この例の簡易演算子では、SDO_ANYINTERACT、SDO_OVERLAPBDYINTERSECTおよびSDO_OVERLAPSのみが、結果として生成されるフィーチャ・データを戻します。(「フィーチャ」図1-3が示すように、P3という名前の土地区画フィーチャと相互作用する唯一の通りはR1です。)例1-11のすべての文では、最初の2つのパラメータがトポロジ・ジオメトリ・オブジェクトである形式を使用しています。

例1-11 トポロジ演算子

-- SDO_FILTER
SELECT c.feature_name FROM city_streets c, land_parcels l
  WHERE l.feature_name = 'P3' AND
    SDO_FILTER (c.feature, l.feature) = 'TRUE';
 
FEATURE_NAME                                                                    
------------------------------                                                  
R1                                                                              
 
-- SDO_RELATE convenience operators
SELECT c.feature_name FROM city_streets c, land_parcels l
  WHERE l.feature_name = 'P3' AND
    SDO_ANYINTERACT (c.feature, l.feature) = 'TRUE';
 
FEATURE_NAME                                                                    
------------------------------                                                  
R1                                                                              
 
SELECT c.feature_name FROM city_streets c, land_parcels l
  WHERE l.feature_name = 'P3' AND
    SDO_CONTAINS (c.feature, l.feature) = 'TRUE';
 
no rows selected
 
SELECT c.feature_name FROM city_streets c, land_parcels l
  WHERE l.feature_name = 'P3' AND
    SDO_COVEREDBY (c.feature, l.feature) = 'TRUE';
 
no rows selected
 
SELECT c.feature_name FROM city_streets c, land_parcels l
  WHERE l.feature_name = 'P3' AND
    SDO_COVERS (c.feature, l.feature) = 'TRUE';
 
no rows selected
 
SELECT c.feature_name FROM city_streets c, land_parcels l
  WHERE l.feature_name = 'P3' AND
    SDO_EQUAL (c.feature, l.feature) = 'TRUE';
 
no rows selected
 
SELECT c.feature_name FROM city_streets c, land_parcels l
  WHERE l.feature_name = 'P3' AND
    SDO_INSIDE (c.feature, l.feature) = 'TRUE';
 
no rows selected
 
SELECT c.feature_name FROM city_streets c, land_parcels l
  WHERE l.feature_name = 'P3' AND
    SDO_ON (c.feature, l.feature) = 'TRUE';
 
no rows selected
 
SELECT c.feature_name FROM city_streets c, land_parcels l
  WHERE l.feature_name = 'P3' AND
    SDO_OVERLAPBDYINTERSECT (c.feature, l.feature) = 'TRUE';
 
FEATURE_NAME                                                                    
------------------------------                                                  
R1                                                                              
 
SELECT c.feature_name FROM city_streets c, land_parcels l
  WHERE l.feature_name = 'P3' AND
    SDO_OVERLAPBDYDISJOINT (c.feature, l.feature) = 'TRUE';
 
no rows selected
 
SELECT c.feature_name FROM city_streets c, land_parcels l
  WHERE l.feature_name = 'P3' AND
    SDO_OVERLAPS (c.feature, l.feature) = 'TRUE';
 
FEATURE_NAME                                                                    
------------------------------                                                  
R1                                                                              
 
SELECT c.feature_name FROM city_streets c, land_parcels l
  WHERE l.feature_name = 'P3' AND
    SDO_TOUCH (c.feature, l.feature) = 'TRUE';
 
no rows selected

「SDO_TOPOパッケージ・サブプログラム」SDO_TOPO.RELATEファンクションの「使用上の注意」も参照してください。

トポロジ・データ・モデルのJavaインタフェース

トポロジ・データ・モデルのJavaクライアント・インタフェースは、次のクラスで構成されます。

  • TopoMap: エッジ、ノードおよびフェイスを格納するクラスです。キャッシュと基礎となるデータベース表の両方でトポロジの一貫性を保持しながら要素を追加および削除するためのメソッドを提供します。

  • Edge: エッジ用のクラスです。

  • Face: フェイス用のクラスです。

  • Node: ノード用のクラスです。

  • Point2DD: 点用のクラスです。

  • CompGeom: 静的な計算ジオメトリのメソッド用クラスです。

  • InvalidTopoOperationException: 無効なトポロジ操作の場合の例外用のクラスです。

  • TopoValidationException: トポロジの検証が正常に実行されなかった場合の例外用のクラスです。

  • TopoEntityNotFoundException: エンティティが検出されなかった場合の例外用のクラスです。

  • TopoDataException: 無効な入力の場合の例外用のクラスです。

トポロジ・データ・モデル・クラスの詳細なリファレンス情報、およびJava APIの使用方法については、『Oracle Spatial and Graph Java API Reference』のJavadoc生成のAPIドキュメントを参照してください。

Spatial and Graph Javaクラス・ライブラリは、<ORACLE_HOME>/md/jlib/ディレクトリの下の.jarファイルにあります。

トポロジ・データのエクスポートおよびインポート

あるデータベースからトポロジをエクスポートし、そのトポロジを別のデータベースに同じ名前、構造およびデータを持つ新しいトポロジとしてインポートできます。ただし、ターゲット・データベースには、エクスポートされるトポロジと同じ名前を持つトポロジが存在していないことが前提となります。あるデータベースからトポロジ・データをエクスポートし、そのデータを別のデータベースにインポートするには、この項に示す手順を実行します。

注意:

この手順は、トポロジ・データがトランスポータブル表領域を使用して転送されるかどうかに関係なく必要です。(トランスポータブル表領域および表領域を別のデータベースに転送する方法の詳細は、『Oracle Database管理者ガイド』を参照してください。)

エクスポートするトポロジ・データを格納しているデータベースで、次の手順を実行します。

  1. トポロジの所有者としてデータベースに接続します。

  2. SDO_TOPO.PREPARE_FOR_EXPORTプロシージャ(「SDO_TOPOパッケージ・サブプログラム」を参照)を実行し、<topology-name>_EXP$という形式の名前を使用してトポロジのエクスポート情報表を作成します。(この表には、USER_SDO_TOPO_INFOビューおよびALL_SDO_TOPO_INFOビューと同じ列が含まれます。これらの列の詳細は、「xxx_SDO_TOPO_INFOビュー」表1-8を参照してください。

    たとえば、エクスポート用にサンプル・トポロジのCITY_DATAを用意すると、CITY_DATA_EXP$表が作成されます。

  3. フィーチャ表および<topology-name>_EDGE$表、<topology-name>_FACE$表、<topology-name>_HISTORY$表、<topology-name>_NODE$表、<topology-name>_RELATION$表、<topology-name>_EXP$表など、トポロジに関連したすべての表をエクスポートします。フィーチャ表の名前(存在する場合)はトポロジ・メタデータに格納されます。

    これによって、.dmpの拡張子を持つファイル(city_data.dmpなど)が作成されます。

トポロジ・データをインポートするデータベースでは、次の手順を実行します。

  1. ターゲット・データベース(ソース・データベースからエクスポートされるトポロジと同じ名前、構造およびデータを持つトポロジを作成するデータベース)に接続します。作成されるトポロジを所有するスキーマのユーザーとして接続します。

  2. ターゲット・データベースに、.dmpファイルのトポロジと同じ名前を持つトポロジが格納されていないことを確認します。

  3. トポロジ・データのエクスポート時に作成した.dmpファイルから表をインポートします。indexes=Nオプションを指定します。

  4. ソース・データベース内のトポロジに使用したスキーマとは別のスキーマにトポロジ表をインポートした場合は、<topology-name>_EXP$表内のすべての行でOWNER列とTABLE_SCHEMA列の値を更新して、現在(ターゲット)のデータベースの表所有者とスキーマ名を反映します。

  5. SDO_TOPO.INITIALIZE_AFTER_IMPORTプロシージャを実行します。このプロシージャは、必要に応じてトポロジの作成および他の操作を行い、トポロジを使用できるようにします。

複数のスキーマが関係している場合のトポロジの使用方法および編集方法

この項では、複数のデータベース・ユーザー(スキーマ)が関係する場合のトポロジの使用および編集に関する要件とガイドラインを説明します。

複数のスキーマが関係している場合のトポロジの使用方法

次の注意事項は、あるユーザーがトポロジを所有し、別のユーザーがトポロジ・ジオメトリ・レイヤー表を所有している場合に適用されます。これらの注意事項では、ユーザーAがCITY_DATAトポロジを所有し、ユーザーBがCITY_STREETSトポロジ・ジオメトリ・レイヤー表を所有していると想定しています。

  • トポロジの所有者はトポロジを作成し、メタデータを初期化する必要があります。この例では、ユーザーAがこれらの操作を行う必要があります。

  • トポロジに対してレイヤーを追加または削除できるのは、トポロジの所有者のみです。したがって、別のユーザーが所有する表をトポロジに追加する場合、またはこのような表をトポロジから削除する場合は、表名をスキーマ名で修飾する必要があります。たとえば、ユーザーAが、ユーザーBの所有するCITY_STREETS表をCITY_DATAトポロジに追加する場合は、次の文を使用します。

    EXECUTE SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('CITY_DATA', 'B.CITY_STREETS', 'FEATURE', 'LINE');
    

    ユーザーAが、ユーザーBの所有するCITY_STREETS表をCITY_DATAトポロジから削除する場合は、次の文を使用します。

    EXECUTE SDO_TOPO.DELETE_TOPO_GEOMETRY_LAYER('CITY_DATA', 'B.CITY_STREETS', 'FEATURE');
    
  • トポロジの所有者は、トポロジ・ジオメトリ・レイヤー表の所有者に、ノード、エッジおよびフェイスの情報表に対するSELECTまたはREAD権限を付与する必要があります。たとえば、ユーザーAは、CITY_DATA_NODE$表、CITY_DATA_EDGE$表およびCITY_DATA_FACE$表に対するSELECT権限をユーザーBに付与する必要があります。

  • トポロジ・ジオメトリ・レイヤー表の所有者は、その表に対するSELECT権限およびINDEX権限をトポロジの所有者に付与する必要があります。たとえば、ユーザーBは、CITY_STREETS表に対するSELECT権限およびINDEX権限をユーザーAに付与する必要があります。

    また、トポロジ・ジオメトリ・レイヤー表の所有者は、その表にアクセスする必要のある他のユーザーに適切な権限を付与する必要があります。読取り専用アクセスの場合は、表に対するSELECT権限をユーザーに付与し、読取り/書込みアクセスの場合には、INSERT権限、SELECT権限およびUPDATE権限を付与します。

複数のスキーマが関係している場合のトポロジの編集方法

次の注意事項は、あるユーザーがトポロジを所有し、別のユーザーがそのトポロジを編集する場合に適用されます。これらの注意事項では、ユーザーAがCITY_DATAトポロジを所有し、ユーザーBがそのトポロジを編集すると想定しています。

  • トポロジの所有者はトポロジを編集するユーザーに、ノード、エッジ、フェイスおよび関係の情報表に対するINSERT権限、SELECT権限およびUPDATE権限を付与する必要があります。また、トポロジのプリミティブのID番号の生成に使用するノード、エッジおよびフェイスの順序に対するSELECT権限も付与する必要があります。たとえば、ユーザーAは、次の権限をユーザーBに付与します。これらの権限では、表名は$で終わり、順序名は_Sで終わります。

    GRANT insert,select,update ON city_data_node$ TO b;
    GRANT insert,select,update ON city_data_edge$ TO b;
    GRANT insert,select,update ON city_data_face$ TO b;
    GRANT insert,select,update ON city_data_relation$ TO b;
    GRANT select ON city_data_node_s TO b;
    GRANT select ON city_data_edge_s TO b;
    GRANT select ON city_data_face_s TO b;
    
  • トポロジを所有しないユーザーがそのトポロジを編集する場合、所有者のスキーマ名は、入力パラメータとしてトポロジ名を受け入れるファンクションおよびプロシージャでトポロジ名を使用して指定する必要があります。たとえば、ユーザーBはトポロジを単にCITY_DATAとしてではなく、A.CITY_DATAとして指定する必要があります。

トポロジを編集する方法の詳細は、「トポロジの編集」を参照してください。

サポートされないファンクション索引

SDO_TOPO_GEOMETRY型の列には、ファンクション索引を作成できません。(ファンクション索引の詳細は、『Oracle Database開発ガイド』および『Oracle Database管理者ガイド』を参照してください。)

トポロジの例(PL/SQL)

この項では、トポロジ・データ・モデル操作を実行する簡単なPL/SQLの例を示します。この例では、この章で説明した概念を示しています。また、「SDO_TOPOパッケージ・サブプログラム」「SDO_TOPO_MAPパッケージ・サブプログラム」に示すSDO_TOPOファンクションおよびプロシージャとSDO_TOPO_MAPファンクションおよびプロシージャ、さらにSDO_ANYINTERACTトポロジ演算子(「トポロジ演算子」を参照)を使用しています。

いずれの例も、「トポロジ・データ・モデルの概念」図1-1に示す「都市データ」トポロジと、「フィーチャ」図1-3に示すフィーチャに基づいています。ただし、作成されたトポロジは同一ではなく、これは、Spatial and Graphのジオメトリから作成されたトポロジ(例1-13)には、トポロジ・データ(例1-12)から作成されたトポロジに対して定義されているエッジ、ノードおよびフェイスがすべて含まれているわけではないためです。

トポロジ・データから作成したトポロジ

例1-12では、エッジ、ノードおよびフェイスの各データから作成したトポロジを使用します。

例1-12 トポロジ・データから作成したトポロジ

------------------------------
-- Main steps for using the Topology Data Model with a topology
-- built from edge, node, and face data
------------------------------
-- 1. Create a topology.
-- 2. Load (normally bulk-load) topology data (node, edge, and face tables).
-- 3. Create feature tables.
-- 4. Associate feature tables with the topology.
-- 5. Initialize topology metadata.
-- 6. Load feature tables using the SDO_TOPO_GEOMETRY constructor.
-- 7. Query the data.
-- 8. Optionally, edit data using the PL/SQL or Java API.
 
-- 1. Create the topology. (Null SRID in this example.)
EXECUTE SDO_TOPO.CREATE_TOPOLOGY('CITY_DATA', 0.00005);
 
-- 2. Load topology data (node, edge, and face tables).
--  Use INSERT statements here instead of a bulk-load utility.
 
-- 2A. Insert data into <topology_name>_EDGE$ table.
 
-- E1
INSERT INTO city_data_edge$ (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, geometry)
 VALUES(1, 1, 1, 1, 1, -1, -1, 1, -1,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(8,30, 16,30, 16,38, 3,38, 3,30, 8,30)));
-- E2
INSERT INTO city_data_edge$ (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, geometry)
 VALUES(2, 2, 2, 3, -3, -2, -2, 2, -1,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(25,30, 31,30, 31,40, 17,40, 17,30, 25,30)));
-- E3
INSERT INTO city_data_edge$ (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, geometry)
 VALUES(3, 2, 3, -3, 2, 2, 3, 2, 2,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(25,30, 25,35)));
-- E4
INSERT INTO city_data_edge$ (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, geometry)
 VALUES(4, 5, 6, -5, -4, 4, 5, -1, -1,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(36,38, 38,35, 41,34, 42,33, 45,32, 47,28, 50,28, 52,32,
57,33)));
-- E5
INSERT INTO city_data_edge$ (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, geometry)
 VALUES(5, 7, 6, -4, -5, 5, 4, -1, -1,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(41,40, 45,40, 47,42, 62,41, 61,38, 59,39, 57,36,
57,33)));
-- E6
INSERT INTO city_data_edge$ (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, geometry)
 VALUES(6, 16, 17, 7, 21, -21, 19, -1, 3,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(9,22, 21,22)));
-- E7
INSERT INTO city_data_edge$ (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, geometry)
 VALUES(7, 17, 18, 8, 6, -19, 17, -1, 4,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(21,22, 35,22)));
-- E8
INSERT INTO city_data_edge$ (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, geometry)
 VALUES(8, 18, 19, -15, 7, -17, 15, -1, 5,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(35,22, 47,22)));
-- E9
INSERT INTO city_data_edge$ (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, geometry)
 VALUES(9, 15, 14, 19, -21, -22, 20, 3, 6,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(9,14, 21,14)));
-- E10
INSERT INTO city_data_edge$ (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, geometry)
 VALUES(10, 13, 14, -20, 18, 17, -19, 7, 4,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(35,14, 21,14)));
-- E11
INSERT INTO city_data_edge$ (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, geometry)
 VALUES(11, 13, 12, 15, -17, -18, 16, 5, 8,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(35,14, 47,14)));
-- E12
INSERT INTO city_data_edge$ (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, geometry)
 VALUES(12, 8, 9, 20, -22, 22, -13, 6, -1,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(9,6, 21,6)));
-- E13
INSERT INTO city_data_edge$ (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, geometry)
 VALUES(13, 9, 10, 18, -20, -12, -14, 7, -1,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(21,6, 35,6)));
-- E14
INSERT INTO city_data_edge$ (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, geometry)
 VALUES(14, 10, 11, 16, -18, -13, -16, 8, -1,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(35,6, 47,6)));
-- E15
INSERT INTO city_data_edge$ (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, geometry)
 VALUES(15, 12, 19, -8, 11, -16, 8, 5, -1,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(47,14, 47,22)));
-- E16
INSERT INTO city_data_edge$ (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, geometry)
 VALUES(16, 11, 12, -11, 14, -14, -15, 8, -1,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(47,6, 47,14)));
-- E17
INSERT INTO city_data_edge$ (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, geometry)
 VALUES(17, 13, 18, -7, -10, 11, -8, 4, 5,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(35,14, 35,22)));
-- E18
INSERT INTO city_data_edge$ (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, geometry)
 VALUES(18, 10, 13, 10, 13, 14, -11, 7, 8,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(35,6, 35,14)));
-- E19
INSERT INTO city_data_edge$ (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, geometry)
 VALUES(19, 14, 17, -6, 9, -10, -7, 3, 4,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(21,14, 21,22)));
-- E20
INSERT INTO city_data_edge$ (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, geometry)
 VALUES(20, 9, 14, -9, 12, 13, 10, 6, 7,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(21,6, 21,14)));
-- E21
INSERT INTO city_data_edge$ (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, geometry)
 VALUES(21, 15, 16, 6, 22, 9, -6, -1, 3,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(9,14, 9,22)));
-- E22
INSERT INTO city_data_edge$ (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, geometry)
 VALUES(22, 8, 15, 21, -12, 12, -9, -1, 6,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(9,6, 9,14)));
-- E25
INSERT INTO city_data_edge$ (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, geometry)
 VALUES(25, 21, 22, -25, -25, 25, 25, 1, 1,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(9,35, 13,35)));
-- E26
INSERT INTO city_data_edge$ (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, geometry)
 VALUES(26, 20, 20, 26, 26, -26, -26, 9, 1,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(4,31, 7,31, 7,34, 4,34, 4,31)));
 
-- 2B. Insert data into <topology_name>_NODE$ table.
 
-- N1
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(1, 1, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(8,30,NULL), NULL, NULL));
-- N2
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(2, 2, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(25,30,NULL), NULL, NULL));
-- N3
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(3, -3, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(25,35,NULL), NULL, NULL));
-- N4
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(4, NULL, 2,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(20,37,NULL), NULL, NULL));
-- N5
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(5, 4, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(36,38,NULL), NULL, NULL));
-- N6
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(6, -4, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(57,33,NULL), NULL, NULL));
-- N7
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(7, 5, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(41,40,NULL), NULL, NULL));
-- N8
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(8, 12, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(9,6,NULL), NULL, NULL));
-- N9
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(9, 20, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(21,6,NULL), NULL, NULL));
-- N10
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(10, 18, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(35,6,NULL), NULL, NULL));
-- N11
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(11, -14, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(47,6,NULL), NULL, NULL));
-- N12
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(12, 15, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(47,14,NULL), NULL, NULL));
-- N13
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(13, 17, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(35,14,NULL), NULL, NULL));
-- N14
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(14, 19, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(21,14,NULL), NULL, NULL));
-- N15
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(15, 21, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(9,14,NULL), NULL, NULL));
-- N16
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(16, 6, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(9,22,NULL), NULL, NULL));
-- N17
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(17, 7, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(21,22,NULL), NULL, NULL));
-- N18
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(18, 8, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(35,22,NULL), NULL, NULL));
-- N19
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(19, -15, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(47,22,NULL), NULL, NULL));
-- N20
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(20, 26, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(4,31,NULL), NULL, NULL));
-- N21
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(21, 25, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(9,35,NULL), NULL, NULL));
-- N22
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(22, -25, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(13,35,NULL), NULL, NULL));
 
-- 2C. Insert data into <topology_name>_FACE$ table.
 
-- F0 (id = -1, not 0)
INSERT INTO city_data_face$ (face_id, boundary_edge_id, 
    island_edge_id_list, island_node_id_list, mbr_geometry) 
 VALUES(-1, NULL, SDO_LIST_TYPE(-1, -2, 4, 6), 
   SDO_LIST_TYPE(), NULL);
-- F1
INSERT INTO city_data_face$ (face_id, boundary_edge_id, 
    island_edge_id_list, island_node_id_list, mbr_geometry) 
 VALUES(1, 1, SDO_LIST_TYPE(25, -26), SDO_LIST_TYPE(),
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3),
    SDO_ORDINATE_ARRAY(3,30, 15,38)));
-- F2
INSERT INTO city_data_face$ (face_id, boundary_edge_id, 
    island_edge_id_list, island_node_id_list, mbr_geometry) 
 VALUES(2, 2, SDO_LIST_TYPE(), SDO_LIST_TYPE(4),
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3),
    SDO_ORDINATE_ARRAY(17,30, 31,40)));
-- F3
INSERT INTO city_data_face$ (face_id, boundary_edge_id, 
    island_edge_id_list, island_node_id_list, mbr_geometry) 
 VALUES(3, 19, SDO_LIST_TYPE(), SDO_LIST_TYPE(),
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3),
    SDO_ORDINATE_ARRAY(9,14, 21,22)));
-- F4
INSERT INTO city_data_face$ (face_id, boundary_edge_id, 
    island_edge_id_list, island_node_id_list, mbr_geometry) 
 VALUES(4, 17, SDO_LIST_TYPE(), SDO_LIST_TYPE(),
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3),
    SDO_ORDINATE_ARRAY(21,14, 35,22)));
-- F5
INSERT INTO city_data_face$ (face_id, boundary_edge_id, 
    island_edge_id_list, island_node_id_list, mbr_geometry) 
 VALUES(5, 15, SDO_LIST_TYPE(), SDO_LIST_TYPE(),
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3),
    SDO_ORDINATE_ARRAY(35,14, 47,22)));
-- F6
INSERT INTO city_data_face$ (face_id, boundary_edge_id, 
    island_edge_id_list, island_node_id_list, mbr_geometry) 
 VALUES(6, 20, SDO_LIST_TYPE(), SDO_LIST_TYPE(),
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3),
    SDO_ORDINATE_ARRAY(9,6, 21,14)));
-- F7
INSERT INTO city_data_face$ (face_id, boundary_edge_id, 
    island_edge_id_list, island_node_id_list, mbr_geometry) 
 VALUES(7, 10, SDO_LIST_TYPE(), SDO_LIST_TYPE(),
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3),
    SDO_ORDINATE_ARRAY(21,6, 35,14)));
-- F8
INSERT INTO city_data_face$ (face_id, boundary_edge_id, 
    island_edge_id_list, island_node_id_list, mbr_geometry) 
 VALUES(8, 16, SDO_LIST_TYPE(), SDO_LIST_TYPE(),
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3),
    SDO_ORDINATE_ARRAY(35,6, 47,14)));
-- F9
INSERT INTO city_data_face$ (face_id, boundary_edge_id, 
    island_edge_id_list, island_node_id_list, mbr_geometry) 
 VALUES(9,26,SDO_LIST_TYPE(), SDO_LIST_TYPE(),
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3),
    SDO_ORDINATE_ARRAY(4,31, 7,34)));
 
-- 3. Create feature tables.
 
CREATE TABLE land_parcels ( -- Land parcels (selected faces)
  feature_name VARCHAR2(30) PRIMARY KEY,
  feature SDO_TOPO_GEOMETRY);
 
CREATE TABLE city_streets ( -- City streets (selected edges)
  feature_name VARCHAR2(30) PRIMARY KEY,
  feature SDO_TOPO_GEOMETRY);
 
CREATE TABLE traffic_signs ( -- Traffic signs (selected nodes)
  feature_name VARCHAR2(30) PRIMARY KEY,
  feature SDO_TOPO_GEOMETRY);
 
-- 4. Associate feature tables with the topology.
--    Add the three topology geometry layers to the CITY_DATA topology.
--    Any order is OK.
 
EXECUTE SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('CITY_DATA', 'LAND_PARCELS','FEATURE', 'POLYGON');
EXECUTE SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('CITY_DATA', 'TRAFFIC_SIGNS','FEATURE', 'POINT');
EXECUTE SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('CITY_DATA', 'CITY_STREETS', 'FEATURE','LINE');
 
--  As a result, Spatial and Graph generates a unique TG_LAYER_ID for each layer in 
--  the topology metadata (USER/ALL_SDO_TOPO_METADATA).
 
-- 5. Initialize topology metadata.
EXECUTE SDO_TOPO.INITIALIZE_METADATA('CITY_DATA');
 
-- 6. Load feature tables using the SDO_TOPO_GEOMETRY constructor.
 
-- Each topology feature can consist of one or more objects (face, edge, node)
-- of an appropriate type. For example, a land parcel can consist of one face,
-- or two or more faces, as specified in the SDO_TOPO_OBJECT_ARRAY.
 
-- There are typically fewer features than there are faces, nodes, and edges.
-- In this example, the only features are these:
-- Area features (land parcels): P1, P2, P3, P4, P5
-- Point features (traffic signs): S1, S2, S3, S4
-- Linear features (roads/streets): R1, R2, R3, R4

-- 6A. Load LAND_PARCELS table.
 
-- P1
INSERT INTO land_parcels VALUES ('P1', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    3, -- Topology geometry type (polygon/multipolygon)
    1, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (3, 3), -- face_id = 3
      SDO_TOPO_OBJECT (6, 3))) -- face_id = 6
);
-- P2
INSERT INTO land_parcels VALUES ('P2', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    3, -- Topology geometry type (polygon/multipolygon)
    1, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (4, 3), -- face_id = 4
      SDO_TOPO_OBJECT (7, 3))) -- face_id = 7
);
-- P3
INSERT INTO land_parcels VALUES ('P3', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    3, -- Topology geometry type (polygon/multipolygon)
    1, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (5, 3), -- face_id = 5
      SDO_TOPO_OBJECT (8, 3))) -- face_id = 8
);
-- P4
INSERT INTO land_parcels VALUES ('P4', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    3, -- Topology geometry type (polygon/multipolygon)
    1, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (2, 3))) -- face_id = 2
);
-- P5 (Includes F1, but not F9.)
INSERT INTO land_parcels VALUES ('P5', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    3, -- Topology geometry type (polygon/multipolygon)
    1, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (1, 3))) -- face_id = 1
);
 
-- 6B. Load TRAFFIC_SIGNS table.
 
-- S1
INSERT INTO traffic_signs VALUES ('S1', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    1, -- Topology geometry type (point)
    2, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (14, 1))) -- node_id = 14
);
-- S2
INSERT INTO traffic_signs VALUES ('S2', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    1, -- Topology geometry type (point)
    2, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (13, 1))) -- node_id = 13
);
-- S3
INSERT INTO traffic_signs VALUES ('S3', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    1, -- Topology geometry type (point)
    2, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (6, 1))) -- node_id = 6
);
-- S4
INSERT INTO traffic_signs VALUES ('S4', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    1, -- Topology geometry type (point)
    2, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (4, 1))) -- node_id = 4
);
 
-- 6C. Load CITY_STREETS table.
-- (Note: "R" in feature names is for "Road", because "S" is used for signs.)
 
-- R1
INSERT INTO city_streets VALUES ('R1', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    2, -- Topology geometry type (line string)
    3, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (9, 2),
      SDO_TOPO_OBJECT (-10, 2),
      SDO_TOPO_OBJECT (11, 2))) -- edge_ids = 9, -10, 11
);
-- R2
INSERT INTO city_streets VALUES ('R2', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    2, -- Topology geometry type (line string)
    3, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (4, 2),
      SDO_TOPO_OBJECT (-5, 2))) -- edge_ids = 4, -5
);
-- R3
INSERT INTO city_streets VALUES ('R3', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    2, -- Topology geometry type (line string)
    3, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (25, 2))) -- edge_id = 25
);
-- R4
INSERT INTO city_streets VALUES ('R4', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    2, -- Topology geometry type (line string)
    3, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (3, 2))) -- edge_id = 3
);
 
-- 7. Query the data.
 
SELECT a.feature_name, a.feature.tg_id, a.feature.get_geometry()
FROM land_parcels a;
 
/* Window is city_streets */
SELECT  a.feature_name, b.feature_name
  FROM city_streets b,
     land_parcels a
  WHERE  b.feature_name like 'R%' AND 
     sdo_anyinteract(a.feature, b.feature) = 'TRUE'
  ORDER BY b.feature_name, a.feature_name;
 
-- Find all streets that have any interaction with land parcel P3.
-- (Should return only R1.)
SELECT c.feature_name FROM city_streets c, land_parcels l 
  WHERE l.feature_name = 'P3' AND
   SDO_ANYINTERACT (c.feature, l.feature) = 'TRUE';
 
-- Find all land parcels that have any interaction with traffic sign S1.
-- (Should return P1 and P2.)
SELECT l.feature_name FROM land_parcels l, traffic_signs t 
  WHERE t.feature_name = 'S1' AND
   SDO_ANYINTERACT (l.feature, t.feature) = 'TRUE';
 
-- Get the geometry for land parcel P1.
SELECT l.feature_name, l.feature.get_geometry()
  FROM land_parcels l WHERE l.feature_name = 'P1';
 
-- Get the boundary of face with face_id 3.
SELECT SDO_TOPO.GET_FACE_BOUNDARY('CITY_DATA', 3) FROM DUAL;
 
-- Get the topological elements for land parcel P2.
-- CITY_DATA layer, land parcels (tg_ layer_id = 1), parcel P2 (tg_id = 2)
SELECT SDO_TOPO.GET_TOPO_OBJECTS('CITY_DATA', 1, 2) FROM DUAL;

空間ジオメトリから作成したトポロジ

例1-13では、Oracle Spatial and Graphのジオメトリ・データから作成したトポロジを使用します。

例1-13 空間ジオメトリから作成したトポロジ

------------------------------
-- Main steps for using the Topology Data Model with a topology
-- built from Spatial and Graph geometry data
------------------------------
-- 1. Create the topology.
-- 2. Insert the universe face (F0). (id = -1, not 0)
-- 3. Create feature tables.
-- 4. Associate feature tables with the topology.
-- 5. Initialize topology metadata.
-- 6. Create a TopoMap object and load the whole topology into 
--     cache for updating.
-- 7. Load feature tables, inserting data from the spatial tables and 
--     using SDO_TOPO_MAP.CREATE_FEATURE.
-- 8. Query the data.
-- 9. Optionally, edit the data using the PL/SQL or Java API.
 
-- Preliminary work for this example (things normally done to use
-- data with Oracle Spatial and Graph): 
-- * Create the spatial tables.
-- * Update the spatial metadata (USER_SDO_GEOM_METADATA).
-- * Load data into the spatial tables.
-- * Validate the spatial data (validate the layers).
-- * Create the spatial indexes.
 
-- Create spatial tables of geometry features: names and geometries.
 
CREATE TABLE city_streets_geom ( -- City streets/roads
  name VARCHAR2(30) PRIMARY KEY,
  geometry SDO_GEOMETRY);
 
CREATE TABLE traffic_signs_geom ( -- Traffic signs
  name VARCHAR2(30) PRIMARY KEY,
  geometry SDO_GEOMETRY);
 
CREATE TABLE land_parcels_geom ( -- Land parcels
  name VARCHAR2(30) PRIMARY KEY,
  geometry SDO_GEOMETRY);
 
INSERT INTO user_sdo_geom_metadata
    (TABLE_NAME,
     COLUMN_NAME,
     DIMINFO,
     SRID)
  VALUES (
    'CITY_STREETS_GEOM',
    'GEOMETRY',
    SDO_DIM_ARRAY(
      SDO_DIM_ELEMENT('X', 0, 65, 0.005),
      SDO_DIM_ELEMENT('Y', 0, 45, 0.005)
      ),
    NULL -- SRID
  );
 
INSERT INTO user_sdo_geom_metadata
    (TABLE_NAME,
     COLUMN_NAME,
     DIMINFO,
     SRID)
  VALUES (
    'TRAFFIC_SIGNS_GEOM',
    'GEOMETRY',
    SDO_DIM_ARRAY(
      SDO_DIM_ELEMENT('X', 0, 65, 0.005),
      SDO_DIM_ELEMENT('Y', 0, 45, 0.005)
      ),
    NULL -- SRID
  );
 
INSERT INTO user_sdo_geom_metadata
    (TABLE_NAME,
     COLUMN_NAME,
     DIMINFO,
     SRID)
  VALUES (
    'LAND_PARCELS_GEOM',
    'GEOMETRY',
    SDO_DIM_ARRAY(
      SDO_DIM_ELEMENT('X', 0, 65, 0.005),
      SDO_DIM_ELEMENT('Y', 0, 45, 0.005)
      ),
    NULL -- SRID
  );
 
-- Load these tables (names and geometries for city streets/roads,
-- traffic signs, and land parcels).
 
-- Insert data into city street line geometries.
 
-- R1 
INSERT INTO city_streets_geom VALUES('R1',
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(9,14, 21,14, 35,14, 47,14)));
 
-- R2
INSERT INTO city_streets_geom VALUES('R2',
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(36,38, 38,35, 41,34, 42,33, 45,32, 47,28, 50,28, 52,32,
57,33, 57,36, 59,39, 61,38, 62,41, 47,42, 45,40, 41,40)));
 
-- R3
INSERT INTO city_streets_geom VALUES('R3',
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(9,35, 13,35)));
 
-- R4
INSERT INTO city_streets_geom VALUES('R4',
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(25,30, 25,35)));
 
-- Insert data into traffic sign point geometries.
 
-- S1
INSERT INTO traffic_signs_geom VALUES('S1',
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(21,14,NULL), NULL, NULL));
 
-- S2
INSERT INTO traffic_signs_geom VALUES('S2',
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(35,14,NULL), NULL, NULL));
 
-- S3
INSERT INTO traffic_signs_geom VALUES('S3',
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(57,33,NULL), NULL, NULL));
 
-- S4
INSERT INTO traffic_signs_geom VALUES('S4',
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(20,37,NULL), NULL, NULL));
 
-- Insert data into land parcel polygon geometries.
 
-- P1
INSERT INTO land_parcels_geom VALUES('P1',
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1), 
    SDO_ORDINATE_ARRAY(9,6, 21,6, 21,14, 21,22, 9,22, 9,14, 9,6)));
 
-- P2
INSERT INTO land_parcels_geom VALUES('P2',
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,1),
    SDO_ORDINATE_ARRAY(21,6, 35,6, 35,14, 35,22, 21,22, 21,14, 21,6)));
 
-- P3
INSERT INTO land_parcels_geom VALUES('P3',
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,1),
    SDO_ORDINATE_ARRAY(35,6, 47,6, 47,14, 47,22, 35,22, 35,14, 35,6)));
 
-- P4
INSERT INTO land_parcels_geom VALUES('P4',
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,1),
    SDO_ORDINATE_ARRAY(17,30, 31,30, 31,40, 17,40, 17,30)));
 
-- P5 (polygon with a hole; exterior ring and one interior ring)
INSERT INTO land_parcels_geom VALUES('P5',
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,1, 11,2003,1), 
      SDO_ORDINATE_ARRAY(3,30, 16,30, 16,38, 3,38, 3,30, 4,31, 4,34, 7,34, 7,31, 4,31)));
 
-- Validate the layers.
create table val_results (sdo_rowid ROWID, result VARCHAR2(2000));
call SDO_GEOM.VALIDATE_LAYER_WITH_CONTEXT('CITY_STREETS_GEOM','GEOMETRY','VAL_RESULTS');
SELECT * from val_results;
truncate table val_results;
call SDO_GEOM.VALIDATE_LAYER_WITH_CONTEXT('TRAFFIC_SIGNS_GEOM','GEOMETRY','VAL_RESULTS');
SELECT * from val_results;
truncate table val_results;
call SDO_GEOM.VALIDATE_LAYER_WITH_CONTEXT('LAND_PARCELS_GEOM','GEOMETRY','VAL_RESULTS');
SELECT * from val_results;
drop table val_results;
 
-- Create the spatial indexes.
CREATE INDEX city_streets_geom_idx ON city_streets_geom(geometry)
  INDEXTYPE IS MDSYS.SPATIAL_INDEX;
CREATE INDEX traffic_signs_geom_idx ON traffic_signs_geom(geometry)
  INDEXTYPE IS MDSYS.SPATIAL_INDEX;
CREATE INDEX land_parcels_geom_idx ON land_parcels_geom(geometry)
  INDEXTYPE IS MDSYS.SPATIAL_INDEX;
 
-- Start the main steps for using the Topology Data Model with a
-- topology built from spatial geometry data.
 
-- 1. Create the topology. (Null SRID in this example.)
EXECUTE SDO_TOPO.CREATE_TOPOLOGY('CITY_DATA', 0.00005);
 
-- 2. Insert the universe face (F0). (id = -1, not 0)
INSERT INTO CITY_DATA_FACE$ values (
  -1, NULL, SDO_LIST_TYPE(), SDO_LIST_TYPE(), NULL);
 
COMMIT;
 
-- 3. Create feature tables.
 
CREATE TABLE city_streets ( -- City streets/roads
  feature_name VARCHAR2(30) PRIMARY KEY,
  feature SDO_TOPO_GEOMETRY);
 
CREATE TABLE traffic_signs ( -- Traffic signs
  feature_name VARCHAR2(30) PRIMARY KEY,
  feature SDO_TOPO_GEOMETRY);
 
CREATE TABLE land_parcels ( -- Land parcels
  feature_name VARCHAR2(30) PRIMARY KEY,
  feature SDO_TOPO_GEOMETRY);
 
-- 4. Associate feature tables with the topology.
--    Add the three topology geometry layers to the CITY_DATA topology.
--    Any order is OK.
 
EXECUTE SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('CITY_DATA', 'CITY_STREETS', 'FEATURE','LINE');
EXECUTE SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('CITY_DATA', 'TRAFFIC_SIGNS','FEATURE', 'POINT');
EXECUTE SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('CITY_DATA', 'LAND_PARCELS','FEATURE', 'POLYGON');
 
--  As a result, Spatial and Graph generates a unique TG_LAYER_ID for each layer in 
--  the topology metadata (USER/ALL_SDO_TOPO_METADATA).

-- 5. Initialize topology metadata.
EXECUTE SDO_TOPO.INITIALIZE_METADATA('CITY_DATA');
 
-- 6. Create a TopoMap object and load the whole topology into cache for updating.
 
EXECUTE SDO_TOPO_MAP.CREATE_TOPO_MAP('CITY_DATA', 'CITY_DATA_TOPOMAP');
EXECUTE SDO_TOPO_MAP.LOAD_TOPO_MAP('CITY_DATA_TOPOMAP', 'true');
 
-- 7. Load feature tables, inserting data from the spatial tables and 
--    using SDO_TOPO_MAP.CREATE_FEATURE.
 
BEGIN
  FOR street_rec IN (SELECT name, geometry FROM city_streets_geom) LOOP
   INSERT INTO city_streets VALUES(street_rec.name,
     SDO_TOPO_MAP.CREATE_FEATURE('CITY_DATA', 'CITY_STREETS', 'FEATURE',
         street_rec.geometry));
  END LOOP;
 
  FOR sign_rec IN (SELECT name, geometry FROM traffic_signs_geom) LOOP
   INSERT INTO traffic_signs VALUES(sign_rec.name,
     SDO_TOPO_MAP.CREATE_FEATURE('CITY_DATA', 'TRAFFIC_SIGNS', 'FEATURE',
         sign_rec.geometry));
  END LOOP;
 
  FOR parcel_rec IN (SELECT name, geometry FROM land_parcels_geom) LOOP
   INSERT INTO land_parcels VALUES(parcel_rec.name,
     SDO_TOPO_MAP.CREATE_FEATURE('CITY_DATA', 'LAND_PARCELS', 'FEATURE',
         parcel_rec.geometry));
  END LOOP;
END;
/
 
CALL SDO_TOPO_MAP.COMMIT_TOPO_MAP();
CALL SDO_TOPO_MAP.DROP_TOPO_MAP('CITY_DATA_TOPOMAP');
 
-- 8. Query the data.
 
SELECT a.feature_name, a.feature.tg_id, a.feature.get_geometry()
FROM land_parcels a;
 
SELECT a.feature_name, a.feature.tg_id, a.feature.get_geometry()
FROM city_streets a;
 
SELECT a.feature_name, a.feature.tg_id, a.feature.get_geometry()
FROM traffic_signs a;
 
SELECT sdo_topo.get_face_boundary('CITY_DATA', face_id), face_id
FROM city_data_face$;
 
SELECT sdo_topo.get_face_boundary('CITY_DATA', face_id), face_id
FROM city_data_face$;
 
SELECT sdo_topo.get_face_boundary('CITY_DATA', face_id, 'TRUE'), face_id
FROM city_data_face$;
 
-- Get topological elements.
SELECT a.FEATURE_NAME,
 sdo_topo.get_topo_objects('CITY_DATA', a.feature.TG_LAYER_ID, a.feature.TG_ID)
FROM land_parcels a;
 
SELECT a.FEATURE_NAME, 
 sdo_topo.get_topo_objects('CITY_DATA', a.feature.TG_LAYER_ID, a.feature.TG_ID)
FROM city_streets a;
 
SELECT a.FEATURE_NAME, 
 sdo_topo.get_topo_objects('CITY_DATA', a.feature.TG_LAYER_ID, a.feature.TG_ID)
FROM traffic_signs a;
 
SELECT sdo_topo.get_topo_objects('CITY_DATA', sdo_geometry(2003,null, null,
       sdo_elem_info_array(1,1003,3),
        sdo_ordinate_array(1,1, 20,20)))
        FROM DUAL;
 
SELECT sdo_topo.get_topo_objects('CITY_DATA', sdo_geometry(2003,null, null,
       sdo_elem_info_array(1,1003,3),
        sdo_ordinate_array(17,30, 31,40)))
        FROM DUAL;
 
-- Find all city streets interacting with a query window.
SELECT c.feature_name FROM city_streets c WHERE
  SDO_ANYINTERACT(
    c.feature,
    SDO_GEOMETRY(2003, NULL, NULL,
      SDO_ELEM_INFO_ARRAY(1, 1003, 3),
      SDO_ORDINATE_ARRAY(5,5, 30,40)))
= 'TRUE';
 
-- Find all streets that have any interaction with land parcel P3.
-- (Should return only R1.)
SELECT c.feature_name FROM city_streets c, land_parcels l 
  WHERE l.feature_name = 'P3' AND
   SDO_ANYINTERACT (c.feature, l.feature) = 'TRUE';
 
-- Find all land parcels that have any interaction with traffic sign S1.
-- (Should return P1 and P2.)
SELECT l.feature_name FROM land_parcels l, traffic_signs t 
  WHERE t.feature_name = 'S1' AND
   SDO_ANYINTERACT (l.feature, t.feature) = 'TRUE';
 
-- Get the geometry for land parcel P1.
SELECT l.feature_name, l.feature.get_geometry()
  FROM land_parcels l WHERE l.feature_name = 'P1';
 
-- Query SDO_TOPO_GEOMETRY attributes,
SELECT s.feature.tg_type FROM city_streets s;
SELECT s.feature.tg_id FROM city_streets s;
SELECT s.feature.tg_layer_id FROM city_streets s;
SELECT s.feature.topology_id FROM city_streets s;
 
-- Topology-specific functions
 
-- Get the boundary of face with face_id 3.
SELECT SDO_TOPO.GET_FACE_BOUNDARY('CITY_DATA', 3) FROM DUAL;
-- Try 'TRUE' as third parameter.
SELECT SDO_TOPO.GET_FACE_BOUNDARY('CITY_DATA', 3, 'TRUE') FROM DUAL;
-- Get the boundary of face with face_id 2.
SELECT SDO_TOPO.GET_FACE_BOUNDARY('CITY_DATA', 2) FROM DUAL;
-- Try 'TRUE' as third parameter.
SELECT SDO_TOPO.GET_FACE_BOUNDARY('CITY_DATA', 2, 'TRUE') FROM DUAL;
-- Get the boundary of face with face_id 1.
SELECT SDO_TOPO.GET_FACE_BOUNDARY('CITY_DATA', 1) FROM DUAL;
-- Specify 'TRUE' for the all_edges parameter.
SELECT SDO_TOPO.GET_FACE_BOUNDARY('CITY_DATA', 1, 'TRUE') FROM DUAL;
 
-- CITY_DATA layer, land parcels (tg_ layer_id = 1), parcel P2 (tg_id = 2)
SELECT SDO_TOPO.GET_TOPO_OBJECTS('CITY_DATA', 1, 2) FROM DUAL;
 
-- 10. Optionally, edit the data using the PL/SQL or Java API.

Spatial and Graphおよび関連機能のREADMEファイル

README.txtファイルは、『Oracle Spatial and Graph開発者ガイド』『Oracle Spatial and Graph GeoRaster開発者ガイド』および『Oracle Spatial and Graphトポロジ・データ・モデルおよびネットワーク・データ・モデル・グラフ開発者ガイド』(このマニュアル)の情報を補足するファイルです。このファイルは次の場所にあります。

$ORACLE_HOME/md/doc/README.txt