SDO_GEOMETRY ジオメトリ格納を使用したフィーチャクラスの作成
ジオデータベースの SDO_GEOMETRY 格納でフィーチャクラスを作成すると、次の処理が発生します。
SDO_GEOMETRY 列を含むテーブルが作成されます。
Oracle のジオデータベースにフィーチャクラスを作成するときに、GEOMETRY_STORAGE パラメータが SDO_GEOMETRY に設定された DBTUNE コンフィグレーション キーワードを指定すると、ArcGIS は、シェープ フィールドに SDO_GEOMETRY 列を使用します。
次の例のフィーチャクラスには、一意の識別子(ObjectID)フィールド、NAME 属性と POPULATION 属性、および SDO_GEOMETRY シェープ列があります。
名前 |
データ タイプ |
NULL? |
---|---|---|
NAME |
VARCHAR2(32)* |
|
POPULATION |
NUMBER(11) |
|
SHAPE |
MDSYS.SDO_GEOMETRY |
|
OBJECTID |
NUMBER(38) |
NOT NULL |
*Unicode 文字列を使用する場合は VARCHAR2(32) ではなく NVARCHAR2(32) が使用されます。
SDO_GEOMETRY 列に空間インデックスが作成されます。
ArcGIS は、デフォルトでフィーチャクラスの SDO_GEOMETRY 列に R ツリー空間インデックスを作成します。ArcGIS は Oracle の SDO_FILTER ファンクションを使用してフィーチャクラスに対して空間検索を実行するため、空間検索に空間インデックスが必要です。
ArcGIS はフィーチャクラスの LOAD_ONLY_IO モードと NORMAL_IO モードが切り替えられるたびに、ArcGIS によって作成された Oracle Spatial インデックスを自動的に削除して再作成します。Oracle Spatial Index Advisor アプリケーションによって定義された空間インデックス、または SQL を使って作成された空間インデックスは、ArcGIS がフィーチャクラスを LOAD_ONLY_IO モードに切り替えても削除されません。
Oracle Spatial メタデータ ビューにレコードが追加されます。
ArcGIS が SDO_GEOMETRY 列を含むフィーチャクラスを作成するときに、必要な Oracle Spatial メタデータ レコードが USER_SDO_GEOM_METADATA ビューに追加されます。このメタデータには、テーブルの名前、SDO_GEOMETRY 列の名前、SRID、および座標ディメンション情報が含まれています。
ArcGIS を使用してフィーチャクラスを削除すると、Oracle Spatial メタデータも削除されます。
座標ディメンションが指定されます。
ArcGIS のジオメトリは、2D(X、Y)、2D とメジャー(X、Y、M)、3D(X、Y、Z)、または 3D とメジャー(X、Y、Z、M)で作成できます。SDO_GEOMETRY 列を含む新しいフィーチャクラスを作成すると、ArcGIS によって、メタデータ ビューの DIMINFO 列に Oracle Spatial ディメンション情報が配置されます。
- X 座標は最初のディメンションです。
- Y 座標は第 2 ディメンションです。
- フィーチャクラスが標高付きで定義されている場合の Z 座標は第 3 ディメンションです。
- フィーチャクラスがメジャー付きで定義されている場合の M 座標が最後のディメンションです(Z 座標が存在するかどうかに応じて、第 3 または第 4 ディメンション)。
SDO_GEOMETRY 列にデータが設定されます。
ジオデータベースにジオメトリを格納する際、ArcGIS は SE_SHAPE という名前の API オブジェクトから SDO_GEOMETRY 値を設定します。SE_SHAPE オブジェクトには、標高、メジャー、CAD データ、アノテーション、サーフェス パッチを含め、シンプル ジオメトリとコンプレックス ジオメトリを追加することができます。SDO_GEOMETRY データ タイプはこれらのジオメトリック プロパティの一部をサポートしています。SDO_GEOMETRY と SE_SHAPE オブジェクトのコンポーネントは 1 対 1 で対応していないため、ArcGIS はデータを Oracle Spatial テーブルに格納するときに、一連のルールに従います。
- ジオメトリのエンティティ タイプに基づいて、4 桁の SDO_GTYPE を作成します。
- SDO_SRID タイプの設定使用できる値のリストは、「SRID とは」をご参照ください。
- 座標値を適切な座標参照系で書き出します。
- X、Y、Z、M の順に座標を書き出します。標高とメジャーを定義するのは、それらがソース SE_SHAPE オブジェクトに含まれている場合だけです。
- ソース SE_SHAPE オブジェクトに標高またはメジャーが含まれている場合は、すべての座標とともに標高またはメジャーを格納します。
- ジオメトリの特定の座標に未定義の標高またはメジャー値が含まれている場合は、標高とメジャーを NaN(Not a Number)に設定します。
- メジャー値は、ラインストリングだけでなく、すべてのジオメトリ タイプを許可します。最初と最後の座標にメジャー値が含まれていることを必要としません。
- メジャー値を昇順または降順に制限しません。
- フィーチャクラスが CAD エンティティ マスク(c)で登録されている場合は、円弧を SDO_GEOMETRY タイプに書き出します。それ以外の場合は、円弧を圧縮された直線エッジのラインストリングに変換します。
- 円弧以外の曲線(3 次スプライン、ベジエなど)を直線エッジのラインストリングに変換します。フィーチャクラスが CAD エンティティ マスク(c)で登録されている場合は、曲線表現を SE_ANNO_CAD_DATA に格納します。
- すべてのフィーチャを整合チェックしてから、データベースに書き出します。
- SDO_GEOMETRY オブジェクトにシングルパートの x、y または x、y、z を格納する場合は、SDO_POINT を使用します。他のタイプのポイント フィーチャクラスでは、ポイント頂点を SDO_ORDINATE_ARRAY に格納します。
ArcGIS では SDO_GEOMETRY オブジェクトに種類の異なるジオメトリを追加することはできません。また、ArcGIS は SDO_GEOMETRY オブジェクトに SDO_ETYPE が 0 のエレメントをエンコードしません。SDO_ETYPE が 0 のエレメントは、アプリケーション固有のエレメントです。
CAD およびアノテーション プロパティを格納する場合は、追加の列がビジネス テーブルに追加されます。
SDO_GEOMETRY タイプでは、ArcGIS 格納でサポートしなければならないすべてのタイプのジオメトリック エレメントを格納することができません。これらのエレメントの格納領域が必要な場合(フィーチャクラスの作成時にジオメトリ タイプ フラグから決定されます)、ArcGIS は SE_ANNO_CAD_DATA という名前の列をビジネス テーブルに追加します。このトピックの最初のセクションにあるフィーチャクラスの例の場合、この時点でビジネス テーブルには次の列が含まれます。
名前 |
データ タイプ |
NULL? |
---|---|---|
NAME |
VARCHAR2(32)* |
|
POPULATION |
NUMBER(11) |
|
SHAPE |
MDSYS.SDO_GEOMETRY |
|
SE_ANNO_CAD_DATA |
BLOB |
|
OBJECTID |
NUMBER(38) |
NOT NULL |
*Unicode 文字列を使用する場合は VARCHAR2(32) ではなく NVARCHAR2(32) が使用されます。
ArcGIS はデータ ソースに CAD データが含まれていることを検出すると、CAD データのシンプル ジオメトリ表現を SDO_GEOMETRY 値に書き込み、変更していない CAD データを SE_ANNO_CAD_DATA 値に書き込みます。データ ソースに CAD データが含まれていない場合、ArcGIS は SE_ANNO_CAD_DATA 値 をNULL に設定します。SE_ANNO_CAD_DATA プロパティには、さまざまな ArcGIS コンポーネントのデータが含まれます。
- ArcMap からの 3 次スプラインやベジエ曲線などのパラメトリック オブジェクト
- ArcGIS Spatial Analyst エクステンション からのサーフェス パッチ
Oracle Spatial フィルタ関数を使用してフィーチャクラスで空間検索が実行されます。
ArcGIS は Oracle Spatial の SDO_FILTER 関数を使用して、1 次空間検索を実行します。ArcGIS はアプリケーションが要求する空間リレーションシップに基づいて、SDO_GEOMETRY の 2 次空間検索を実行します。
アプリケーションが ArcGIS に指定する SQL WHERE 句には、Oracle Spatial の 1 次フィルタ関数と 2 次フィルタ関数が含まれていることがあります。アプリケーションは WHERE 句に空間フィルタを使用することで、空間検索をデータベース サーバ、ArcSDE アプリケーション サーバ、およびアプリケーションそのものに分散させることができます。