[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 メーリングリストの案内