Name

<-> — Returnerar 2D-avståndet mellan A och B.

Synopsis

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

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

Beskrivning

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.

[Note]

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.

[Note]

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+

Exempel

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)