Det enklaste och snabbaste sättet att göra det är att lagra koordinaterna som geometry
eller geography
istället för separerade koordinatpar:
ALTER TABLE data ADD COLUMN geog geography (point,4326);
UPDATE data SET geog = ST_MakePoint(lon,lat);
Efter det skapar du ett huvudindex över den här nya kolumnen:
CREATE INDEX idx_data_point ON data USING gist (geog) ;
Använd ST_DWithin
för att söka avstånd, som ST_DistanceSphere
eller ST_Distance
kommer inte använd det rumsliga indexet!
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);
- Obs:den
true
i funktionernaST_DWithin
ochST_Distance
betyder use_spheroid=true , vilket är standard förgeography
parametrar.
Demo:db<>fiddle
Se även:Hämta alla byggnader inom räckvidd av 5 miles från angivna koordinater