SQL での ST_Geometry の使用のクイック ツアー
データベース管理システム(DBMS)の SQL(Structured Query Language)、データ タイプ、およびテーブル形式を使用して、ST_Geometry タイプがインストールされたジオデータベースまたはデータベースに格納された情報を処理できます。SQL は、データ定義コマンドとデータ操作コマンドをサポートするデータベース言語です。
SQL 経由でデータにアクセスすれば、ジオデータベースまたはデータベースによって管理される表形式データを外部アプリケーションから処理できます。この外部アプリケーションは、非空間データベース アプリケーションであっても、ArcObjects 以外の環境で開発されたカスタムの空間アプリケーションであってもかまいません。
SQL を使用してジオデータベースまたはデータベースにデータを挿入する場合や、ジオデータベースまたはデータベースのデータを編集する場合は、SQL ステートメントの実行後に、COMMIT または ROLLBACK ステートメントを発行して、変更内容を確実にデータベースにコミットするか、元に戻してください。これにより、編集している行、ページ、またはテーブルがロックされたままになるのを防ぐことができます。
SQL を使用した ST_Geometry データの挿入
SQL を使用して、ST_Geometry 列のあるデータベースまたはジオデータベースのテーブルに空間データを挿入できます。ST_Geometry コンストラクタ関数を使用して特定のジオメトリ タイプを挿入します。特定の空間処理関数の出力を既存のテーブルへの出力とするように指定することもできます。
SQL を使用してジオメトリをテーブルに挿入する場合は、次の点に注意してください。
- 有効な空間参照 ID(SRID)を指定する必要があります。
- ArcGIS で引き続きこのテーブルを使用する場合、ObjectID として使用されているフィールドに NULL を設定することはできません。
空間参照 ID
ST_Geometry 空間タイプを使用している Oracle のテーブルにジオメトリを挿入するときに指定する SRID は、ST_SPATIAL_REFERENCES テーブルに存在し、かつ同一の SRID が SDE.SPATIAL_REFERENCES テーブルにも存在する必要があります。ST_Geometry 空間タイプを使用している PostgreSQL のテーブルにジオメトリを挿入するときに指定する SRID は、public.sde_spatial_references テーブルに存在する必要があります。ArcGIS 10.1 以降、これらのテーブルには、空間参照と SRID が事前に入力されています。
ST_Geometry 空間タイプ(geometryblob)を使用している SQLite のテーブルにジオメトリを挿入するときに指定する SRID は、st_spatial_reference_systems テーブルに存在する必要があります。
テーブルに存在しないカスタム空間参照を使用する必要がある場合、最も簡単な方法は、ArcGIS for Desktop を使用して、目的の空間参照値を持つフィーチャクラスを読み込むか作成することです。この時、作成するフィーチャクラスには、ST_Geometry 格納を使用します。こうすると、Oracle の場合は SDE.SPATIAL_REFERENCES テーブルと ST_SPATIAL_REFERENCES テーブルに、PostgreSQL の場合は public.sde_spatial_references テーブルに、SQLite の場合は st_aux_spatial_reference_systems_table に、SRID のレコードが作成されます。
ジオデータベースで、作成した空間テーブルに割り当てられた SRID を確認するには、LAYERS(Oracle)または sde_layers(PostgreSQL)テーブルをクエリします。SQL を使用して空間テーブルを作成してデータを挿入するときは、この SRID を使用できます。
あるいは、SQL を使用して ST_SPATIAL_REFERENCES または sde_spatial_references テーブルに空間参照を追加することができます。詳細については、「SQL を使用した空間参照の作成」をご参照ください。
ObjectID
ArcGIS でデータをクエリするには、テーブルに一意の識別子フィールドが存在する必要があります。
ArcGIS で作成されたフィーチャクラスには、識別子フィールドとして使用される ObjectID フィールドが常に存在します。ArcGIS を使用してフィーチャクラスにレコードを挿入すると、必ず一意の値が ObjectID フィールドに挿入されます。ジオデータベース テーブルの ObjectID フィールドは ArcGIS によって管理されます。ArcGIS から作成されたデータベース テーブルの ObjectID フィールドは、DBMS によって管理されます。
SQL を使用してジオデータベース テーブルにレコードを挿入する場合は、Next_RowID 関数を使用して有効な ObjectID 値を取得し、挿入する必要があります。ArcGIS で作成されたデータベース テーブルに SQL を使用してレコードを挿入すると、DBMS によって ObjectID フィールドに値が設定されます。
ArcGIS の外部で作成したデータベース テーブルには、ArcGIS が ObjectID として使用できるフィールド(または一連のフィールド)が必要です。テーブルの ID フィールドに、データベースにネイティブで用意されている自動増加データ タイプを使用する場合、SQL を使用してレコードを挿入したときに DBMS によってこのフィールドに値が設定されます。一意の識別子フィールドの値を手動で管理する場合は、SQL からテーブルを編集するときに、この ID の値が必ず一意になるようにしてください。
ユーザが管理する一意の識別子フィールドを持つテーブルからデータを公開することはできません。
詳細については、「ObjectID とは」をご参照ください。
SQL を使用した ST_Geometry データの編集
既存のレコードを SQL で編集すると、多くの場合テーブルに格納された非空間属性が影響を受けます。ただし、SQL UPDATE ステートメントの中で、コンストラクタ関数を使用して ST_Geometry 列内のデータを編集することができます。
データがジオデータベースに格納されている場合は、SQL で編集するときに、次のガイドラインに従うことも必要になります。
- バージョン対応ビューと組み合わせて SQL を使用する場合を除いて、データをバージョン対応登録した場合は、SQL を使用してレコードを更新しないでください。
- リレーションシップ クラスやフィーチャリンク アノテーション、トポロジ、ネットワークなど、ジオデータベースの振舞いを通じてデータベース内の他のオブジェクトに影響を与える属性は変更しないでください。
SQL を使用してジオデータベースにアクセスしている場合は、バージョニング、トポロジ、ネットワーク、テレイン、フィーチャリンク アノテーション、その他のクラスまたはワークスペースのエクステンションなどのジオデータベースの機能は無視されます。一部のジオデータベース機能に必要なテーブル間の関係を維持するために、トリガやストアド プロシージャなどの DBMS 機能を使用できる場合があります。これらの機能を考慮せずにジオデータベースに対して SQL コマンドを実行すると(たとえば、INSERT ステートメントを実行してバージョン対応ビジネス テーブルにレコードを追加したり、既存のフィーチャクラスに列を追加したりする)、ジオデータベース機能を無視してジオデータベース内のデータ間の関係を破損してしまう可能性があります。