Искате „всички редове в радиус от 5 мили от координата“ , така че това не точно проблем с K-най-близкия съсед (KNN). Свързано, но вашият случай е по-прост. „Намерете 10-те реда, най-близки до координатите ми“ би било проблем с KNN.
Преобразувайте координатите си в geography
стойности:
ST_SetSRID(ST_MakePoint(longitude, latitude),4326)::geography
Като алтернатива можете да използвате по-простата geometry
Тип. Помислете за:
4.2.2. Кога да се използва тип данни за география над тип данни за геометрия
След това имаме таблица като:
CREATE TABLE tbl (
tbl_id serial PRIMARY KEY
, geog geography NOT NULL
);
Всичко, от което се нуждаете, е ST_DWithin()
- и пространствен индекс за да го направите бързо:
CREATE INDEX tbl_geog_gist ON tbl USING gist(geog);
Запитване:
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
Или можете да използвате оригиналните си колони и да създадете функционален индекс ...Това и други подробности в този тясно свързан отговор на dba.SE:
- Подреждане по разстояние