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 のジオデータベースで作成されたデータに他のアプリケーションからアクセスできます。
このトピックでは、以下の内容について説明します。
- PostgreSQL の ArcSDE ジオデータベースで使用される空間タイプのアーキテクチャ
- ST_Geometry 格納を使用するフィーチャクラスの格納方法
- sde_coordinate_system テーブルのレコード
- 関連ドキュメント
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 |
空間列に格納されるジオメトリック フィーチャのタイプ(ラインストリング、マルチラインストリング、マルチポイント、マルチポリゴン、ポイント、ポリゴン)。この値は 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 つ受け取り、要求されたプロパティ値を数値として返します。
- ST_Area メンバ関数: ジオメトリの面積を返します。
- ST_Len: ジオメトリの長さを返します。
- 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 格納によるフィーチャクラスの作成
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 に登録できます。
- テーブルは登録するユーザが所有している。
- ST_Geometry 列が 1 つだけ含まれている。
- 他にユーザ定義タイプの列が含まれていない。
- ジオメトリが 1 種類である(ポイント、ライン、またはポリゴン)。ただし、ジオメトリはマルチパート(マルチポイント、マルチラインストリング、マルチポリゴン)でもよい。
- テーブルのすべてのレコードが同じ空間参照を使用している。
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>)
SELECT st_register_spatial_column( 'mycitydb', 'sasha', 'blocks', 'shape', 4)
- st_unregister_spatial_column() 関数を実行すれば、空間列の登録を解除できます。この関数は、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>)
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 を使用する際のチュートリアルなどがあります
- ユーザ グループ
PostgreSQL のユーザ グループは世界各国に多数存在します。一部のユーザ グループをまとめたリストについては、http://pugs.postgresql.org/ をご参照ください。
- ケース スタディ
PostgreSQL を使用するサイトのケース スタディへのリンクについては、http://www.postgresql.org/about/casestudies/ をご参照ください。
- ウィークリー ニュース
PostgreSQLに関連する新製品や情報をお知らせするコミュニティ ニュースレターを毎週 http://www.postgresql.org/community/weeklynews/ に掲載していますので、ご参照ください。