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 ý:
true
trong các hàmST_DWithin
vàST_Distance
có nghĩa là use_spheroid =true , là mặc định chogeography
tham 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