Mysql
 sql >> Database >  >> RDS >> Mysql

Calcolo della distanza di Haversine tra due punti in Laravel

Questa è stata la mia implementazione. Ho scelto di dare un alias alla mia domanda in anticipo, in questo modo posso sfruttare Pagination . Inoltre, è necessario selezionare in modo esplicito le colonne che si desidera recuperare dalla query. aggiungili in ->select() . Ad esempio users.latitude, users.longitude, products.name , o qualunque essi siano.

Ho creato un ambito che assomiglia a questo:

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]);
}

Puoi applicare questo ambito a qualsiasi modello con latitude e longitude .

Sostituisci $location->latitude con la tua latitude che desideri cercare e sostituisci $location->longitude con la longitudine rispetto alla quale desideri effettuare la ricerca.

Sostituisci model.latitude e model.longitude con i Modelli che desideri trovare in giro per $location in base alla distanza definita nel $radius .

So che hai una formula Haversine funzionante, ma se devi impaginare non puoi usare il codice che hai fornito.

Speriamo che questo aiuti.