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 タイプを使用する方法の詳細については、次のトピックに記載されています。
- PostgreSQL の ST_Geometry 空間タイプのアーキテクチャ
- ST_Geometry 格納を使用する ArcGIS のフィーチャクラスの作成方法
- ST_Geometry 列を含む PostgreSQL テーブルの ArcGIS での使用
- 使用できる空間参照を制限して ST_Geometry 列を登録する方法
ST_Geometry 格納を使用するテーブルを SQL で操作する方法については、以下のトピックをご参照ください。
- ST_Geometry 列を持つテーブルの作成
- ST_Geometry 列を持つテーブルへのフィーチャの挿入
- ST_Geometry 列を持つテーブルでの検索
- SQL を使用した ST_Geometry 空間列の値の更新
- ST_Geometry 列を持つテーブルでの空間ビューの使用
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 つ受け取り、要求されたプロパティ値を数値として返します。
- 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 のコンストラクタの定義は同じです。コンストラクタの名前は、生成するタイプの名前と同じです。
メタデータ スキーマ
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 を含むテーブルにデータを読み込んだりすることができます。これを行うには、次の条件を満たしている必要があります。
- テーブルに ST_Geometry 列が 1 つだけ含まれている。
- テーブルに他のユーザ定義タイプの列が存在していない。
- テーブルに複数タイプのジオメトリ(ポイント、ライン、ポリゴン)が格納されている場合、どのジオメトリ タイプを表示するか指定する必要があります。ArcGIS で一度に表示できるタイプは 1 つだけです。
- テーブルのすべてのレコードが同じ空間参照を使用している。
SQL を使用してジオデータベースにテーブルを作成した場合、ジオデータベースの機能(レプリケーション、ネットワーク、リレーションシップ クラス、トポロジなど)や、ArcGIS 内のテーブルを編集する場合にジオデータベースでテーブルを登録できます。テーブルをジオデータベースで登録するには、次の条件を満たす必要があります。
- テーブルは登録するユーザが所有している。
- テーブルに ST_Geometry 列が 1 つだけ含まれている。
- テーブルに他のユーザ定義タイプの列が含まれていない。
- ジオメトリが 1 種類しかない(ポイント、ライン、またはポリゴン)。
- テーブルのすべてのレコードが同じ空間参照を使用している。
- また、rowID として使用できる整数の、一意な NOT NULL 列も必要です。
空間列の登録
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