ArcSDE が Oracle Spatial を使用する方法
ArcSDE は Oracle データベースでのジオメトリの格納と管理に Oracle Spatial または Oracle Locator をサポートします。使用する場合は、いずれかのコンフィグレーション キーワードの GEOMETRY_STORAGE パラメータに SDO_GEOMETRY が指定されている必要があります。ほとんどの状況で Oracle Spatial ジオメトリ格納を使用したい場合は、DEFAULTS コンフィグレーションキーワードの GEOMETRY_STORAGE パラメータ に SDO_GEOMETRY を指定します。一部のデータセットでのみ使用したい場合は、個々のデータセットの作成時に SDO_GEOMETRY を指定します。
ArcGIS での Oracle Spatial の使用
ArcSDE コンポーネントを初めてインストールしたときのデフォルトのジオメトリ格納タイプは、ST_Geometry です。ArcSDE のデフォルトのジオメトリ格納タイプの設定は、DBTUNE テーブルの GEOMETRY_STORAGE パラメータによって定義されます。
一部のフィーチャクラスだけを Spatial Type for Oracle で格納する場合は、フィーチャクラスの作成時に SDO_GEOMETRY キーワードを指定します。その結果、そのフィーチャクラスは SDO_GEOMETRY 列を持った状態で作成されます。dbtune ファイルでは SDO_GEOMETRY キーワードを次のように指定します。
##SDO_GEOMETRY GEOMETRY_STORAGE "SDO_GEOMETRY" ATTRIBUTE_BINARY "BLOB" RASTER_STORAGE "SDO_GEORASTER" SDO_COMMIT_INTERVAL 1000 UI_TEXT "User Interface text description for SDO_GEOMETRY" COMMENT "Any general comment for SDO_GEOMETRY keyword" END
ほとんどのフィーチャクラスで SDO_Geometry 格納タイプを使用することを予定している場合は、ArcSDE のデフォルトのジオメトリ格納タイプを変更して Oracle Spatial タイプを使用するようにします。
デフォルトのジオメトリ格納タイプを変更するには、sdedbtune 管理コマンドを使用して DBTUNE DEFAULTS キーワードを変更し、GEOMETRY_STORAGE パラメータを ST_GEOMETRY から SDO_GEOMETRY に変更します。デフォルトの GEOMETRY_STORAGE 設定が SDO_GEOMETRY に変更されたら、ArcSDE では、デフォルトで、SDO_GEOMETRY 列を持つフィーチャクラスが作成されます。
sdedbtune コマンドの使用方法の詳細については、『ArcSDE コマンド リファレンス』をご参照ください。
ArcSDE for Oracle はさまざまなジオメトリ格納スキーマをサポートしており、これらの多様なスキーマを同じデータベースの中で組み合わせて使用することができます。デフォルトのジオメトリ スキーマは 1 つだけですが、個々のテーブルを異なるジオメトリ スキーマで作成することができます。
ArcSDE で既存の Oracle Spatial テーブルを使用するための前提条件
ArcSDE ではテーブルが次の前提条件を満たしている限り、他のアプリケーションや SQL によって外部で作成された SDO_GEOMETRY 列が含まれたテーブル(サードパーティ テーブルとも呼ばれます)を使用することができます。
- テーブルが登録するユーザによって所有されている。
- SDO_GEOMETRY 列が 1 つだけである。
- 他のユーザ定義タイプの列が存在していない。
- USER_SDO_GEOM_METADATA ビューに有効なエントリが含まれている。
- ジオメトリ タイプが 1 種類である(ポイント、ライン、またはポリゴン)。ジオメトリはマルチパートであってもかまいません。
- 登録済みの RowID 列に適した、整数タイプの一意な NULL ではない列がある。
- 空間インデックスを持つ。
- Oracle のジオメトリ整合チェック テストに合格している。合格できない場合は、これらのジオメトリにアクセスしたときに予想外の結果が生じる可能性があります。
- すべての空間レコードの SDO_ORDINATES 配列に NULL ではない有効な数値が含まれている。
相互運用性について
一般的な誤解の 1 つは、アプリケーションの相互運用が可能なのは、単にそれらが同じジオメトリ タイプをサポートしているからである、というものです。ただし、ジオメトリ タイプは、ジオデータベースと他の GIS データベース スキーマの 1 つの側面にすぎません。ルール、制約、スキーマ、実装について合意している必要もあります。次に、Oracle Spatial を ArcSDE と ArcSDE クライアントで使用するときに検討すべきことをまとめます。
ArcSDE と ArcGIS では、1 つのテーブルについて複数のジオメトリ列がサポートされません。
複数の SDO_GEOMETRY 列が含まれたテーブルには、SDO_GEOMETRY 列が 1 つだけ含まれたビューを通じてアクセスする必要があります。
複数の空間列が含まれた Oracle Spatial テーブルのデータを使用するには、SQL を使って空間ビューを作成します。このビューには、空間列が 1 つだけ含まれるようにします。次に、sdelayer -o register コマンドを使用して、ArcSDE に空間ビューを登録します。
SDO_GEOMETRY 列が 1 つだけ含まれたビューを作成して登録する方法については、Knowledge Base の記事「HowTo: Create an Oracle View of an Oracle Spatial layer, containing multiple geometry columns, and register it with ArcSDE」をご参照ください。
ArcSDE と ArcGIS では、SDO_GEOMETRY 列について 1 つのジオメトリ タイプしかサポートされません。
1 つの SDO_GEOMETRY 列に複数のジオメトリ タイプが含まれている(一部のレコードがポイントで一部のレコードがポリゴンであるなど)テーブルは、ArcSDE に登録することも、ジオデータベースに登録することもできません。フィーチャクラスは 1 つのジオメトリ タイプが含まれた状態で登録する必要があります。
Oracle Spatial では、1 つの SDO_GEOMETRY 列でジオメトリ タイプを必ずしも 1 つに制限しません。従って、ジオメトリ タイプを 1 つに維持しようとするアプリケーションがある一方で、別のアプリケーションでは複数のジオメトリ タイプを挿入できるといった状態が生じる可能性があります。Oracle9i 以降では、空間インデックス作成パラメータを使用して、テーブルに挿入できるジオメトリ タイプを制限することができます。それ以前のバージョンの Oracle の場合は、SDO_GEOMETRY の GTYPE プロパティを調べる挿入/更新トリガを作成すればジオメトリ タイプを制限することができます。
ArcSDE と SDO_GEOMETRY のジオメトリ整合チェックは同じではありません。
ArcSDE はジオメトリの挿入または更新時にジオメトリを整合チェックします。Oracle 10g では、(SQLなど)ArcSDE クライアント以外の方法でジオメトリを挿入または更新した場合は、SDO_GEOMETRY 値の挿入または更新について Oracle Spatial そのものによるジオメトリの整合チェックが自動的には行われません。Oracle 11g では、索引への挿入において Oracle Spatial によってジオメトリの整合チェックが行われます。
不正または十分な形状ではないジオメトリ値が ArcSDE クライアント アプリケーションに渡された場合は、問題が発生します。こうした問題を未然に防ぐために、ArcSDE クライアント アプリケーション以外の方法でジオメトリを作成または変更する場合は、整合チェックを行ってください。
ArcSDE 9.1 の場合、SDO_GEOMETRY フィーチャはデータベースから直接取得され、整合チェックが行われません。これはフェッチのパフォーマンスを向上させるために取られた措置です。
ArcSDE 9.2 以降では、空間テーブルを ArcSDE 外で作成してから ArcSDE に登録した場合に限って、フェッチの際に整合チェックが行われます。ArcGIS または ArcSDE API を使用してレイヤを作成した場合には、フェッチ時に整合チェックが実施されません。
ジオメトリを整合チェックするためのツールは 2 つあります。Oracle の VALIDATE_GEOMETRY_WITH_CONTEXT は、Oracle のシェープ整合性ルールに基づいてジオメトリをチェックします。sdelayer -o feature_info コマンドは、ArcSDE のルールに基づいてジオメトリをチェックします。feature_info の操作には、その出力の一部として、シェープのジオメトリが ArcSDE で有効であるかどうかに関する情報を追加することもできます。この操作方法の詳細については、『ArcSDEコマンド リファレンス』をご参照ください。
ArcSDE のジオメトリの整合チェックは、Oracle Spatial のジオメトリの整合チェックと同じではありません。ジオメトリが Oracle Spatial の整合チェックに合格することは重要ですが、ジオメトリが Oracle の整合チェックに合格したからといって、ArcSDE による整合チェックにもパスするという保証はありません。
SDO_VALIDATE 関数を呼び出す挿入/更新トリガを作成すれば、SDO_GEOMETRY タイプの整合チェックを強制することができます。
ArcSDE の C API を使用すると、ArcSDE のシェープ整合チェックに合格しなかったフィーチャを読み取ることが可能なアプリケーションを作成することができます。ただし、その場合は、クライアント アプリケーションで、ジオメトリが適切かどうか、および修正方法を判断する必要があります。
SDO_GEOMETRY オブジェクトを読み取るほとんどのアプリケーションは、他のアプリケーションによって作成された SDO_ETYPE が 0 のデータを解釈できません。
Oracle Spatial ではアプリケーション固有のデータを SDO_GEOMETRY オブジェクトに挿入することができます。この場合、アプリケーションは 0 の SDO_ETYPE 値を使用して、アプリケーション固有のデータを埋め込みます。これにより、アプリケーションは標準以外のさまざまなタイプのジオメトリやデータを非常に柔軟に格納できるようになります。しかし、アプリケーション固有のデータは、その SDO_GEOMETRY オブジェクトを生成したアプリケーションにしか解釈することができません。このようなアプリケーション固有のデータを相互運用環境で確実にサポートすることはできません。SDO_GEOMETRY オブジェクトを読み取るアプリケーションは、おそらく、別のアプリケーションによって SDO_ETYPE を 0 として作成されたデータを解釈できません。また、SDO_GEOMETRY オブジェクトを更新するアプリケーションでは、SDO_ETYPE が 0 のデータを編集または保存できません。
SDO_ETYPE が 0 のエレメントが含まれた SDO_GEOMETRY オブジェクトを読み取る際、ArcSDE は SDO_ETYPE が 0 のデータを無視し、ArcSDE がサポートしているシンプル フィーチャ ジオメトリだけをアプリケーションに渡します。
SDO_ETYPE が 0 のエレメントが含まれている SDO_GEOMETRY オブジェクトを更新する際、ArcSDE は SDO_ETYPE が 0 のデータを維持しません。このため、SDO_ETYPE が 0 のデータを確実に維持しなければならないアプリケーションでは、そのテーブルへの UPDATE アクセス権限がユーザにないことを確認する必要があります。
ArcSDE では、列内のすべての SDO_GEOMETRY 値が同じ座標参照系を使用していなければなりません。
座標参照が未定義である場合は、『Oracle Spatial ユーザーズガイドおよびリファレンス』で説明されているように、SRID 値は NULL でなければなりません。
Oracle9i よりも前のバージョンでは、SDO_GEOMETRY 値の挿入または更新時の Oracle Spatial による SRID の整合チェックが自動的には行われません。このような古い Oracle インスタンスで SDO_GEOMETRY タイプの整合チェックを強制的に行うには、SDO_VALIDATE 関数を呼び出す挿入/更新トリガを作成します。Oracle Spatial では、(SRID が NULL であったとしても)各ジオメトリの SRID が相互に一致するとともに、空間メタデータの SRID と一致する必要があります。
Oracle Spatial と ArcSDE は、SDO_GEOMETRY の 1 つ目と 2 つ目のディメンションがそれぞれ X と Y であることを前提としています。
SDO_GEOMETRY オブジェクトに 3 つのディメンションが含まれている場合、ArcSDE は(空間メタデータの)3 つ目のディメンションの名前が「M」で始まる場合はメジャーであると想定し、それ以外の場合は標高であると想定します。ArcSDE が 3 つ目のディメンションを解釈する方法を制御するには、フィーチャクラスのエンティティ フラグを標高またはメジャーに設定します。
Oracle9i リリース 2 では、SDO_GEOMETRY タイプの SDO_GTYPE メンバが拡張され、M 座標が含まれているディメンションをエンコードできるようになりました。4 桁の SDO_GTYPE の 2 桁目は、0、3、4 のいずれかになります。3 または 4 の場合は、どのディメンションに M 座標が含まれているかを示します。ArcSDE 9 以降のバージョンでは、このエンコーディングが読み取られます。それ以外の場合、SDO_GEOMETRY オブジェクトに 4 つのディメンションが含まれていれば、最後の座標がメジャーであると想定されます。
次の例では、sdelayer コマンドを使用して,ラインストリングと標高を格納するようにフィーチャクラスのエンティティ タイプが設定されます。
sdelayer –o add –e l3
次の例では、sdelayer コマンドを使用して、ラインストリングとメジャーを格納するようにフィーチャクラスのエンティティ タイプが設定されます。
sdelayer –o add –e lM
Oracle Spatial(Oracle Locator は除外)では、メジャー値を使用した LRS 計算のための関数が提供されます。
Oracle Spatial の LRS(Linear Reference System)関数は、ジオメトリのすべてのメジャー値が一律に昇順または降順であり、NaN 値が含まれていないことを要求します。Oracle Spatial LRS では、メジャー値がラインストリングに制限されます。
ArcSDE では、すべてのジオメトリ タイプでメジャー値と LRS 計算がサポートされるとともに、任意の順序のメジャー値と NaN 値がサポートされます。
Oracle Spatial LRS 関数の使用を計画している場合は、アプリケーションとデータベースを Oracle Spatial LRS の制約の範囲で設計してください。
ArcSDE で空間検索、ログ ファイル検索、単一行の処理、マルチバージョン対応のデータベース処理を実行するには、空間テーブルに一意なフィーチャ識別子が含まれている必要があります。
ArcSDE Compressed Binary スキーマを使用する場合は、Geometry 列がフィーチャ テーブルへの外部キーであり、NULL 以外のの一意な整数値として定義されているため、Geometry 列がその役割を果たします。SDO_GEOMETRY には一意な識別値が含まれないので、ArcSDE が既存のテーブルに SDO_GEOMETRY 列を追加する際に、一意な識別列も追加されることがあります。このような列は登録済みの RowID 列です。この列には通常 OBJECTID という名前が付けられていますが、別の名前を使用することもできます。あるいは、インデックスが付いていて、かつ一意な、NULL 以外の整数の列であれば、既存の列を登録済みの RowID 列として使用することができます。ArcSDE によって管理される登録済みの RowID 列は、NUMBER(38) UNIQUE NOT NULL でなければなりません。
登録済みの RowID 列は、sdetable 管理コマンドまたは ArcCatalog アプリケーションを使用して追加することができます。ArcGIS など、多くのアプリケーションでは、各テーブルまたはフィーチャクラスに登録済みの RowID 列が必要です。要件や制限はアプリケーションごとに異なります。
ネットワーク、トポロジ、リレーションシップ、または制約に属する Oracle Spatial フィーチャクラスの変更は、ArcGIS アプリケーションに制限する必要があります。
ArcGIS では SDO_GEOMETRY タイプを使用するシンプル フィーチャクラスからネットワークおよび統合トポロジ フィーチャクラスを作成し、管理することができます。ArcGIS はさまざまな種類のデータ ソースにわたってリレーションシップと制約を適用します。ArcGIS はリレーションシップを管理し、トポロジの整合性を維持します。ArcGIS を通じたフィーチャへのデータ変更は、統合されたこれらのネットワーク、トポロジ、およびリレーションシップに反映されます。
ネットワーク、トポロジ、リレーションシップ、および制約に属する Oracle Spatial フィーチャクラスの変更は、ArcGIS アプリケーションに制限する必要があります。他のアプリケーションでもデータを自由に読み取ることができますが、他のアプリケーションで行った編集はジオデータベースに正しく反映されません。