ST_Geometry 空間データ タイプは、ジオデータベースを含む PostgreSQL データベースと、ジオデータベースを含まないデータベースで使用できます。 ST_Geometry データ タイプを使用すると、他のタイプのビジネス データと空間データの統合も可能になるため、マルチユーザー データベースでの解析やデータ作成にジオグラフィック コンポーネントを追加できるようになります。 空間データを他のビジネス オブジェクトと一緒に保管すると、管理するデータ格納リソースが少なくなるので、データのマルチユーザー アクセス、管理、セキュリティも容易になります。
PostgreSQL のジオデータベースで ST_Geometry タイプを使用するには、ジオデータベースを作成する前に、st_geometry ライブラリを PostgreSQL のインストールにコピーする必要があります。 手順については、「Windows での PostgreSQL のジオデータベースの作成」または「Linux での PostgreSQL のジオデータベースの作成」をご参照ください。 ジオデータベースを含まない PostgreSQL ジオデータベースを使用する場合、データベースに作成する空間テーブルで使用する ST_Geometry タイプをインストールできます。
PostgreSQL で ST_Geometry タイプを使用する方法の詳細については、次のトピックに記載されています。
- PostgreSQL の ST_Geometry 空間タイプのアーキテクチャ
- ST_Geometry 格納を使用する ArcGIS のフィーチャクラスの作成方法
- ST_Geometry 列を含む PostgreSQL テーブルの ArcGIS でのアクセス方法
- 使用できる空間参照を制限して ST_Geometry 列を登録する方法
ST_Geometry が空間データを格納する方法
次に、PostgreSQL の ST_Geometry の説明を示します。
Name | タイプ | 説明 |
---|---|---|
size | LONG INTEGER | シェープ バッファーを含む ST_Geometry 構造の全長 |
srid | LONG INTEGER | sde_spatial_references テーブルの関連する空間参照 (座標系) レコードにリンクされるジオメトリの識別子が含まれる。 |
numpts | LONG INTEGER | ジオメトリを定義するポイントの数 (マルチパート ジオメトリの場合は、各パート間のセパレーターも含まれます。各セパレーターにつき 1 ポイントとなります) |
エンティティ | SHORT INTEGER | 空間列に格納されるジオメトリック フィーチャのタイプ (ラインストリング、マルチラインストリング、マルチポイント、マルチポリゴン、ポイント、ポリゴン) |
sqltype | SHORT INTEGER | POINT_TYPE、POINTM_TYPE または MULTIPOLYGONZM_TYPE などの、シェープの SQL タイプ。 |
minx | LFLOAT | miny、maxx および maxy とともにジオメトリの空間エンベロープを定義 |
miny | LFLOAT | minx、maxx および maxy とともにジオメトリの空間エンベロープを定義 |
maxx | LFLOAT | minx、miny および maxy とともにジオメトリの空間エンベロープを定義 |
maxy | LFLOAT | minx、miny および maxx とともにジオメトリの空間エンベロープを定義 |
minz | LFLOAT | 最小 Z 値 |
maxz | LFLOAT | 最大 Z 値 |
minm | LFLOAT | 最小 M 値 |
maxm | LFLOAT | 最大 M 値 |
面積 | LFLOAT | ジオメトリの面積 |
len | LFLOAT | ジオメトリの外周の長さ |
形状 | BYTEA | Esri 圧縮シェープ |
他のオブジェクト タイプと同様に、ST_Geometry データ タイプにはコンストラクター メソッドと関数が含まれます。 コンストラクター メソッドは、データ タイプの新しいインスタンス (オブジェクト) を返し、その属性値を設定します。
コンストラクターの名前はタイプと同じ (ST_Geometry) です。 次の例に示すように、ST_Geometry タイプのオブジェクトをインスタンス化する際には、コンストラクター メソッドを呼び出します。
CREATE TABLE hazardous_sites (name varchar(128), location st_geometry);
次に示す ST_Geometry へのアクセス用の関数は、入力として ST_Geometry を 1 つ受け取り、要求されたプロパティ値を数値として返します。
- ST_Area メンバー関数は、ジオメトリの面積を返します。
- ST_Length はジオメトリの長さを返します。
- ST_Entity は、エンティティ タイプを説明するビット マスクを含む数値を返します。
- ST_NumPoints: ジオメトリを定義するポイント (頂点) の数を返します。
- ST_MinM、ST_MinX、ST_MinY、ST_MinZ: ジオメトリの望ましい座標最小値を返します。
- ST_MaxM、ST_MaxX、ST_MaxY、ST_MaxZ: ジオメトリの望ましい座標最大値を返します。
- ST_SRID は、ジオメトリの空間参照 ID を返します。
たとえば、次のクエリはアメリカ合衆国の各州の名前と面積を返します。
SELECT name, st_area(geometry)
FROM us_states
ORDER BY name;
ST_LineString、ST_MultiLineString、ST_MultiPoint、ST_MultiPolygon、ST_Point、および ST_Polygon はどれも ST_Geometry のサブタイプ (サブクラス) です。 ST_Geometry とそのサブタイプは、同じ属性と関数を共有します。 ST_LineString、ST_MultiLineString、ST_MultiPoint、ST_MultiPolygon、ST_Point、および ST_Polygon のコンストラクターの定義は同じです。 コンストラクターの名前は、生成するタイプの名前と同じです。
ST_Geometry スキーマ定義
PostgreSQL 関数、テーブル、ビューの空間タイプは、SDE スキーマに格納されます。 スキーマ定義は、タイプ列/テーブル、空間インデックス、空間参照情報を定義するために使用されるシステム テーブルのベース テーブルの説明です。
テーブルは、sde_geometry_columns と sde_coordinate_systems です。 ビューは、st_geometry_columns と st_spatial_references で、これらのテーブルに基づきます。
詳細:
システム テーブル、ビュー、および関数の他に、次のデータベース オブジェクトが ST_Geometry 情報を保持するために使用されます。
- sde ログイン ロール
- データベース内の sde スキーマ
- ST_Geometry トリガー: sde_coord_sys_def_insert_tg
- ST_Geometry ドメイン:
- st_geomcollection
- st_linestring
- st_multilinestring
- st_multipoint
- st_multipolygon
- st_point
- st_polygon
ArcGIS を使用した ST_Geometry 格納を持つフィーチャクラスの作成
ArcGIS でフィーチャクラスを作成するときに、格納タイプを選択します。
ArcGIS で ST_GEOMETRY 格納を使用するフィーチャクラスを作成すると、フィーチャクラスの空間データを格納する ST_Geometry タイプの列を持つビジネス テーブルが作成されます。
データベース内
デフォルトでは、ST_Geometry 空間タイプは PostgreSQL データベースで作成したフィーチャクラスに使用されます。 PostGIS 空間タイプを使用するには、ArcGIS クライアントを使用してフィーチャクラスを作成するときに異なるキーワードを指定する必要があります。 詳細については、「フィーチャクラスの作成」をご参照ください。
ジオデータベース内
フィーチャクラスの格納情報は、システム テーブルのコンフィグレーション キーワード設定によって制御されます。 コンフィグレーション キーワードは、ArcGIS でフィーチャクラスを作成するときに指定します。 DEFAULTS コンフィグレーション キーワードにより、GEOMETRY_STORAGE パラメーターが ST_Geometry (ジオデータベースを作成して ST_Geometry を使用する場合) または PG_Geometry (ジオデータベースを作成して PostGIS 空間タイプを使用する場合) のいずれかに設定されます。
DEFAULTS GEOMETRY_STORAGE パラメーターを、PostGIS ジオメトリまたはジオグラフィ データ タイプを使用するが、一部のフィーチャクラスは ST_Geometry データ タイプを使用して作成するように設定する場合、ジオデータベース管理者は ST_Geometry 格納のコンフィグレーション キーワードを作成する必要があります。 [ジオデータベース コンフィグレーション キーワードのエクスポート (Export Geodatabase Configuration Keywords)] ジオプロセシング ツール使用して、システム テーブルの内容をテキスト ファイルにエクスポートし、GEOMETRY_STORAGE を ST_GEOMETRY に設定したキーワードを追加してから、[ジオデータベース コンフィグレーション キーワードのインポート (Import Geodatabase Configuration Keywords)] ジオプロセシング ツールを使用して変更内容をインポートします。 たとえば次のようにして、システム テーブルの内容をテキスト ファイルにエクスポートし、コンフィグレーション キーワードを追加できます。
##ST_GEOMETRY GEOMETRY_STORAGE "ST_GEOMETRY" UI_TEXT "User-interface for ST_GEOMETRY keyword" END
詳細については、「コンフィグレーション キーワードの変更」をご参照ください。
キーワードを追加したら、誰でも ArcGIS でフィーチャクラスを作成するときに指定できます。
ArcGIS を使用した ST_Geometry 列を含む PostgreSQL テーブルへのアクセス
SQL を使用して ST_Geometry を持つテーブルを作成した場合、SQL、他社製カスタム アプリケーション、および ArcGIS を使ってデータにアクセスできます。 ArcGIS からデータベースに接続すると、表示、分析の他、ST_Geometry 列を含むテーブルにデータを読み込んだりすることができます。 これを行うには、次の条件を満たしている必要があります。
- テーブルに ST_Geometry 列が 1 つだけ含まれている。
- テーブルに他のユーザー定義タイプの列が存在していない。
- テーブルに複数タイプのジオメトリ (ポイント、ライン、ポリゴン) が格納されている場合、どのジオメトリ タイプを表示するか指定する必要があります。ArcGIS で一度に表示できるタイプは 1 つだけです。
- テーブルのすべてのレコードが同じ空間参照を使用している。
SQL を使用してジオデータベースにテーブルを作成した場合、ジオデータベースの機能 (レプリケーション、ネットワーク、リレーションシップ クラス、トポロジなど) を使用したり、ArcGIS 内のテーブルを編集する場合に、ジオデータベースにテーブルを登録できます。 テーブルをジオデータベースで登録するには、次の条件を満たす必要があります。
- テーブルは登録するユーザーが所有している。
- テーブルに ST_Geometry 列が 1 つ含まれている。
- テーブルに他のユーザー定義タイプの列が存在していない。
- ジオメトリが 1 種類しかない (ポイント、ライン、またはポリゴン)。
- テーブルのすべてのレコードが同じ空間参照を使用している。
- また、Object ID として使用できる整数の、一意な NOT NULL 列も必要です。
ST_Geometry 列の登録
SQL を使用して ST_Geometry 列を持つテーブルを作成した場合、特定の空間参照と次元を使用するための列を登録できます。 この方法を使えば、SQL を使用してレコードを挿入するときに、別の空間参照を使用しているレコードを誤って挿入することはありません。 これを行うには、sde.st_register_spatial_column 関数を使用します。 この関数の構文は次のとおりです。
SELECT st_register_spatial_column('<database_name>', '<schema_name>',
'<table_name>', '<spatial_column_name>', <srid>, <coordinate_dimension>)
指定する SRID は public.sde_spatial_references テーブル内に存在する必要があります。 座標ディメンションは、データが単なる X、Y 座標 (2) か、X、Y、Z 座標 (3) か、X、Y、Z、M 座標 (4) か、X、Y、M 座標 (5) かを示します。 デフォルトでは、座標ディメンションを指定しない場合、データは単なる X、Y ディメンションとして登録されます。
次の例では、データベース mycitydb の sasha スキーマ内の blocks テーブルの shape 列が、4236 の SRID を使用し、3 次元の座標のみを格納するよう登録されています。
SELECT st_register_spatial_column(
'mycitydb', 'sasha', 'blocks', 'shape', 4236, 3);
これによって空間列のレコードがジオデータベースまたはデータベースの public.sde_geometry_columns テーブルに追加されます。
空間列が空で、特定の SRID および次元に登録されている場合は、登録を解除して SRID または次元を変更してから、別の値に再度登録することができます。 st_unregister_spatial_column() 関数を実行すれば、空間列の登録を解除できます。 この関数を使用すると、public.sde_geometry_columns システム テーブルから空間列が削除されるため、その空間列は他の空間参照系との関連性がなくなります。 この関数の構文は次のとおりです。
SELECT st_unregister_spatial_column(
'<database_name>', '<schema_name>',
'<table_name>', '<column_name>')
st_isregistered_spatial_column 関数を実行すると、空間列が登録されているかどうかを確認できます。 この関数の構文は次のとおりです。
SELECT st_isregistered_spatial_column(
'<database_name>', '<schema_name>',
'<table_name>', '<column_name>', <srid>)
空間列が指定された SRID に登録されている場合は 1 が返されます。登録されていない場合は、0 が返されます。
テーブルが登録されている次元を確認するには、st_get_coord_dimension 関数を使用します。 st_get_coord_dimension 関数の構文は次のとおりです。
SELECT st_get_coord_dimension(
'<schema_name>', '<table_name>', '<column_name>', <srid>)
この例では、blocks テーブルが 3 次元として登録されているため、st_get_coord_dimension は xyz を返します。
SELECT st_get_coord_dimension(
'sasha', 'blocks', 'shape', 4236);
st_get_coord_dimension
---------------------------
xyz