Le moyen le plus simple et le plus rapide de le faire serait de stocker les coordonnées en tant que geometry
ou geography
au lieu de paires de coordonnées séparées :
ALTER TABLE data ADD COLUMN geog geography (point,4326);
UPDATE data SET geog = ST_MakePoint(lon,lat);
Après cela, créez un index Gist sur cette nouvelle colonne :
CREATE INDEX idx_data_point ON data USING gist (geog) ;
Utiliser ST_DWithin
pour interroger les distances, comme ST_DistanceSphere
ou ST_Distance
ne sera pas utilisez l'index spatial !
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);
- Remarque :le
true
dans les fonctionsST_DWithin
etST_Distance
signifie use_spheroid=true , qui est la valeur par défaut pourgeography
paramètres.
Démo :db<>fiddle
Voir aussi :Obtenir tous les bâtiments à une distance de 5 miles des coordonnées spécifiées