ST_Geometry データ タイプはユーザー定義データ タイプ (UDT) の SQL 3 Specification を実装しているので、ランドマークの場所、道路、土地区画といった空間データを格納できる列を作成することができます。これは、ジオデータベースおよびデータベースに対して、 ISO/OGC 準拠の SQL アクセスを提供します。このジオメトリ格納は、地理フィーチャを表すオブジェクト (ポイント、ライン、ポリゴン) の格納を提供することで、データベースの機能を拡張します。このジオメトリ格納は、データベースのリソースを効率よく使用し、レプリケーションやパーティションといったデータベースの機能との互換性を維持し、空間データへのすばやいアクセスを可能にします。
Esri は、Esri が定義した ST_Geometry タイプを Oracle、PostgreSQL、SQLite で実装しました。この ST_Geometry データ タイプ は、ArcGIS ヘルプで説明されています。
ST_Geometry 自体は、インスタンス化されない抽象スーパークラスです。ただし、そのサブクラスはインスタンス化することができます。インスタンス化されたデータ タイプはテーブルの列として定義することができ、その他の値を挿入することができます。
列を ST_Geometry タイプとして定義することはできますが、インスタンス化することができないため ST_Geometry の値は挿入しません。代わりに、サブクラスの値を挿入します。
次の図は、ST_Geometry データ タイプとそのサブクラスの階層を示しています。
サブクラス
ST_Geometry のサブクラスは、ベース ジオメトリ サブクラスと同種コレクション サブクラスの 2 つのカテゴリに分類されます。ベース ジオメトリには、ST_Point、ST_LineString、ST_Polygon が含まれ、同種コレクションには、ST_MultiPoint、ST_MultiLineString、ST_MultiPolygon が含まれます。名前が示しているように、同種コレクションはベース ジオメトリのコレクションです。同種コレクションでは、ベース ジオメトリのプロパティを共有することに加えて、独自のプロパティを持つこともできます。
各サブクラスは、その名前が示唆するジオメトリ タイプを格納します。たとえば、ST_MultiPoint はマルチポイントを格納します。以下の表に、サブクラスの一覧とそれらについての説明を示します。
サブタイプ | 説明 |
---|---|
ST_Point |
|
ST_LineString |
|
ST_Polygon |
|
ST_MultiPoint |
|
ST_MultiLineString |
|
ST_MultiPolygon |
|
各サブクラスは ST_Geometry スーパークラスのプロパティを継承しますが、サブタイプ固有のプロパティもあります。ST_Geometry データ タイプで使用できる関数は、サブクラス エンティティ タイプでも使用できます。ただし、一部の関数はサブクラス レベルで定義されており、特定のサブクラスにしか対応しません。たとえば、ST_GeometryN 関数には、引数として ST_MultiLinestring、ST_MultiPoint、ST_MultiPolygon サブタイプのみを渡すことができます。
ST_Geometry のサブクラスを検出するには、ST_GeometryType 関数を使用できます。ST_GeometryType 関数は、ST_Geometry を受け取り、インスタンス化されたサブクラスを文字列形式で返します。同種コレクションに含まれているベース ジオメトリ エレメントの数を取得するには、ST_NumGeometries 関数を使用できます。この関数は、同種コレクションを受け取り、コレクションに含まれているベース ジオメトリ エレメントの数を返します。
ST_Geometry 関数呼び出し
Oracle と PostgreSQL の ST_Geometry 関数は、SQL で実装されます。これはデータベース レベルの言語です。Oracle の場合は、PL/SQL (Procedural Language Structured Query Language) です。PostgreSQL の場合は PL/pgSQL です。
SQL 関数で Oracle または PostgreSQL データベースの ST_Geometry 列にアクセスする際には、データベースに直接アクセスすることになります。したがって、データベースが ST_Geometry 関数にアクセスできる必要があります。Oracle の場合、データベースは extproc プロセスも使用します。
SQLite の場合、ST_Geometry 関数は C の ST_Geometry ライブラリで実装されています。ST_Geometry 関数を使用するには、ST_Geometry ライブラリにアクセスする必要があります。
Oracle
関数は PL/SQL で実装されており、これによって、C プログラミング言語で記述された外部共有ライブラリ ファイルの関数が呼び出されます。関数は、ライブラリ名 (Oracle の ST_Geometry の場合は st_shapelib) をライブラリ ファイル名にマップするエイリアス名で PL/SQL から呼び出されます。(詳細については、Oracle の CREATE LIBRARY コマンドに関するドキュメントをご参照ください。) st_shapelib を必要とする空間タイプ関数が初めて呼び出されたときには、SQL セッションに対する extproc プロセスの生成がデータベースからリスナーにリクエストされます。extproc には、st_shapelib の場所、呼び出す関数の名前、およびそのパラメーターが渡されます。extproc によって st_shapelib が読み込まれ、関数が呼び出されます。外部関数が完了すると、extproc は結果を返し、アクティブ状態のままこのセッションで追加の関数呼び出しを待ちます。extproc プロセスは、SQL セッションが切断されると終了します。
これには、以下の構成が必要になります。
- データベースが、リスナー プロセスおよび extproc に情報を渡せるように、st_shapelib が含まれたファイルの場所を認識できる必要があります。
- ST_Geometry の演算子と関数は、user_libraries テーブルにある st_shapelib 用の file_spec がサーバー上の st_shapelib の物理的なファイルの場所に一致しなければ機能しません。このため、Oracle ユーザー ライブラリでライブラリの定義を更新して、CREATE LIBRARY コマンドで st_shapelib が含まれたファイルへの正しいライブラリ パスを含めるようにします。
- データベースが、extproc へのリクエストを処理するサービスを認識できる必要があります。これは tnsnames.ora ファイルで設定します。
- extproc には、st_shapelib を含むファイルの読み込み権限が必要です。この権限は、extproc.ora ファイルで環境変数 EXTPROC_DLLS を定義して設定します。
- (通常は ORACLE_HOME を所有するユーザーで実行される) extproc には、ライブラリ ファイルの場所に対する読み取り権限と、ファイルの実行権限が必要です。
PostgreSQL
st_geometry ライブラリは、PostgreSQL が ST_Geometry 関数にアクセスできるよう、PostgreSQL インストール ディレクトリに格納する必要があります。Windows の st_geometry.dll ファイルを、PostgreSQL インストール ディレクトリの lib フォルダーにコピーする必要があります。Linux サーバーの場合は、Linux の st_geometry.so ファイルを、PostgreSQL サーバーの /usr/lib/pgsql ディレクトリにコピーします。これらのファイルは、両方とも、ArcMap または ArcGIS Server のインストール場所の DatabaseSupport フォルダーにあります。または、My Esri からダウンロードすることもできます。
SQLite
SQLite クライアントが SQL 関数にアクセスできるようにするには、ST_Geometry ライブラリの場所を指定して、ライブラリを読み込む必要があります。ライブラリの場所は、クライアントの PATH (Windows) または LIBPATH (Linux) システム環境変数で設定したり、ST_Geometry ライブラリを読み込むときにパスで指定したりできます。手順については、「SQLite の ST_Geometry ライブラリの読み込み」をご参照ください。
ST_Geometry の実装方法
ST_Geometry は、ユーザー定義タイプとして実装されており、IBM DB2、IBM Informix、Oracle、および PostgreSQL 内のデータベースおよびジオデータベースで使用できます。SQLite データベースでも、ST_Geometry を使用できます。
各 DBMS は ST_Geometry を次のようにサポートします。
DBMS ごとの ST_Geometry
DBMS | 説明 |
---|---|
Oracle | ST_Geometry データ タイプは、Oracle にジオデータベースを作成したときにインストールされ、Oracle 内のジオデータベースのデフォルトのジオデータベース格納タイプです。ジオデータベース機能が不要な場合、[空間タイプの作成 (Create Spatial Type)] ジオプロセシング ツールを使用して、Oracle データベースに ST_Geometry タイプをインストールできます。 |
IBM DB2 | DB2 製品の一部として IBM によってデフォルトで含められる DB2 Spatial Extender は、ST_Geometry をサポートします。ST_Geometry は、フィーチャ ジオメトリを DB2 内のジオデータベースに格納するために使用される唯一のオプションです。これは、Esri と IBM によって共同開発されました。 DB2 for z/OS と DB2 for Windows/Linux/UNIX とでは SQL 構文にいくつか違いがあることに注意してください。使用している DBMS に応じた適切な構文については、DB2 のマニュアルをご参照ください。 |
IBM Informix | Informix 製品の一部として IBM によって提供される Informix Spatial DataBlade は、ST_Geometry タイプをデータベースおよびジオデータベースにインストールします。ST_Geometry は、フィーチャ ジオメトリを Informix 内のジオデータベースに格納するために使用される唯一のオプションです。これは Esri と IBM によって共同開発されたもので、空間データに対する ISO/OGC 準拠の SQL アクセスを可能にする高性能な格納タイプです。 |
PostgreSQL | ST_Geometry データ タイプは、PostgreSQL にジオデータベースを作成したときにインストールされ、フィーチャ ジオメトリを PostgreSQL 内のジオデータベースに格納するためのデフォルトのタイプです。ジオデータベース機能が不要な場合、[空間タイプの作成 (Create Spatial Type)] ジオプロセシング ツールを使用して、PostgreSQL データベースに ST_Geometry タイプをインストールできます。 |
SQLite | SQLite の ST_Geometry データ タイプは、st_geometry ライブラリおよび geometryblob 列を使用して実装されます。ST_Geometry SQL 関数は、データベースではなく st_geometry ライブラリに保存されます。 [SQLite データベースの作成 (Create SQLite Database)] ジオプロセシング ツールまたは CreateSQLiteDatabase ArcPy 関数を使用して、ST_Geometry タイプを格納する SQLite データベースを作成できます。また、CreateOGCTables SQL 関数を使用して、既存の SQLite データベースに ST_Geometry データ タイプを作成することもできます。 |