Select to view content in your preferred language

ジオデータベースのフィーチャクラスとSQL

55
0
Wednesday

ジオデータベースのフィーチャクラスとSQL

はじめに

RDBMS 上に作成されるエンタープライズジオデータベースは、RDBMS に空間データを格納し ArcGIS で利用するための最適な方法です。

エンタープライズジオデータベースのフィーチャクラスは、データベースでは空間列を持つテーブルとして存在します。そのため、データベースにログインして SQL でフィーチャクラス(テーブル)にアクセスすることが可能ですが、ジオデータベースでは SQL を使用したデータのアクセスにはいくつかルールがあるため、ここではそのルールとアクセス方法についてご紹介します。
※ ここでは PostgreSQL に作成されたジオデータベースを例に説明します。

エンタープライズジオデータベースのシステムテーブル

ArcGIS [エンタープライズジオデータベースの作成]ジオプロセシングツールを使用して RDBMS にエンタープライズジオデータベースを作成すると、ジオデータベースを管理するためのシステムテーブルが作成されます。

ジオデータベースのシステムテーブルは、ジオデータベースのデータ(フィーチャクラスやネットワークデータセットなど)の設定情報等を管理するテーブルで、ArcGIS ソフトウェアが管理しているため、システムテーブルへの ArcGIS 以外からの更新は行わないでください。ただし、SQL で参照(SELECT)することは可能です。

例えば、誰がどのフィーチャクラスを所有しているかを確認するために、以下のようなSQLを実行することは問題ありません(なお、この情報は ArcGIS Pro からジオデータベース管理者で接続することで、カタログウィンドウから確認できます)。

SELECT owner, table_name FROM sde.sde_layers;

 ユーザー定義テーブル

ユーザー定義テーブルは、利用者が ArcGIS を使用してエンタープライズジオデータベースに作成したフィーチャクラスやテーブルなどのデータセットとして RDBMS 上に作成されるテーブル、または直接 RBMS に接続し SQL を使用して作成されたテーブルです。なお、後者については本記事では取り上げませんが、ご興味のある方は Web ヘルプの「PostgreSQL の ST_Geometry」をご覧ください。

ArcGIS で作成したデータセットのテーブルは、システムテーブルと同様に SQL で参照することが可能です。

ただし、ArcGIS 上では1つのデータセットとして表示されていても、1つのテーブルで RDBMS 上に作成されていないものがあります。これらのデータセットについては Web ヘルプに定義情報が公開されていますが、ArcGIS によってこれらのテーブルの関係性を管理することが前提となっているため SQL での利用は想定されていません。

一方で、ポイント/ライン/ポリゴンなどの単純なフィーチャクラスやテーブルについてはSQL でアクセスし、選択や抽出を行うことが出来ます。

選択や抽出などは一般的なテーブルに対する SQL の実行ですので、次項からはフィーチャクラスの空間データを使用する方法についてご紹介します。

ST_Geometry 関数

Oracle や PostgreSQL に構築したジオデータベースでは ST_Geometry 関数が提供され利用することができます。これらの関数は OpenGIS Consortium(OGC)の Simple Features Specification に準拠しています。

ST_Geometry 関数を使用することで、データベース上で SQL から重心を求めたり、あるフィーチャと交差するフィーチャを空間的に検索したりすることができます。ST_Geometry 関数の使用方法については Esri から公開されているリファレンスをご参照ください。リファレンスには関数の説明とともに使用例も記載されています。

例えばあるポリゴンに内包されるデータを抽出する場合には、以下のように ST_Contains を使用します。

SELECT name FROM testdata 
WHERE SDE.ST_CONTAINS((SELECT shape FROM saitama2 WHERE sikuchoson ='越谷市'), shape) = 't';

フィーチャクラスの SQL からの編集

ジオデータベースのシステムテーブルは編集が行えないことについては前述しましたが、フィーチャクラスについては、特定の手順に従うことで編集を行うことが可能です。ただし、編集可能なフィーチャクラスはシンプルなポイント、ライン、ポリゴンなどが対象で、アタッチメントやネットワークデータセットなどのデータセットは含まれません。

ここでは、バージョン対応登録されていないポイントフィーチャクラスを SQL で編集する方法をご紹介します。

削除

フィーチャクラスからのフィーチャ(レコード)の削除は、空間データと関連する操作は行わないため、一般的なテーブルからのレコードの削除と同様に行うことができます。

DELETE FROM <テーブル名> WHERE objectid = 1;

更新

属性フィールドの更新については、削除と同様空間データは関係ないため一般的なSQLと同じ方法で行うことが可能です。一方でシェープフィールド(空間列)の更新については、フィーチャクラスの仕様として、1つのフィーチャクラスのデータは同じジオメトリタイプと同じ空間参照を使用する必要があるため、この2点を事前に確認する必要があります。これらは ArcGIS Pro のカタログウィンドウからフィーチャクラスのプロパティダイアログを開くことで確認することが可能です。

実際にシェープを更新する SQL の例は以下のようになります。ジオメトリを作成する関数(ST_POINT 等)のパラメータについては先に紹介したリファレンスをご参照ください。

UPDATE <テーブル名> SET shape = SDE.ST_POINT('point(<x> <y>)', srid) WHERE objectid = 2;
SatoruGUNJI_0-1719450837636.png

挿入

 新規フィーチャの作成(挿入)は、ジオデータベースのデータすべてに自動的に用意されるOBJECTIDフィールドに注意する必要があります。OBJECTIDは、ArcGIS およびジオデータベースによって管理される一意の整数フィールドです。OBJECTID に設定する値は、任意の数値を使用することはできません。そのため、新しいレコードの OBJECTID の値を入力するには Next_RowID という関数を使用します。この関数は第1引数にテーブルの所有者を、第2引数にテーブル名を指定することで、フィーチャクラスに使用できるOBJECTIDを返します。

これらを使用して新しいフィーチャを作成するSQL は以下のようになります。

INSERT INTO <テーブル名> (objectid, shape) VALUES (SDE.NEXT_ROWID('所有者名','テーブル名'), SDE.ST_POINT('point(<x> <y>)', srid));
SatoruGUNJI_1-1719450920044.png

SQL でフィーチャを更新・作成した場合、ArcGIS では自動で行われるフィーチャクラスのエクステントの更新が行われないため、既存のフィーチャクラスの範囲外にフィーチャを移動したり追加したりした場合は [フィーチャクラスの範囲を再計算] ツールを実行して、フィーチャクラスのエクステントを更新してください。

最後に

今回ご紹介したフィーチャクラスのSQLでのアクセスや更新は、ArcGIS を使用することですべて行うことが可能です。SQL での自動化なども ArcPy ArcGIS API for Python のスクリプトを作成することで同じことが行えます。SQL での操作は、既存の仕組みとしてRDBMSに直接データが更新される仕組みがある場合などにジョブやトリガーに組み込むような利用ケースが考えられますが、こうした場合はRDBMS に用意されている空間型を使用し、ArcGIS からはクエリレイヤーとして利用する方法も選択することができます。

 また、フィーチャクラスを SQL を使用して更新する方法は ArcGIS Pro のヘルプには記載がありません(ArcMap のヘルプには記載されています)。本記事の公開時点では SQL でのフィーチャクラスの編集はサポートされますが、今後の対応についてはサポートへお問合せください。

関連情報

OGC(Open Geospatial Consortium)

データベースと ST_Geometry

SQL とエンタープライズ ジオデータベースArcMap ヘルプ)

Version history
Last update:
Wednesday
Updated by:
Contributors