Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Cálculo da distância de Haversine entre dois pontos em Laravel


Esta foi a minha implementação dele. Optei por criar um alias para minha consulta com antecedência, dessa forma posso aproveitar a Pagination . Além disso, você precisa selecionar explicitamente as colunas que deseja recuperar da consulta. adicione-os no ->select() . Como users.latitude, users.longitude, products.name , ou o que quer que sejam.

Eu criei um escopo que se parece com isso:
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]);
}

Você pode aplicar este escopo a qualquer modelo com uma latitude e longitude .

Substitua o $location->latitude com seu latitude que você deseja pesquisar e substitua o $location->longitude com a longitude que você deseja pesquisar.

Substitua o model.latitude e model.longitude com os modelos que você deseja encontrar em $location com base na distância definida no $radius .

Eu sei que você tem uma fórmula de Haversine funcionando, mas se você precisar paginar, você não pode usar o código que você forneceu.

Espero que isso ajude.