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