PostgreSQL の ST_Geometry 格納
PostgreSQL では、ST_Geometry と PostGIS ジオメトリの 2 種類の異なる空間格納タイプを使用できます。また、他のタイプのビジネス データと空間データの統合も可能になるため、マルチユーザ データベースでの解析やデータ作成にジオグラフィック コンポーネントを追加できるようになります。空間データを他のビジネス オブジェクトと一緒に保持すると、管理しなければならないデータ格納リソースが少なくなるので、データのマルチユーザ アクセス、管理、セキュリティも容易になります。
デフォルトでは、PostgreSQL のジオデータベースでは、ST_Geometry 空間タイプが使用されます。PostgreSQL データベースに ST_Geometry をインストールすることもできます。PostgreSQL データベースに ST_Geometry をインストールする方法については、「PostgreSQL データベースへの ST_Geometry タイプの追加」をご参照ください。
PostgreSQL で ST_Geometry タイプを使用する方法の詳細については、次のトピックに記載されています。
- PostgreSQL の空間タイプのアーキテクチャ
- ST_Geometry 格納を使用するフィーチャクラスの格納方法
- ST_Geometry 列を持つ既存の PostgreSQL テーブルの使用
- 使用できる空間参照を制限して ST_Geometry 列を登録する方法
- 関連ドキュメント
ST_Geometry 格納を使用するテーブルを SQL で操作する方法については、以下のトピックをご参照ください。
- ST_Geometry 列を持つテーブルの作成
- ST_Geometry 列を持つテーブルへのフィーチャの挿入
- ST_Geometry 列を持つテーブルでの検索
- SQL を使用した ST_Geometry 空間列の値の更新
- ST_Geometry 列を持つテーブルでの空間ビューの使用
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 つ受け取り、要求されたプロパティ値を数値として返します。
- 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 の 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 を含むテーブルにデータを読み込んだりすることができます。これを行うには、次の条件を満たしている必要があります。
- テーブルに 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