PostgreSQL の ST_Geometry 格納

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

デフォルトでは、PostgreSQL のジオデータベースでは、ST_Geometry 空間タイプが使用されます。PostgreSQL データベースに ST_Geometry をインストールすることもできます。PostgreSQL データベースに ST_Geometry をインストールする方法については、「PostgreSQL データベースへの ST_Geometry タイプの追加」をご参照ください。

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

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

PostGIS ジオメトリ タイプの詳細については、「PostGIS ジオメトリ タイプとは」をご参照ください。

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

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

名前

タイプ

説明

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 の types テーブルと metadata テーブルの空間タイプは、SDE スキーマに格納されます。スキーマ定義は、タイプ列/テーブル、空間インデックス、空間参照情報を定義するために使用されるメタデータ テーブルのベース テーブルの説明です。

各テーブルの詳細については、「PostgreSQL に格納されたジオデータベースのシステム テーブル」をご参照ください。テーブルには、st_coordinate_systems、st_units_of_measure、sde_geometry_columns、sde_spatial_references、および sde_coordinate_system があります。

ArcGIS を使用した ST_Geometry 格納によるフィーチャクラスの作成

ArcGIS for Desktop でフィーチャクラスを作成するときに、格納タイプを選択します。

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

データベースに接続し、空間列のタイプとして ST_Geometry を使用する場合、空間テーブルの作成時に ST_Geometry を選択します。データベースへのテーブル作成に関する情報は、「ArcGIS での空間データベース テーブルの作成」をご参照ください。

ジオデータベースに接続する場合、使用するコンフィグレーション キーワードを選択して格納タイプを指定します。デフォルトの格納設定は、DEFAULTS コンフィグレーション キーワードの GEOMETRY_STORAGE パラメータによって sde_dbtune テーブルに定義されます。DEFAULTS キーワードの GEOMETRY_STORAGE パラメータ値を変更しない場合、フィーチャクラスの作成時に、GEOMETRY_STORAGE が PG_GEOMETRY に設定されている別のコンフィグレーション キーワードを指定しない限り、すべてのフィーチャクラスが ST_Geometry 格納を使用して作成されます。

DEFAULTS キーワードの GEOMETRY_STORAGE パラメータを変更して PostGIS ジオメトリを使用するようにした場合でも、ST_Geometry 格納を使用するフィーチャクラスを作成できます。これを行うには、sde_dbtune テーブルの ST_Geometry 格納に新しいコンフィグレーション キーワードを作成します。たとえば、次に示すコンフィグレーション キーワードを作成できます。

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

END

そして、ArcGIS でフィーチャクラスを作成するときに、そのキーワードを選択すると、新しいフィーチャクラスには ST_Geometry 格納が使用されます。

ヒントヒント:

sdedbtune コマンドを使用すると、sde_dbtune テーブルの値を変更または追加できます。詳細については、「DBTUNE テーブルの内容の変更」をご参照ください。

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
9/14/2013