Chcesz „wszystkie wiersze w promieniu 5 mil od współrzędnej” , więc to nie dokładnie problem K-najbliższego sąsiada (KNN). Powiązane, ale twoja sprawa jest prostsza. „Znajdź 10 wierszy najbliżej moich współrzędnych” byłby problemem KNN.
Konwertuj swoje współrzędne na geography
wartości:
ST_SetSRID(ST_MakePoint(longitude, latitude),4326)::geography
Alternatywnie możesz użyć prostszej geometry
rodzaj. Rozważ:
4.2.2. Kiedy używać typu danych Geografia zamiast typu danych Geometria
Następnie mamy tabelę typu:
CREATE TABLE tbl (
tbl_id serial PRIMARY KEY
, geog geography NOT NULL
);
Wszystko czego potrzebujesz to ST_DWithin()
- oraz indeks przestrzenny żeby było szybko:
CREATE INDEX tbl_geog_gist ON tbl USING gist(geog);
Zapytanie:
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
Lub możesz użyć swoich oryginalnych kolumn i utworzyć indeks funkcjonalny ... Te i inne szczegóły w tej ściśle powiązanej odpowiedzi na dba.SE:
- Uporządkuj według odległości