(Version 0.2.2)
概要
多次元幾何オブジェクト geometric型の仕様
行列オブジェクト matrix型の仕様
概要
| はじめに |
ここで公開している配布セットには、PostgreSQLにおいて多次元幾何データを扱えるようにするユーザ定義データ型であるgeometric型と、このgeometric型をインデックス化できるPostgreSQL 6.5用の拡張されたrtreeアクセスメソッド、および、行列を扱うmatrix型が含まれます。
ともに現在作成中でありまだ完成には程遠い内容のものですが、このようなデータ型を必要としている、あるいは、あったらいいなぁと思っている多くの方のご意見を参考にさせて頂きたいと思い、試験的に公開するものです。例によって動作の保証はできませんので、各自の責任のもとでご試用ください。
開発の方向としては、特に利用目的を特定しないで汎用的なものを目指しています。ですから特定の業務向けにあまりに高度な機能を実装する予定はありません。ですから、汎用的でかつ、データベースシステムレベルで実装しても大袈裟でない機能について要望などがありましたら、ぜひとも聞かせていただきたいと思います(連絡先は最後に)。
恐らく今後、確実に仕様は変わっていくと思います。またその際には(正式リリース前であるなら)互換性を考慮しない仕様変更もありうると思います。ですからこの試験公開バージョンを実用した場合には、今後のバージョンアップなどで問題が発生する可能性がありますことをご考慮ください。
最終的には、年内に正式に公開する予定です。ライセンススタイルは試験公開版も含めてフリー(PostgreSQL本体と同様なライセンススタイル)とします。
| 著作権について |
PostgreSQL用 多次元幾何オブジェクトと行列オブジェクトの著作権等については、配布セット内のgeometric/COPYRIGHT.euc_jpファイルかmatrix/COPYRIGHT.euc_jpを参照してください。基本的に自由に利用できます。
PostgreSQL 6.5用 拡張rtreeアクセスメソッドはオリジナルrtreeコードに対する部分的な改変となっています。よって、PostgreSQL用 多次元幾何オブジェクトと同様な内容の権利を主張するつもりはありません(なんて書き方じゃまずいでしょうね)。
| 多次元幾何オブジェクト geometric型 |
このデータ型は、多次元の幾何データを扱うPostgreSQL用のユーザ定義データ型です。複数の幾何データの種類をサポートしていますが、すべての種類をgeometric型という1つのデータ型でまとめて取り扱う仕様ですので誤解のないようにしてください。
データ型の名称は“geometric”です。以下のようにして使用します。
create table testtbl (a geometric);
create index testtblind on testtbl using rtree (a);
insert into testtbl values ('(10,20,30)');
詳しくは多次元幾何オブジェクト geometric型の仕様を参照してください。
| 行列オブジェクト matrix型 |
このデータ型は、行列を扱うPostgreSQL用のユーザ定義データ型です。
データ型の名称は“matrix”です。以下のようにして使用します。
create table testtbl (a matrix);
insert into testtbl values ('[10,20,30; 60,70,80]');
列の区切りは“,”(カンマ)で、行の区切りは“;”(セミコロン)で指定します。また、次の様な転置表現も可能です。
'[10;60, 20;70, 30;80]'
なお、1つの数値を分割しない限り任意の空白を挿入することができます。
詳しくは行列オブジェクト matrix型の仕様を参照してください。
| 拡張rtreeアクセスメソッド |
拡張rtreeアクセスメソッドとは、PostgreSQL 6.5 に搭載されているアクセスメソッドであるrtree(多次元空間検索用インデックス)を、内部データサイズが可変長のデータ型でも利用できるように変更したものです。
なお、PostgreSQL 6.5.2上でも動作することを確認しています。
オリジナルのrtreeでは内部データサイズが可変長であるデータ型を扱うことができません。rtreeのインデックスを使うことがあるデータ型には現在のところbox型やpolygon型などがありますが、これらはインデックス内のデータの格納方法を工夫することによって(polygon型であっても)すべて固定長なデータ型として扱っています。
PostgreSQLでは、利用者が独自に作成したデータ型を登録して利用する機能(ユーザ定義データ型のサポート)が提供されていますが、このようなユーザ定義データ型でもいくつかの手順を踏めば、何次元のデータであってもPostgreSQLに一切の変更をすることなしにrtreeインデックスを作成できるようになります(ダンプとリストアで多少の問題は発生しますが…)。
しかし、rtreeを利用したいと思っているユーザ定義データ型の内部データサイズを、もしも可変長として設計していた場合は、残念ながらオリジナルのrtreeでは扱えません。あるいは、あらかじめ余裕を見こんだ大きさの固定長のデータ型に設計変更する方法も考えられますが、データの特性によってはディスク領域の無駄が無視できないほどになってしまうかもしれません。
この配布セットに含まれるgeometric型は、内部データサイズを可変長として設計しています。ですから、geometric型を効率良く利用したい場合には、この拡張rtreeアクセスメソッドを利用してください。
なお、ソースファイルの一部を書きかえれば、geometric型を内部データサイズ固定長に変更することができます。こうすればオリジナルのrtreeでもgeometric型を扱えるようになりますが、ディスクの使用効率が極端に悪くなります。
手順については「geometric型を固定長にする方法」をお読みください。
| ダウンロード |
この配布セットの中には、多次元幾何オブジェクトのgeometric型と行列オブジェクトのmatrix型と、拡張rtreeアクセスメソッドが含まれています。
| インストール方法 |
ここで公開している配布セットをインストールするには、configure済みのPostgreSQLソースファイルが必要です。PostgreSQLをソースからコンパイル・インストールした後であれば、条件は満たすと思います。
最後にPostgreSQLのライブラリディレクトリにファイルをコピーしますので、PostgreSQLをインストールしたときと同じユーザでログイン(あるいはsu)してから、下記のインストール作業を行ってください。
1)
配布セットのトップディレクトリにあるMakefile.globalを、お使いの環境にあわせて書き換えます。
具体的には、最初のほうにあるSRCDIR=を、PostgreSQLのソースファイルがある場所に合わせて書きかえます。たとえばPostgreSQLの配布セットが/usr/local/src/postgresql-6.5にあったとしたら、
SRCDIR=/usr/local/src/postgresql-6.5/src
のように書き換えます。
2)
make install を実行します。
すると以下のファイルが作成されて、PostgreSQLのライブラリディレクトリ(通常は/usr/local/pgsql/lib)にコピーされます。
geometric.?.?.so geometric型のプログラム本体 geometric.sql geometric型をデータベースに登録するSQL文 matrix.?.?.so matrix型のプログラム本体 matrix.sql matrix型をデータベースに登録するSQL文 nrtree.so 拡張rtreeのプログラム本体 nrtree.sql 拡張rtreeをデータベースに登録するSQL文 ※上記の“?.?”は版数を表す数字です。
3)
geometric型やmatrix型を利用したいデータベースで、nrtree.sql と matrix.sql と geometric.sql を、この順序で実行します。
# 改良rtreeの登録 psql -f <PostgreSQLのライブラリディレクトリ>/nrtree.sql <データベース名># matrix型の登録 psql -f <PostgreSQLのライブラリディレクトリ>/matrix.sql <データベース名># geometric型の登録 psql -f <PostgreSQLのライブラリディレクトリ>/geometric.sql <データベース名>なお、同じデータベース上で2度以上、上記の登録手順を実行しないでください(再登録の手順を用意していません)。再度登録し直したい場合には、一度データベースを削除して作りなおしてから、新規に登録手順を実行してください。
安全のためgeometric型やmatrix型、改良rtreeを試用するデータベースは、運用中のデータベースではなく、CREATE DATABASE命令などで専用に新しく作成したものにしてください。なぜなら、データベースからのアンインストールの方法を特に用意していないため、アンインストールするにはDROP DATABSE命令などでデータベースを削除する以外にないからです(initdbまで行う必要はありません)。
なにしろ試験公開版ですのでご容赦ください。
| geometric型を固定長にする方法 |
オリジナルのrtreeのままでgeometric型を利用したい場合には、geometric型の内部データサイズを固定長にしなければなりません。
geometric/geo_objs.hの最初の方にある下記の行はコメントになっていますが、これを有効にすればgeometric型は固定長で動作します。
/* #define GEO_FIXED_ITEMSIZE (sizeof(geo_prim) + sizeof(double) * (GEO_MAXNDIM * (GEO_MAXNDIM + 1) - 1)) */ ↓ #define GEO_FIXED_ITEMSIZE (sizeof(geo_prim) + sizeof(double) * (GEO_MAXNDIM * (GEO_MAXNDIM + 1) - 1))
ただし、常に最大の次元数のデータを格納できるだけの内部データサイズを使用しますので、ディスクの使用効率は極端に悪くなります。
| その他のヒント |
| 要望などの連絡先 |
連絡は電子メールでのみ受け付けます。
できるだけ返事はしたいと思いますが、予想以上の反響があった場合や都合によっては返事遅れる、あるいは返事ができない場合があるかもしれません。その場合には別途議論の場(メーリングリストやウェブ上の掲示板など)などを用意することも考えますので、どうかご勘弁ください。
| 関係サイトへのリンク |
Copyright (c) 1999 InterWIZ <staff@interwiz.koganei.tokyo.jp>,
All rights reserved.
Supported by MINISTRY OF POSTS AND TELECOMMUNICATIONS (MPT) of japan
Supported by NTT Communications Corporation
Supported by KOKUSAI KOGYO CO., LTD.
インターウィズはこのプロジェクトにおいて、
郵政省のGIS技術開発プログラムの一環として活動しています。