meta data for this page
  •  

Calculer une distance entre deux coordonnées

Voici une formule afin de calculer la distance en kilomètres entre deux coordonnées à vol d'oiseau.

Elle est donnée sous forme de fonction que l'on peut mettre dans le Model.

use Illuminate\Support\Facades\DB;
...
public function scopeDistance($query, $lat, $long) {
        return $query->havingRaw(DB::raw('distance >= distanceUser'))
            ->select(DB::raw("*,
                    (6371 * ACOS(COS(RADIANS($lat))
                        * COS(RADIANS(latitude))
                        * COS(RADIANS($long) - RADIANS(longitude))
                        + SIN(RADIANS($lat))
                        * SIN(RADIANS(latitude)))) AS distanceUser")
            )
            ->orderBy('distanceUser', 'asc')
            ->get();

Remplacer 6371 par 3959 pour calculer en miles.

On peut l'utiliser dans un contrôleur sous la forme

$users = User::distance($user->latitude, $user->longitude)
         ->where('distance', '!=', 0);

Il faut bien sûr une table users avec les colonnes latitude, longitude et distance