<-> — Returnerar 2D-avståndet mellan A och B.
double precision <->( geometry A , geometry B );
double precision <->( geography A , geography B );
Operatorn <-> returnerar 2D-avståndet mellan två geometrier. I satsen ”ORDER BY” ger den indexassisterade resultatmängder med närmaste granne, med verklig KNN-avståndssökning för geometrier och avstånd på sfären för geografier.
|
|
|
Denna operand använder 2D GiST-index som kan finnas tillgängliga för geometrierna. Den skiljer sig från andra operatorer som använder spatiala index genom att det spatiala indexet endast används när operatorn är i ORDER BY-satsen. |
|
|
|
Indexet börjar bara gälla om en av geometrierna är en konstant (inte i en underfråga). t.ex. 'SRID=3005;POINT(1011102 450541)'::geometry istället för a.geom |
Se PostGIS workshop: Nearest-Neighbor Searching för ett detaljerat exempel.
Utökat: 2.2.0 – verkligt KNN-beteende (”K närmaste grannar”) för geometri och geografi. Observera att KNN för geografi baseras på en sfär i stället för en sfäroid.
Ändrat: 2.2.0 – äldre lösningar med hybridsyntax kan vara långsammare när verklig KNN är tillgänglig. Se exemplen nedan.
Tillgänglighet: 2.0.0 – svag KNN ger närmaste grannar baserat på avstånd mellan geometriska centroidpunkter i stället för verkliga avstånd. Exakta resultat för punkter, inexakta för alla andra typer.
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)
Sedan KNN rå svar:
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
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)
Om du kör "EXPLAIN ANALYZE" på de två frågorna skulle du se en prestandaförbättring för den andra.
När en plan inte kan producera exakta avstånd direkt, använd en hybridfråga för att hitta de verkliga närmaste grannarna. Först en CTE-fråga med indexassisterad KNN och sedan en exakt fråga för att få rätt sortering:
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)