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