<-> — 2つのポイントの間の距離を返します。ポイントでは、ポイントは単精度(元となるポイントジオメトリが倍精度ですが)を使って調べます。他のジオメトリタイプでは、バウンディングボックスの重心どうしの距離を返します。KNN GiST機能を使った距離による並べ替えや近傍の制限に使います。
double precision <->(
geometry
A
,
geometry
B
)
;
<->
演算子はポイント(単精度)の空間インデクスから読まれた2ポイント間の距離を返します。他のジオメトリについては、ジオメトリのバウンディングボックスの重心からの距離を返します。近傍の概ねの距離による並べ替えに使います。
この演算子はジオメトリで利用できるインデクスを使用します。他の演算子との相違点は、ORDER BY節でのみインデクスが使用される点です。 |
ジオメトリのひとつが定数(副問い合わせ/共通テーブル式にない)となる(a.geomでなく'SRID=3005;POINT(1011102 450541)'::geometry等となる)場合には、インデクスが有効になるだけです。 |
初出: 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)