PostgreSQL の ST_Geometry

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

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

PostgreSQL で ST_Geometry タイプを使用する方法の詳細については、次のトピックに記載されています。

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

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

名前順種類説明

サイズ

LONG INTEGER

シェープ バッファーを含む ST_Geometry 構造の全長

srid

LONG INTEGER

sde_spatial_references テーブルの関連する空間参照 (座標系) レコードにリンクされるジオメトリの識別子が含まれる。

numpts

LONG INTEGER

ジオメトリを定義するポイントの数 (マルチパート ジオメトリの場合は、各パート間のセパレーターも含まれます。各セパレーターにつき 1 ポイントとなります)

entity

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 値

area

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: ジオメトリの空間参照識別子を返します。

たとえば、次のクエリはアメリカ合衆国の各州の名前と面積を返します。

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 Desktop でフィーチャクラスを作成するときに、格納タイプを選択します。

ArcGIS で ST_GEOMETRY 格納を使用するフィーチャクラスを作成すると、フィーチャクラスの空間データを格納する ST_Geometry タイプの列を持つビジネス テーブルが作成されます。

データベース内

ArcGIS でフィーチャクラスを作成するときに使用する空間データ タイプを指定します。

ジオデータベース内

フィーチャクラスの格納情報は、sde_dbtune テーブルのコンフィグレーション キーワード設定によって制御されます。コンフィグレーション キーワードは、ArcGIS でフィーチャクラスを作成するときに指定します。DEFAULTS コンフィグレーション キーワードにより、ジオデータベースを作成するときに、GEOMETRY_STORAGE パラメーターが ST_Geometry に設定されます。すべてまたは大部分の空間データを ST_Geometry タイプを使用して格納する場合、DEFAULTS キーワードの GEOMETRY_COLUMNS パラメーター値を変更しないでください。ArcGIS からフィーチャクラスを作成するときに、DEFAULTS キーワードを指定します。

DEFAULTS GEOMETRY_STORAGE パラメーターを変更して、PostGIS ジオメトリまたはジオグラフィ データ タイプを使用するが、一部のフィーチャクラスは ST_Geometry データ タイプを使用して作成する場合は、ST_Geometry 格納の新しいコンフィグレーション キーワードを作成できます。[ジオデータベース コンフィグレーション キーワードのエクスポート (Export Geodatabase Configuration Keywords)] ジオプロセシング ツール使用して、sde_dbtune テーブルの内容をテキスト ファイルにエクスポートし、GEOMETRY_STORAGE を ST_GEOMETRY に設定したキーワードを追加してから、[ジオデータベース コンフィグレーション キーワードのインポート (Import Geodatabase Configuration Keywords)] ジオプロセシング ツールを使用して変更内容をインポートします。たとえば次のようにして、sde_dbtune テーブルをエクスポートし、コンフィグレーション キーワードを追加できます。

##ST_GEOMETRY
GEOMETRY_STORAGE    "ST_GEOMETRY"
UI_TEXT   "User-interface for ST_GEOMETRY keyword"
END

キーワードを追加したら、ArcGIS でフィーチャクラスを作成するときに指定して、新しいフィーチャクラスで ST_Geometry 格納を使用できます。

ArcGIS を使用した ST_Geometry 列を含む PostgreSQL テーブルへのアクセス

SQL を使用して ST_Geometry を持つテーブルを作成した場合、SQL、他社製カスタム アプリケーション、および ArcGIS を使ってデータにアクセスできます。ArcGIS からデータベースに接続すると、表示、分析の他、ST_Geometry 列を含むテーブルにデータを読み込んだりすることができます。これを行うには、次の条件を満たしている必要があります。

  • テーブルに ST_Geometry 列が 1 つだけ含まれている。
  • テーブルに他のユーザー定義タイプの列が存在していない。
  • テーブルに複数タイプのジオメトリ (ポイント、ライン、ポリゴン) が格納されている場合、どのジオメトリ タイプを表示するか指定する必要があります。ArcGIS で一度に表示できるタイプは 1 つだけです。
  • テーブルのすべてのレコードが同じ空間参照を使用している。

SQL を使用してジオデータベースにテーブルを作成した場合、ジオデータベースの機能 (レプリケーション、ネットワーク、リレーションシップ クラス、トポロジなど) を使用したり、ArcGIS 内のテーブルを編集する場合に、ジオデータベースにテーブルを登録できます。 テーブルをジオデータベースで登録するには、次の条件を満たす必要があります。

  • テーブルは登録するユーザーが所有している。
  • ST_Geometry 列が 1 つだけ含まれている。
  • 他にユーザー定義タイプの列が含まれていない。
  • ジオメトリが 1 種類しかない (ポイント、ライン、またはポリゴン)。
  • テーブルのすべてのレコードが同じ空間参照を使用している。
  • また、ObjectID として使用できる整数の一意な 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