1.6 トポロジ・データ型

トポロジ・データ・モデルに関連付けられる主なデータ型は、トポロジ・ジオメトリを表すSDO_TOPO_GEOMETRYです。

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

1.6.1 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が生成)です。

TG_LAYER_ID

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

TOPOLOGY_ID

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

トポロジ内の各トポロジ・ジオメトリは、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;

1.6.2 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内部のみで使用します。

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

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
);

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

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
);

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

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';

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

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';

1.6.3 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)) 

1.6.4 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))

1.6.5 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))

1.6.6 SDO_LIST_TYPE型

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

CREATE TYPE sdo_list_type as VARRAY(2147483647) OF NUMBER;

1.6.7 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が配列に使用する汎用型です。SDO_NUMBER_ARRAY型の定義は次のとおりです。

CREATE TYPE sdo_number_array as VARRAY(1048576) OF NUMBER;