<-> — 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. Används i "ORDER BY" -klausulen ger indexassisterade resultatuppsättningar för närmaste granne. För PostgreSQL under 9.5 ger endast centroidavstånd för avgränsningsrutor och för PostgreSQL 9.5+, gör sann KNN-avståndssökning som ger sant avstånd mellan geometrier och avståndssfär 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.
Förbättrad: 2.2.0 -- Sann KNN ("K närmaste granne") beteende för geometri och geografi för PostgreSQL 9.5+. Observera att KNN för geografi är baserad på sfär snarare än sfäroid. För PostgreSQL 9.4 och nedan är geografistöd nytt men stöder endast centroidbox.
Ändrad: 2.2.0 -- För PostgreSQL 9.5-användare kan gammal Hybrid-syntax vara långsammare, så du vill bli av med det hacket om du bara kör din kod på PostGIS 2.2 + 9.5 +. Se exempel nedan.
Tillgänglighet: 2.0.0 -- Svag KNN ger närmaste grannar baserade på geometriska centroidavstånd istället för verkliga avstånd. Exakta resultat för punkter, inexakta för alla andra typer. Tillgänglig för 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)
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.
För användare som kör med PostgreSQL < 9.5, använd en hybridfråga för att hitta de sanna närmaste grannarna. Först en CTE-fråga med hjälp av indexassisterad KNN, sedan en exakt fråga för att få rätt ordning:
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)