PostgreSQL の ST_Geometry

ST_Geometry 空間データ タイプは、ジオデータベースを含む PostgreSQL データベースと、ジオデータベースを含まないデータベースで使用できます。 ST_Geometry データ タイプを使用すると、他のタイプのビジネス データと空間データの統合も可能になるため、マルチユーザー データベースでの解析やデータ作成にジオグラフィック コンポーネントを追加できるようになります。 空間データを他のビジネス オブジェクトと一緒に保管すると、管理するデータ格納リソースが少なくなるので、データのマルチユーザー アクセス、管理、セキュリティも容易になります。

PostgreSQL のジオデータベースで ST_Geometry タイプを使用するには、ジオデータベースを作成する前に、st_geometry ライブラリを PostgreSQL のインストールにコピーします。 手順については、「Windows での PostgreSQL のジオデータベースの作成」または「Linux での PostgreSQL のジオデータベースの作成」をご参照ください。 ジオデータベースを含まない PostgreSQL ジオデータベースを使用する場合、データベースに作成する空間テーブルで使用する ST_Geometry タイプをインストールできます。

PostgreSQL の ST_Geometry タイプの詳細については、以下のリンクをご参照ください。

ST_Geometry が空間データを格納する方法

次に、PostgreSQL の ST_Geometry の説明を示します。

名前タイプ説明

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