Anda ingin "semua baris dalam radius 5 mil dari koordinat" , jadi ini bukan persis masalah K-nearest-neighbour (KNN). Terkait, tetapi kasus Anda lebih sederhana. "Temukan 10 baris yang paling dekat dengan koordinat saya" akan menjadi masalah KNN.
Ubah koordinat Anda menjadi geography
nilai:
ST_SetSRID(ST_MakePoint(longitude, latitude),4326)::geography
Atau Anda dapat menggunakan geometry
yang lebih sederhana Tipe. Pertimbangkan:
4.2.2. Kapan harus menggunakan tipe Data Geografi daripada tipe data Geometri
Kemudian kita memiliki tabel seperti:
CREATE TABLE tbl (
tbl_id serial PRIMARY KEY
, geog geography NOT NULL
);
Yang Anda butuhkan hanyalah ST_DWithin()
- dan indeks spasial untuk membuatnya cepat:
CREATE INDEX tbl_geog_gist ON tbl USING gist(geog);
Pertanyaan:
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
Atau Anda dapat menggunakan kolom asli Anda dan membuat indeks fungsional ... Ini dan detail lainnya dalam jawaban yang terkait erat ini di dba.SE:
- Pesan berdasarkan jarak