sql >> Base de Datos >  >> RDS >> Mysql

Cálculo de la distancia Haversine entre dos puntos en Laravel

Esta fue mi implementación de la misma. Elegí crear un alias para mi consulta con anticipación, de esta manera puedo aprovechar la Pagination . Además, debe seleccionar explícitamente las columnas que desea recuperar de la consulta. agréguelos en ->select() . Como users.latitude, users.longitude, products.name , o lo que sea.

He creado un alcance que se parece a esto:

public function scopeIsWithinMaxDistance($query, $location, $radius = 25) {

     $haversine = "(6371 * acos(cos(radians($location->latitude)) 
                     * cos(radians(model.latitude)) 
                     * cos(radians(model.longitude) 
                     - radians($location->longitude)) 
                     + sin(radians($location->latitude)) 
                     * sin(radians(model.latitude))))";
     return $query
        ->select() //pick the columns you want here.
        ->selectRaw("{$haversine} AS distance")
        ->whereRaw("{$haversine} < ?", [$radius]);
}

Puede aplicar este alcance a cualquier modelo con una latitude y longitude .

Reemplace $location->latitude con tu latitude que desea buscar y reemplace el $location->longitude con la longitud contra la que desea buscar.

Reemplace model.latitude y model.longitude con los modelos que desea encontrar alrededor de la $location basado en la distancia definida en el $radius .

Sé que tiene una fórmula de Haversine que funciona, pero si necesita Paginar, no puede usar el código que proporcionó.

Espero que esto ayude.