PostgreSQL の ST_Geometry 格納

ArcSDE for PostgreSQL は、ジオデータベースへの ISO/OGC 準拠の SQL アクセスを可能にするジオメトリ格納タイプをサポートしています。これらの格納タイプは ST_Geometry および PostGIS ジオメトリです。これにより、地理フィーチャを表すオブジェクト(ポイント、ライン、ポリゴン)の格納領域が提供され、PostgreSQL データベースの機能が拡張されます。また、他のタイプのビジネス データと空間データの統合も可能になるため、マルチユーザ データベースでの解析やデータ作成にジオグラフィック コンポーネントを追加できるようになります。空間データを他のビジネス オブジェクトと一緒に保管すると、管理しなければならないデータ格納リソースが少なくなるので、データのマルチユーザ アクセス、管理、セキュリティも容易になります。

デフォルトでは、PostgreSQL の ArcSDE ジオデータベースでは、ST_Geometry 空間タイプが使用されます。ユーザ定義データ タイプ(UDT)の SQL 3 Specification を実装しているので、旧跡の場所、道路、土地区画といった空間データを格納できる列を作成することができます。ST_Geometry 空間タイプの説明については、「ST_Geometry 格納タイプとは」をご参照ください。

PostgreSQL のジオデータベースで ST_Geometry 空間タイプを使用すれば、ISO SQL/MM 空間規格と OGC の Simple Feature Specification を実装している SQL 関数を通じて空間データにアクセスできます。他のタイプのデータと同様に、SQL コマンドを使用して空間フィーチャを格納、取得、操作できます。さまざまな標準ベースの関数と SQL コマンドおよびストアド プロシージャを使用して、空間データを取得および解析できます。データへの SQL アクセスを利用できるため、PostgreSQL のジオデータベースで作成されたデータに他のアプリケーションからアクセスできます。

このトピックでは、以下の内容について説明します。

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

空間列に格納されるジオメトリック フィーチャのタイプ(ラインストリング、マルチラインストリング、マルチポイント、マルチポリゴン、ポイント、ポリゴン)。この値は st_geom_util ストアド プロシージャから得られるビット マスクです。

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 値

面積

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 格納によるフィーチャクラスの作成

ArcSDE for PostgreSQL を最初にインストールした際には、ArcGIS Desktop または sdelayer コマンドによってフィーチャクラスを作成する場合のデフォルトのジオメトリ格納タイプが ST_Geometry になっています。ArcSDE 格納のデフォルト設定は、DEFAULTS コンフィグレーション キーワードの GEOMETRY_STORAGE パラメータによって sde_dbtune テーブルに定義されます。DEFAULTS キーワードの GEOMETRY_STORAGE パラメータ値を変更しなければ、GEOMETRY_STORAGE が PG_GEOMETRY に設定されている別のコンフィグレーション キーワードを指定しない限り、すべてのフィーチャクラスが ST_Geometry 格納を使用して作成されます。

DEFAULTS の GEOMETRY_STORAGE パラメータを PG_GEOMETRY(PostGIS で使用される空間タイプ)に変更した場合は、ST_Geometry 格納を使用するために新たなコンフィグレーション キーワードを作成できます。たとえば、次に示すコンフィグレーション キーワードを作成できます。

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

END

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

PostGIS 格納タイプと ST_Geometry 格納タイプは、同じデータベースで組み合わせて使用できます。デフォルトのジオメトリ格納タイプは 1 つだけですが、個々のテーブルを異なるジオメトリ格納タイプで作成することができます。このため、デフォルトの GEOMETRY_STORAGE を PG_GEOMETRY に変更した場合でも、前述したようなキーワードを作成して指定することで、ST_Geometry 格納タイプを使用して一部のフィーチャクラスを作成できます。

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

ST_Geometry 列を持つ既存の PostgreSQL テーブルの使用

SQL を使用して ST_Geometry 列を持つテーブルを作成する場合、次の条件を満たしていれば、そのテーブルを ArcSDE に登録できます。

RowID として使用できる整数の一意な NOT NULL 列も必要です。この列は、ArcSDE への登録前または登録の際にテーブルに追加することができます。

また、テーブルには空間インデックスも必要です。この空間インデックスは、ArcSDE へのテーブルの登録前または登録後に SQL を使用して追加できます。

ST_Geometry 列を持つテーブルの作成

次の例では、shape という ST_Geometry 列を持つ、blocks というテーブルが SQL を使用して作成されます。

CREATE TABLE sasha.blocks 
(objectid integer NOT NULL, block varchar(4), res smallint, shape st_geometry)
WITHOUT OIDS;

テーブルの空間インデックスの作成

ArcSDE for PostgreSQL では、GiST(Generalized Search Tree)インデックスが使用されます。CREATE INDEX ステートメントを gist アクセス メソッドおよび st_geometry_ops 演算子クラスとともに使用して、テーブルの ST_Geometry 列にインデックスを作成します。たとえば、次のような場合です。

CREATE INDEX blockssp_idx ON blocks
USING gist(zone st_geometry_ops);

ArcSDE へのテーブルの登録

ST_Geometry 列を持つテーブルとその空間インデックスを作成したら、sdelayer -o register コマンドを使用してテーブルを ArcSDE に登録します。テーブルを ArcSDE に登録すると、そのテーブルに対するレコードが sde_layers、sde_table_registry、および sde_geometry_columns システム テーブルに追加されます。sde_column_registry システム テーブルには、テーブルの各列に対するレコードも追加されます。

sdelayer –o register –l blocks,shape 
–e a –C objectid,SDE –R 5 –t ST_GEOMETRY – s myserver
–i sde:postgresql:myserver –D mycitydb –u sasha –p super1

テーブルに大量のレコードが含まれる場合は、RowID 列をユーザ管理として登録した方が登録に時間がかからない場合があります。

sdelayer –o register –l blocks,shape 
–e a –C objectid,USER –t ST_GEOMETRY –s myserver 
–i sde:postgresql:myserver –D mycitydb –u sasha –p super1

ただし、フィーチャ ID 列をユーザ管理として登録してからフィーチャクラスをジオデータベースで登録すると、ArcGIS でフィーチャ ID 列の object_ID がさらに追加されます。ArcGIS はこの列の値を自動的に管理します。テーブルに大量のレコードが含まれる場合は、この object_ID 列の追加に時間がかかることがあります。

st_register_spatial_column 関数を使用して、空間列を登録してテーブルの空間参照 ID(SRID)を指定している場合は、sdelayer コマンドで SRID を指定する必要がありません。ただし、SRID をテーブルにまだ割り当てていない場合は、次の例のように有効な SRID を -R オプションで指定する必要があります。

sdelayer –o register –l infestations,site 
–e p+ –C siteid,SDE –s myserver –t ST_GEOMETRY –R 3 
–i sde:postgresql:myserver –D meddb –u blorca –p it.s.me

このトピックで前述したとおり、必要な空間参照が sde_spatial_references テーブルに存在しない場合は、同じ空間参照を使用する空のフィーチャクラスを ArcCatalog で作成してから、sde_spatial_references テーブルにクエリを実行してそのフィーチャクラスに割り当てられた SRID を確認します。この SRID が、同じ座標参照系で他の空間テーブルを登録する際に使用する数値になります。

st_register_spatial_column 関数を使用して空間列を SRID に登録していない場合で、かつ ArcSDE にテーブルを登録する際に -R オプションで SRID を指定していない場合は、最初のレコードの SRID が使用されます。st_register_spatial_column 関数を使用して空間列を SRID に登録していない場合でテーブルが空のときは、SRID 0 が使用されます。SRID 0 の使用はサンプルやドキュメントのみに限られているため、運用データには使用しないでください。この SRID の仕様は次のとおりです。

falsex

- 400

falsey

- 400

xyunits

1000000000

falsez

- 100000

zunits

10000

falsem

- 100000

munits

10000

xycluster_tol

0.000000008983153

zcluster_tol

.001

mcluster_tol

.001

srtext

GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]], PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]

cs_id

4326

organization

EPSG

sdelayer コマンドの全構文と詳細については、『ArcSDE コマンド リファレンス』をご参照ください。

sdelayer コマンドでは、ArcSDE システム テーブルへのテーブルの追加だけが実行されます。トポロジ、バージョニング、ネットワークなどの ArcGIS Desktop ジオデータベースの機能を使用可能にするには、テーブルをジオデータベースにも登録する必要があります。詳細については、「ジオデータベースへのテーブルの登録」および「空間列を含むサードパーティ テーブルの登録」をご参照ください。

ヒント

  • sde.st_register_spatial_column 関数を実行すると、ST_Geometry 列を持つテーブルで空間列を登録できます。この操作によってテーブルに SRID が割り当てられるため、ユーザがデータを SQL で挿入する際に他の SRID を指定してしまうことがなくなります。
    SELECT st_register_spatial_column( '<database_name>', 
    '<schema_name>', '<table_name>', '<spatial_column_name>', <srid>)
    blocks テーブルの shape 列を登録し、その列に SRID を割り当てるには、次のステートメントを実行します。
    SELECT st_register_spatial_column(
    'mycitydb', 'sasha', 'blocks', 'shape', 4)
    これによって空間列がジオデータベースの sde_geometry_columns テーブルに追加されます。指定した SRID(前述の例では 4)が sde_spatial_references テーブルに存在している必要があります。必要な空間参照が sde_spatial_references テーブルにない場合は、ArcCatalog を開いて、ジオデータベースに接続し、必要な空間参照系と ST_Geometry 格納を使用する新規のフィーチャクラスを作成します。この操作を実行すると、必要な空間参照が sde_spatial_references テーブルに挿入され、ArcCatalog ではユーザのための x、y、z および m のオフセットと単位、レイヤ範囲が計算されます。SQL を使用して空間参照を挿入することもできますが、この場合は正確な x、y、z および m のオフセットと単位を自分で計算する必要があります。ただし、sdelayer コマンドを使用してテーブルを ArcSDE に登録するには、ST_Geometry 列の登録を解除する必要があるので注意してください。たとえば、あるユーザがテーブルを作成し、他のユーザが SQL を使用してテーブルへの挿入を実行するとします。この場合は、単一の SRID しか使用できないようにするために、望ましい SRID を ST_Geometry 列に登録することができます。そのうえで、テーブルを ArcSDE に登録するときに、st_unregister_spatial_column 関数を実行します。(次のヒントをご参照ください。)
  • st_unregister_spatial_column() 関数を実行すれば、空間列の登録を解除できます。この関数は、sde_geometry_columns システム テーブルから空間列を削除することで空間列の登録を解除するため、空間列はすべての空間参照系との関連を失います。
    SELECT st_unregister_spatial_column(
    '<database_name>', '<schema_name>',
     '<table_name>', '<column_name>')
    この処理は、テーブルを ArcSDE に登録する前に実行するか、空の空間列を別の SRID に登録する場合に実行します。空間列の登録解除後には、st_register_spatial_column 関数で別の SRID に再登録することができます。
  • st_isregistered_spatial_column 関数を実行すると、空間列が登録されているかどうかを確認できます。
    SELECT st_isregistered_spatial_column(
    '<database_name>', '<schema_name>',
     '<table_name>', '<column_name>', <srid>) 
    空間列が登録されていると 1 が返され、登録されていないと 0 が返されます。

sde_coordinate_systems テーブルのレコード

SDE スキーマの sde_coordinate_systems テーブルには、データベースで使用される座標系の ID と定義が格納されます。このテーブルには、ジオデータベースを作成したときに、すべての座標系情報が設定されます。

このテーブルの座標系は、ArcGIS Desktop または SQL で作成したフィーチャクラスに使用できます。

フィーチャクラスには座標系を割り当てるだけではなく、空間参照を作成する必要があります。ArcGIS Desktop では、フィーチャクラスの作成の一環でこの処理が実行されます。SQL を使用した空間参照の作成については、「ST_Geometry 列を持つテーブルでの空間インデックスの作成」をご参照ください。

PostgreSQL ドキュメントの入手先

PostgreSQL のドキュメントについては、PostgreSQL の Web サイト: http://www.postgresql.jp/document/ をご参照ください。このドキュメントの内容としては、PostgreSQL のインストールおよび管理の概要、SQL コマンドとプログラミング、PostgreSQL を使用する際のチュートリアルなどがあります


7/10/2012