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つです。他に、ノード情報表、エッジ情報表およびフェイス情報表にトポロジ・データをロードする方法もあります。どちらの方法についても、次の項を含む「トポロジ・データを使用するための主なステップ」を参照してください。
-
空間ジオメトリから作成したトポロジの使用 (CREATE_FEATUREファンクションを使用する方法)
このファンクションの最初または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つ以上存在する場合は、例外が発生します。
-
topology
、table_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;
親トピック: SDO_TOPO_MAPパッケージ・サブプログラム