PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come faccio a interrogare tutte le righe entro un raggio di 5 miglia dalle mie coordinate?

Vuoi "tutte le righe entro un raggio di 5 miglia da una coordinata" , quindi questo non esattamente un problema K-nearest-neighbor (KNN). Correlato, ma il tuo caso è più semplice. "Trova le 10 righe più vicine alle mie coordinate" sarebbe un problema KNN.

Converti le tue coordinate in geography valori:

ST_SetSRID(ST_MakePoint(longitude, latitude),4326)::geography

In alternativa puoi usare la più semplice geometry genere. Considera:
4.2.2. Quando utilizzare il tipo di dati Geografia rispetto al tipo di dati Geometria

Quindi abbiamo una tabella come:

CREATE TABLE tbl (
  tbl_id serial PRIMARY KEY
, geog geography NOT NULL
);

Tutto ciò di cui hai bisogno è ST_DWithin() - e un indice spaziale per renderlo veloce:

CREATE INDEX tbl_geog_gist ON tbl USING gist(geog);

Domanda:

SELECT *, ST_Distance(c.x, geog) AS distance  -- distance is optional
FROM   tbl t, (SELECT ST_GeographyFromText('SRID=4326;POINT(-72.63 42.06)')) AS c(x)
WHERE  ST_DWithin(c.x, geog, 8045)  -- distance in meter
ORDER  BY distance; -- order is optional, you did not ask for that

Oppure puoi usare le tue colonne originali e creare un indice funzionale ... Questo e altri dettagli in questa risposta strettamente correlata su dba.SE:

  • Ordina per distanza