[pgsql-jp: 37078] Re: point 型のカラムに対する INDEX の作成方法について
ITAGAKI Takahiro
itagaki.takahiro @ oss.ntt.co.jp
2006年 5月 22日 (月) 14:52:40 JST
板垣です。
haward99 @ yahoo.co.jp さんは書きました:
> point型のカラムにINDEXをはるのに苦戦しております。
> => create index testindex on test_tbl using gist (keidoido circle_ops);
> ERROR: operator class "circle_ops" does not accept data type point
「point を circle で検索したい」という機能は、どうやら無いようです。
「boxをboxで検索」「同polygon」「同circle」以外は見当たりませんでした。
GiSTの仕様的には実現できるはずなんですけどね……。
(Rtreeではできません)
正統派な方法は、GiSTの演算子クラスを自分で作ることです。
point @ circle などは既にありますので、GiSTまわりのみ必要です。
逃げ道としては、pointの代わりに半径ゼロのcircleを使うことです。
関数インデックスを使うのが良いでしょうか。
CREATE TABLE test_tbl (keidoido point);
CREATE INDEX testindex ON test_tbl
USING gist/rtree (circle(keidoido, 0));
検索のほうも、circleを使った検索になります
SELECT * FROM test_tbl WHERE circle(keidoido, 0) @ circle(...);
また、検索のときのWHEREの書き方ですが、
↑のように、絞込み条件が右辺にまとまるように書いてください。
↓の書き方ではインデックスが使われません。
> select * from test_tbl where circle(keidoido,0.02) ~
> point(139.001,35.002);
> のように、ある地点から半径xの範囲内にあるレコードを取得するようなことを
> 考えてます。
幾何データ型をちゃんと使ったことは無いので、
他に良い方法があったら教えてください。
--
板垣 貴裕
pgsql-jp メーリングリストの案内