PostGIS
Đừng lưu trữ vĩ độ và độ dài trên bàn như vậy. Thay vào đó, hãy sử dụng hình dạng PostGIS hoặc loại địa lý .
CREATE EXTENSION postgis;
CREATE TABLE foo (
geog geography;
);
CREATE INDEX ON foo USING gist(geog);
INSERT INTO foo (geog)
VALUES (ST_MakePoint(x,y));
Bây giờ khi bạn cần truy vấn nó, bạn có thể sử dụng KNN (<->
)
thực sự sẽ thực hiện điều này trên một chỉ mục.
SELECT *
FROM foo
ORDER BY foo.geog <-> ST_MakePoint(x,y)::geography;
Trong truy vấn của bạn, rõ ràng bạn có HAVING distance < 5
. Bạn cũng có thể làm điều đó trên chỉ mục.
SELECT *
FROM foo
WHERE ST_DWithin(foo.geog, ST_MakePoint(x,y)::geography, distance_in_meters)
ORDER BY foo.geog <-> ST_MakePoint(x,y)::geography;
Điều này đảm bảo rằng không có gì được trả lại nếu tất cả các điểm nằm ngoài distance_in_meters
.
Hơn nữa x và y là số thập phân ST_MakePoint(46.06, 14.505)