La forma más fácil y rápida de hacerlo sería almacenar las coordenadas como geometry o geography en lugar de pares de coordenadas separados:
ALTER TABLE data ADD COLUMN geog geography (point,4326);
UPDATE data SET geog = ST_MakePoint(lon,lat);
Después de eso, cree un índice esencial sobre esta nueva columna:
CREATE INDEX idx_data_point ON data USING gist (geog) ;
Usa ST_DWithin para consultar distancias, como ST_DistanceSphere o ST_Distance no ¡usa el índice espacial!
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);
- Nota:el
trueen las funcionesST_DWithinyST_Distancesignifica use_spheroid=true , que es el predeterminado parageographyparámetros.
Demostración:db<>fiddle
Consulte también:Obtener todos los edificios en un rango de 5 millas desde las coordenadas especificadas