sql >> Databáze >  >> RDS >> Mysql

Haversine výpočet vzdálenosti mezi dvěma body v Laravel

Toto byla moje implementace. Rozhodl jsem se pro svůj dotaz předem alias, takže mohu využít výhody Pagination . Dále musíte explicitně vybrat sloupce, které chcete z dotazu načíst. přidejte je do ->select() . Například users.latitude, users.longitude, products.name , nebo co to může být.

Vytvořil jsem rozsah, který vypadá asi takto:

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

Tento rozsah můžete použít na jakýkoli model s latitude a longitude .

Nahraďte $location->latitude s vaší latitude podle kterého chcete hledat a nahraďte $location->longitude s zeměpisnou délkou, podle které chcete hledat.

Nahraďte model.latitude a model.longitude s modely, které chcete najít v okolí $location na základě vzdálenosti definované v $radius .

Vím, že máte funkční vzorec Haversine, ale pokud potřebujete stránkovat, nemůžete použít zadaný kód.

Snad to pomůže.



  1. Dotaz MySql k načtení hodnoty atributu prvku xml

  2. Chyba syntaxe kvůli použití vyhrazeného slova jako názvu tabulky nebo sloupce v MySQL

  3. Zkontrolujte verzi SQLite

  4. Připojte HP-UX Itanium k SQL Server