ST_Geometry 空間データ タイプは、ジオデータベースを含む PostgreSQL データベースと、ジオデータベースを含まない PostgreSQL データベースで使用できます。ST_Geometry データ タイプを使用すると、他のタイプのビジネス データと空間データの統合も可能になるため、マルチユーザー データベースでの解析やデータ作成にジオグラフィック コンポーネントを追加できるようになります。空間データを他のビジネス オブジェクトと一緒に保管すると、管理するデータ格納リソースが少なくなるので、データのマルチユーザー アクセス、管理、セキュリティも容易になります。
PostgreSQL のジオデータベースでは、デフォルトで ST_Geometry 空間タイプが使用されますが、ジオデータベースを作成する前に、st_geometry ライブラリを PostgreSQL のインストールにコピーする必要があります。手順については、「PostgreSQL でのジオデータベースの作成 (Windows)」または「PostgreSQL でのジオデータベースの作成 (Linux)」をご参照ください。ジオデータベースを含まない 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 の説明を示します。
名前 | タイプ | 説明 |
---|---|---|
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 で、これらのテーブルに基づきます。
ArcGIS を使用した ST_Geometry 格納を持つフィーチャクラスの作成
ArcGIS Desktop でフィーチャクラスを作成するときに、格納タイプを選択します。
ArcGIS で ST_GEOMETRY 格納を使用するフィーチャクラスを作成すると、フィーチャクラスの空間データを格納する ST_Geometry タイプの列を持つビジネス テーブルが作成されます。
データベース内
ArcGIS でフィーチャクラスを作成するときに使用する空間データ タイプを指定します。詳細については、「ArcMap のデータベースでのフィーチャクラスの作成」をご参照ください。
ジオデータベース内
フィーチャクラスの格納情報は、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
詳細については、「コンフィグレーション キーワードの変更」をご参照ください。
キーワードを追加したら、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