4.13 SDO_TOPO_MAP.CREATE_FEATURE

構文(トポロジ・ジオメトリ・レイヤー階層を使用しない場合または階層の最下位レベルを使用する場合)

SDO_TOPO_MAP.CREATE_FEATURE(     
  topology    IN VARCHAR2,      
  table_name  IN VARCHAR2,      
  column_name IN VARCHAR2,      
  geom        IN SDO_GEOMETRY      
) RETURN SDO_TOPO_GEOMETRY;
or
SDO_TOPO_MAP.CREATE_FEATURE(     
  topology    IN VARCHAR2,      
  table_name  IN VARCHAR2,      
  column_name IN VARCHAR2,      
  geom        IN SDO_GEOMETRY,
  snapfeature IN NUMBER     
) RETURN SDO_TOPO_GEOMETRY;

構文(階層の親レベルを使用する場合)

SDO_TOPO_MAP.CREATE_FEATURE(     
  topology      IN VARCHAR2,      
  table_name    IN VARCHAR2,      
  column_name   IN VARCHAR2,      
  dml_condition IN VARCHAR2      
) RETURN SDO_TOPO_GEOMETRY;

説明

Oracle Spatialのジオメトリからフィーチャを作成します。(このファンクションは、フィーチャ表に行を挿入するために使用します。)

  • (geomパラメータを使用し、dml_conditionパラメータを使用しない)最初の2つの構文は、トポロジ・ジオメトリ・レイヤー階層を使用せずにトポロジ内にフィーチャを作成するか、またはトポロジ・ジオメトリ・レイヤー階層を使用してトポロジの最下位レベルにフィーチャを作成します。

  • (dml_conditionパラメータを使用し、geomパラメータを使用しない) 3番目の構文は、トポロジ・ジオメトリ・レイヤー階層を使用して、トポロジの親レベルにフィーチャを作成します。

パラメータ

topology

関連付けの行われている指定したフィーチャ表およびフィーチャ列を含むトポロジを指定します。

table_name

column_nameで指定したフィーチャ列を含むフィーチャ表の名前を指定します。

column_name

トポロジ・ジオメトリを含む(SDO_TOPO_GEOMETRY型の)フィーチャ列の名前を指定します。

geom

ジオメトリ・オブジェクトを指定します。

snapfeature

1に設定すると、指定した新しいフィーチャがトポロジ内の既存のエッジおよびノードにスナップされます。

dml_condition

トポロジ・ジオメトリ・レイヤー階層を使用するトポロジ(「トポロジ・ジオメトリ・レイヤー階層」を参照)の場合は、子レイヤーから親レイヤーに挿入する行を選択するためのDML条件を指定します。引用符付き文字列で条件を指定します。ただし、WHEREという単語は使用しません。たとえば、STATE_ABBR列値がMAの行のみを選択するには、'state_abbr=''MA'''と指定します

使用上のノート

このファンクションは、空間表に格納されている既存のジオメトリからフィーチャを作成するために使用します。既存のジオメトリからのフィーチャの作成は、トポロジのフィーチャを作成する方法の1つです。他に、ノード情報表、エッジ情報表およびフェイス情報表にトポロジ・データをロードする方法もあります。どちらの方法についても、次の項を含む「トポロジ・データを使用するための主なステップ」を参照してください。

このファンクションの最初または2番目の構文を使用する場合は、最初に更新可能なTopoMapオブジェクトを作成してロードする必要があります。トポロジのフィーチャまたは関連付けられた位相要素を作成するために、このファンクションは、ジオメトリ・オブジェクトのSDO_GTYPE値に応じて、更新可能なTopoMapオブジェクトのaddPointGeometryメソッド、addLinearGeometryメソッドまたはaddPolygonGeometryメソッドを内部的にコールし、次に更新可能なTopoMapオブジェクトのupdateTopologyメソッドをコールして位相要素をデータベースに書き込みます。このファンクションがINSERT文またはUPDATE文でコールされると、フィーチャ表内でフィーチャの作成または更新が行われます。ファンクションが完了すると、トポロジにジオメトリのオーバーレイが行われます。(つまり、Spatialは暗黙的に作成されたTopoMapオブジェクトを使用して、このファンクションへの各コールに対して新しいTopoMapオブジェクトを作成します。)

このファンクションの3番目の構文を使用する場合は、更新可能なTopoMapオブジェクトを作成する必要がありません。このファンクションは、dml_conditionパラメータ値に基づいて子レベルのフィーチャのTG_ID値を内部的に収集し、SDO_TGL_OBJECT_ARRAYオブジェクトを組み合せてSDO_GEOMETRYオブジェクトを作成します。

このファンクションがすべてのジオメトリで正常に実行されるようにするには、各ジオメトリに対してループを使用してファンクションをコールします。このファンクションは、INSERT文またはUPDATE文の副問合せで使用しないでください。副問合せで使用すると、トポロジで不整合が発生し、さらにその不整合に関するエラー・メッセージや警告メッセージを受け取れない場合があります。

次の状態が1つ以上存在する場合は、例外が発生します。

  • topologytable_nameまたはcolumn_nameが存在しない。

  • geomで指定しているジオメトリ・オブジェクトのタイプが、トポロジ・ジオメトリ・レイヤーのタイプと一致しない。たとえば、土地区画フィーチャの作成に線ストリング・ジオメトリは使用できません。

  • トポロジ・ジオメトリ・レイヤー階層を持たないトポロジでdml_conditionが使用されている。

  • 入力ジオメトリに、最適化された形状(最適化された矩形や円など)が含まれている。

  • 線ストリングまたは複数の線で構成されるストリングのジオメトリで、線セグメントが重なっている。

  • 複数のポリゴンで構成されるジオメトリで、外部リングが他の外部リングに重なっている。

次の例では、CITY_STREETSフィーチャ表、TRAFFIC_SIGNSフィーチャ表およびLAND_PARCELSフィーチャ表のFEATURE列に、それぞれCITY_STREETS_GEOM空間表、TRAFFIC_SIGNS_GEOM空間表およびLAND_PARCELS_GEOM空間表のGEOMETRY列のすべてのジオメトリを移入します。この例では、CITY_DATAトポロジに対して更新可能なTopoMapオブジェクトが作成され、ロードされていると想定しています。(この例では、「空間ジオメトリから作成したトポロジ」の定義およびデータを参照しています。)

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

次の例では、郡と州という2つのレイヤーを使用したトポロジ・ジオメトリ・レイヤー階層を持つトポロジを作成します。親レイヤー(州)フィーチャを作成するCREATE_FEATUREファンクションへのコールには、dml_conditionパラメータ('p_name=''NH'''など)が含まれます。

declare
 name varchar2(64);
 cursor c1 is select state_abrv, county from
   counties order by 1, 2;
 stateabrv varchar2(2);
begin
 
 -- Initialize.
 sdo_topo_map.create_topo_map('cnty', 'm2', 10000, 10000, 10000);
 sdo_topo_map.load_topo_map('m2', -180, -90, 180, 90, 'true');
 
 -- Insert one county at a time.
 for cnty_rec in c1 loop
   stateabrv := cnty_rec.state_abrv;
   name := cnty_rec.county;
   insert into cnty_areas select state_abrv || '-' ||county,
     sdo_topo_map.create_feature('CNTY', 'CNTY_AREAS', 'FEATURE', geom) from
     counties where state_abrv=stateabrv and county=name;
 end loop;
 
 -- Roll back topology.
 sdo_topo_map.rollback_topo_map();
 sdo_topo_map.drop_topo_map('m2');
 
 -- Roll back inserts.
 rollback;
 
exception
 when others then
   dbms_output.put_line(SQLERRM);
   sdo_topo_map.rollback_topo_map();
   sdo_topo_map.drop_topo_map('m2');
   rollback;
end;
/
 
-- Add parent feature layer.
--  
--   The following commented out statement can be used to populate the
--     child_layer_id parameter in sdo_topo.add_topo_geometry_layer.
--  
--   select tg_layer_id
--     from user_sdo_topo_info 
--     where TOPOLOGY = 'SC' 
--       and table_name = 'SC_AREAS';
-- 
execute sdo_topo.add_topo_geometry_layer('SC','SC_P_AREAS', 'FEATURE', -
                                      'POLYGON', NULL, child_layer_id => 1);
 
-- Create and insert state features (logically) from county features.
insert into sc_p_areas (f_name, p_name, feature) values ('NH', 'US',
  sdo_topo_map.create_feature('SC','SC_P_AREAS','FEATURE','p_name=''NH'''));
insert into sc_p_areas (f_name, p_name, feature) values ('CT', 'US',
  sdo_topo_map.create_feature('SC','SC_P_AREAS','FEATURE','p_name=''CT'''));
insert into sc_p_areas (f_name, p_name, feature) values ('ME', 'US',
  sdo_topo_map.create_feature('SC','SC_P_AREAS','FEATURE','p_name=''ME'''));
insert into sc_p_areas (f_name, p_name, feature) values ('MA', 'US',
  sdo_topo_map.create_feature('SC','SC_P_AREAS','FEATURE','p_name=''MA'''));
commit;