A maneira mais fácil e rápida de fazer isso seria armazenar as coordenadas como
geometry
ou geography
em vez de pares de coordenadas separados:ALTER TABLE data ADD COLUMN geog geography (point,4326);
UPDATE data SET geog = ST_MakePoint(lon,lat);
Depois disso, crie um índice gist sobre esta nova coluna:
CREATE INDEX idx_data_point ON data USING gist (geog) ;
Use
ST_DWithin
para consultar distâncias, como ST_DistanceSphere
ou ST_Distance
não use o í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);
- Observação:o
true
nas funçõesST_DWithin
eST_Distance
significa use_spheroid=true , que é o padrão parageography
parâmetros.
Demonstração:
db<>fiddle
Veja também:Obter todos os edifícios no alcance de 5 milhas das coordenadas especificadas