PostgreSQL の ST_Geometry 格納

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

デフォルトでは、PostgreSQL のジオデータベースは、ST_Geometry 空間タイプを使用するように設定されています。ただし、構成する必要があります。概要については、「PostgreSQL でのジオデータベースの設定」をご参照ください。ジオデータベースを含まない PostgreSQL データベースを使用する場合、ST_Geometry タイプをインストールできます。PostgreSQL データベースに ST_Geometry タイプをインストールする方法については、「PostgreSQL データベースへの ST_Geometry タイプの追加」をご参照ください。

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

ST_Geometry 格納を使用するテーブルを SQL で操作する方法については、以下のトピックをご参照ください。

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

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

名前

Type

説明

size

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

ジオメトリの外周の長さ

shape

BYTEA

Esri 圧縮シェープ

他のオブジェクト タイプと同様に、ST_Geometry データ タイプにはコンストラクタ メソッドと関数が含まれます。コンストラクタ メソッドは、データ タイプの新しいインスタンス(オブジェクト)を返し、その属性値を設定します。

コンストラクタの名前はタイプと同じ(ST_Geometry)です。次の例に示すように、ST_Geometry タイプのオブジェクトをインスタンス化する際には、コンストラクタ メソッドを呼び出します。

CREATE TABLE hazardous_sites (name varchar(128),
              location st_geometry);

次に示す ST_Geometry へのアクセス用の関数は、入力として ST_Geometry を 1 つ受け取り、要求されたプロパティ値を数値として返します。

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

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 のコンストラクタの定義は同じです。コンストラクタの名前は、生成するタイプの名前と同じです。

メタデータ スキーマ

PostgreSQL 関数、テーブル、ビューの空間タイプは、SDE スキーマに格納されます。スキーマ定義は、タイプ列/テーブル、空間インデックス、空間参照情報を定義するために使用されるメタデータ テーブルのベース テーブルの説明です。

各テーブルおよびビューの詳細については、「PostgreSQL に格納されたジオデータベースのシステム テーブル」をご参照ください。テーブルは、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 for Desktop でフィーチャクラスを作成するときに、格納タイプを選択します。

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

データベース内

ArcGIS でフィーチャクラスを作成するときに使用する空間データ タイプを指定します。詳細については、「ArcGIS での空間データベースの作成」をご参照ください。

ジオデータベース内

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

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

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

詳細については、「sde_dbtune テーブルの内容の変更」をご参照ください。

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

ST_Geometry 列を持つ PostgreSQL テーブルへのアクセス

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

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

空間列の登録

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
5/10/2014