名前

<-> — 2つのポイントの間の距離を返します。ポイントでは、ポイントは単精度(元となるポイントジオメトリが倍精度ですが)を使って調べます。他のジオメトリタイプでは、バウンディングボックスの重心どうしの距離を返します。KNN GiST機能を使った距離による並べ替えや近傍の制限に使えます。

概要

double precision <->( geometry A , geometry B );

説明

<->演算子はポイント(単精度)の空間インデクスから読まれた2ポイント間の距離を返します。他のジオメトリについては、ジオメトリのバウンディングボックスの重心からの距離を返します。近傍の概ねの距離による並べ替えに使えます。

[注記]

これの被演算子はジオメトリで利用できるインデクスを使用します。他の演算子との相違点は、ORDER BY節でのみインデクスが使用される点です。

[注記]

ジオメトリのひとつが定数(副問い合わせ/共通テーブル式にない)となる(a.geomでなく'SRID=3005;POINT(1011102 450541)'::geometry等となる)場合には、インデクスが有効になるだけです。

実際の生きた例についてはOpenGeo workshop: Nearest-Neighbour Searchingを参照して下さい。

初出: 2.0.0 PostgreSQL 9.1以上でのみ有効です。

SELECT ST_Distance(geom, 'SRID=3005;POINT(1011102 450541)'::geometry) as d,edabbr, vaabbr 
FROM va2005 
ORDER BY d limit 10;

        d         | edabbr | vaabbr
------------------+--------+--------
                0 | ALQ    | 128
 5541.57712511724 | ALQ    | 129A
 5579.67450712005 | ALQ    | 001
  6083.4207708641 | ALQ    | 131
  7691.2205404848 | ALQ    | 003
 7900.75451037313 | ALQ    | 122
 8694.20710669982 | ALQ    | 129B
 9564.24289057111 | ALQ    | 130
  12089.665931705 | ALQ    | 127
 18472.5531479404 | ALQ    | 002
(10 rows)

KNNの答えは次のようになります。

SELECT st_distance(geom, 'SRID=3005;POINT(1011102 450541)'::geometry) as d,edabbr, vaabbr 
FROM va2005 
ORDER BY geom <-> 'SRID=3005;POINT(1011102 450541)'::geometry limit 10;

        d         | edabbr | vaabbr
------------------+--------+--------
                0 | ALQ    | 128
 5579.67450712005 | ALQ    | 001
 5541.57712511724 | ALQ    | 129A
 8694.20710669982 | ALQ    | 129B
 9564.24289057111 | ALQ    | 130
  6083.4207708641 | ALQ    | 131
  12089.665931705 | ALQ    | 127
  24795.264503022 | ALQ    | 124
 24587.6584922302 | ALQ    | 123
 26764.2555463114 | ALQ    | 125
(10 rows)

実際の距離との順序が違い、実際に表示される上位10行が違うことに注意して下さい。

最終的なハイブリッドのクエリは次の通りです。

WITH index_query AS (
  SELECT ST_Distance(geom, 'SRID=3005;POINT(1011102 450541)'::geometry) as d,edabbr, vaabbr
          FROM va2005
  ORDER BY geom <-> 'SRID=3005;POINT(1011102 450541)'::geometry LIMIT 100) 
  SELECT * 
          FROM index_query 
  ORDER BY d limit 10;

        d         | edabbr | vaabbr
------------------+--------+--------
                0 | ALQ    | 128
 5541.57712511724 | ALQ    | 129A
 5579.67450712005 | ALQ    | 001
  6083.4207708641 | ALQ    | 131
  7691.2205404848 | ALQ    | 003
 7900.75451037313 | ALQ    | 122
 8694.20710669982 | ALQ    | 129B
 9564.24289057111 | ALQ    | 130
  12089.665931705 | ALQ    | 127
 18472.5531479404 | ALQ    | 002
(10 rows)

                         

関連情報

ST_DWithin, ST_Distance, <#>