Je continue sur ma lancée...
Après quelques recherches, je suis tombé (entre autres) sur ce tuto : [PHP/SQL] Géolocalisation et distance entre des villes
Sous réserve que la formule soit juste...
Calcul de la distance entre 2 positions GPS :
distance = (:RTerre * ACOS( COS(RADIANS(:lat_ref)) * COS(RADIANS(`lat_use`)) * COS(RADIANS(`lon_use`) - RADIANS(:lon_ref)) + SIN(RADIANS(:lat_ref)) * SIN(RADIANS(`lat_use`)) ) )
avec :
- distance : distance entre les 2 points, en km
- :RTerre : rayon de la Terre, en km (6371 km)
- :lat_ref : latitude en degrés du 1er point (référence)
- :lon_ref : longitude en degrés du 1er point (référence)
- `lat_use` : latitude en degrés du 2ème point (user)
- `lon_use` : longitude en degrés du 2ème point (user)
La distance MAXI recherchée (acceptable) vaut :
(:Rayon_ref + `rayon_use`)
avec :
- :Rayon_ref : le rayon acceptable autour du point 1 (référence), en km
- `rayon_use` : le rayon acceptable autour du point 2 (user), en km
1 2 3
|
X-----Rayon_ref-----|--------------------rayon_use---------------------Y
X-----------------------------distance MAXI----------------------------Y |
:RTerre, :lat_ref, :lon_ref et :Rayon_ref sont connus (référence)
En SQL, (et en utilisant la syntaxe d'une requête préparée,) ça se traduit donc "simplement" par :
1 2 3
| SELECT `id_use`, ...., (:RTerre * ACOS( COS(RADIANS(:lat_ref)) * COS(RADIANS(`lat_use`)) * COS(RADIANS(`lon_use`) - RADIANS(:lon_ref)) + SIN(RADIANS(:lat_ref)) * SIN(RADIANS(`lat_use`)) ) ) AS distance_use
FROM users
WHERE distance_use <= (:Rayon_ref + `rayon_use`) |
A vérifier, bien sûr...
Par conséquent :
- AUCUN besoin d'un rayon max (50 km)
- AUCUN besoin de calculer des latitudes/longitudes MAXI/MINI
Partager