Du vil have "alle rækker inden for en radius på 5 mil fra en koordinat" , så dette er ikke præcis et K-nearest-neighbour (KNN) problem. Relateret, men din sag er enklere. "Find de 10 rækker, der er tættest på mine koordinater" ville være et KNN-problem.
Konverter dine koordinater til geography
værdier:
ST_SetSRID(ST_MakePoint(longitude, latitude),4326)::geography
Alternativt kan du bruge den mere simple geometry
type. Overvej:
4.2.2. Hvornår skal man bruge Geografi Datatype over Geometri datatype
Så har vi en tabel som:
CREATE TABLE tbl (
tbl_id serial PRIMARY KEY
, geog geography NOT NULL
);
Alt du behøver er ST_DWithin()
- og et rumligt indeks for at gøre det hurtigt:
CREATE INDEX tbl_geog_gist ON tbl USING gist(geog);
Forespørgsel:
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
Eller du kan bruge dine originale kolonner og oprette et funktionelt indeks ... Dette og andre detaljer i dette nært beslægtede svar på dba.SE:
- Bestil efter afstand