Bạn muốn "tất cả các hàng trong bán kính 5 dặm của một tọa độ" , vì vậy đây không phải là không chính xác là một vấn đề K-hàng xóm gần nhất (KNN). Có liên quan, nhưng trường hợp của bạn đơn giản hơn. "Tìm 10 hàng gần nhất với tọa độ của tôi" sẽ là một vấn đề của KNN.
Chuyển đổi tọa độ của bạn thành geography
giá trị:
ST_SetSRID(ST_MakePoint(longitude, latitude),4326)::geography
Ngoài ra, bạn có thể sử dụng geometry
đơn giản hơn gõ phím. Xem xét:
4.2.2. Khi nào sử dụng kiểu Dữ liệu địa lý trên kiểu dữ liệu Hình học
Sau đó, chúng ta có một bảng như sau:
CREATE TABLE tbl (
tbl_id serial PRIMARY KEY
, geog geography NOT NULL
);
Tất cả những gì bạn cần là ST_DWithin()
- và chỉ mục không gian để làm cho nó nhanh chóng:
CREATE INDEX tbl_geog_gist ON tbl USING gist(geog);
Truy vấn:
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
Hoặc bạn có thể sử dụng các cột ban đầu của mình và tạo chỉ mục chức năng ... Điều này và các chi tiết khác trong câu trả lời có liên quan chặt chẽ này trên dba.SE:
- Đặt hàng theo khoảng cách