Namn

<-> — 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. 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.

[Notera]

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.

[Notera]

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.

Exempel

Kod
SELECT ST_Distance(geom, 'SRID=3005;POINT(1011102 450541)'::geometry) as d, edabbr, vaabbr
FROM va2005
ORDER BY d limit 10;
Utdata
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:

Kod
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;
Utdata
        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:

Kod
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;
Utdata
        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)