Cách dễ nhất và nhanh nhất để làm điều đó là lưu trữ các tọa độ dưới dạng geometry hoặc geography thay vì các cặp tọa độ được phân tách:
ALTER TABLE data ADD COLUMN geog geography (point,4326);
UPDATE data SET geog = ST_MakePoint(lon,lat);
Sau đó, tạo chỉ mục chính trên cột mới này:
CREATE INDEX idx_data_point ON data USING gist (geog) ;
Sử dụng ST_DWithin để truy vấn khoảng cách, dưới dạng ST_DistanceSphere hoặc ST_Distance sẽ không sử dụng chỉ mục không gian!
SELECT ST_Distance(geog,ST_MakePoint(49.9 ,6.7)::geography,true)
FROM data
WHERE ST_DWithin(geog,ST_MakePoint(49.9,6.7),10000,true);
- Lưu ý:
truetrong các hàmST_DWithinvàST_Distancecó nghĩa là use_spheroid =true , là mặc định chogeographytham số.
Demo: db<>fiddle
Xem thêm: Nhận tất cả các Tòa nhà trong phạm vi 5 dặm từ tọa độ được chỉ định