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
true
en las funcionesST_DWithin
yST_Distance
significa use_spheroid=true , que es el predeterminado parageography
parámetros.
Demostración:db<>fiddle
Consulte también:Obtener todos los edificios en un rango de 5 millas desde las coordenadas especificadas