Най-лесният и бърз начин да го направите би бил да съхраните координатите като geometry
или geography
вместо разделени координатни двойки:
ALTER TABLE data ADD COLUMN geog geography (point,4326);
UPDATE data SET geog = ST_MakePoint(lon,lat);
След това създайте основен индекс върху тази нова колона:
CREATE INDEX idx_data_point ON data USING gist (geog) ;
Използвайте ST_DWithin
за заявка за разстояния, като ST_DistanceSphere
или ST_Distance
щене използвайте пространствения индекс!
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);
- Забележка:
true
във функциитеST_DWithin
иST_Distance
означава use_spheroid=true , което е по подразбиране заgeography
параметри.
Демонстрация:db<>fiddle
Вижте също:Получаване на всички сгради в обхват от 5 мили от определени координати