Pracuję nad projektem używanym do publikowania reklam, ten projekt opiera się na lokalizacji, więc gdy użytkownik opublikuje swoje ogłoszenia, aplikacja wykryje jego pozycję, więc kiedy inni ludzie zostali zamieszkaniowym na swoich reklamach, mogą go znaleźć na mapach. Problem polega na tym, że chcę zamówić te reklamy z najbliższego jednego do najlepiej wykorzystującego szerokość i długość ogłoszeń, a także szerokość szerokości i długości geograficznej tego, który korzystający z aplikacji

public function get_searched(Request $request){
    $annonce =DB::table('annonces')
    ->where('nomAnnonce','like','%'.$request->input("nomAnnonce").'%')
    ->orderby(((('latitude'- $request->input("lat"))*('latitude'-$request->input("lat"))) + (('longitude' - $request->input("lon"))*('longitude' - $request->input("lon")))), 'ASC')
    ->get();
    echo $annonce;}

To wszystko, co mogę zrobić i daje mi zły wynik:

SQLSTATE[42S22]: Column not found: 1054 Champ '1359.309643206' inconnu dans 
order clause (SQL: select * from `annonces` where `nomAnnonce` like %P% 
order by `1359`.`309643206` asc)

Jeśli ktoś może pomóc, to będzie wielka przyjemność

1
aymen medjader 4 czerwiec 2018, 16:36

3 odpowiedzi

Najlepsza odpowiedź

Spróbuj użyć tego:

public function get_searched(Request $request){
    $annonces = DB::table("annonces")
    ->where('nomAnnonce','like','%'.$request->input("nomAnnonce").'%')
    ->orderBy(DB::raw("3959 * acos( cos( radians({$request->input('lat')}) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(-{$request->input('lon')}) ) + sin( radians({$request->input('lat')}) ) * sin(radians(latitude)) )"), 'ASC')
    ->get()
    dd($annonces);
}

Takie podejście wykorzystuje sferyczne prawo cosines, aby uzyskać odległość

0
Luis felipe De jesus Munoz 4 czerwiec 2018, 15:02

Jak się dzieje, pracowałem na niektórych projektach, które wykonały bardzo podobne rzeczy i zebrały kilka funkcji pomocniczych, które mogą pomóc. Istnieje algorytm, który oblicza odległości między dwoma zestawami współrzędnych, więc te pomocnicy będą wykonać to dla Ciebie, albo produkować SQL niezbędne do wykonania go w bazie danych. distance_sql() jeden brzmi jak to, czego szukasz. Poprzez, że zapytanie wykonaj pracę zamiast skryptu, masz możliwość sortowania i paginować zestaw wyników, zanim wróci. Polecam umieszczenie a Metoda zapytania w modelu, który wywołuje to.

Jeśli jeszcze tego nie zrobiłeś, utwórz plik app/helpers.php i dodaj to do pliku composer.json, a następnie uruchom composer install:

"autoload": {
    "files": [
        "app/helpers.php",
        ...
    ],
    ...
},
...

I wreszcie, umieść je w swoim helpers.php:

if (!function_exists('distance')) {
    /**
     * Calculate the distance between two sets of coordinates
     *
     * @param float $latitude1
     * @param float $longitude1
     * @param float $latitude2
     * @param float $longitude2
     * @param float $padding
     * @return float
     */
    function distance($latitude1, $longitude1, $latitude2, $longitude2, $padding = 0.0)
    {
        $earthRadiusInMiles = 3959;

        $latitude1 = deg2rad($latitude1);
        $latitude2 = deg2rad($latitude2);
        $longitude1 = deg2rad($longitude1);
        $longitude2 = deg2rad($longitude2);

        $miles = $earthRadiusInMiles * acos(
            cos($latitude1) * cos($latitude2)
            * cos($longitude2 - $longitude1)
            + sin($latitude1) * sin($latitude2)
        );

        $miles += $padding * $miles;

        return round($miles, 3);
    }
}

if (!function_exists('distance_sql')) {
    /**
     * Generate the SQL needed to calculate the distance between two sets of coordinates
     *
     * @param float|string $latitude1
     * @param float|string $longitude1
     * @param float|string $latitude2
     * @param float|string $longitude2
     * @param float $padding
     * @return string
     */
    function distance_sql($latitude1, $longitude1, $latitude2, $longitude2, $padding = 0.0)
    {
        $earthRadiusInMiles = 3959;

        $latitude1 = 'RADIANS('.DB::connection()->getPdo()->quote($latitude1).')';
        $latitude2 = "RADIANS($latitude2)";
        $longitude1 = 'RADIANS('.DB::connection()->getPdo()->quote($longitude1).')';
        $longitude2 = "RADIANS($longitude2)";

        $sql = "$earthRadiusInMiles * ACOS("
            . "COS($latitude1) * COS($latitude2)"
            . " * COS($longitude2 - $longitude1)"
            . " + SIN($latitude1) * SIN($latitude2))";

        $sql .= " + $padding * $sql";

        return $sql;
    }
}
0
kmuenkel 4 czerwiec 2018, 13:56
public function get_searched(Request $request){
    $annonce =DB::table('annonces')
    ->select('*', 
    DB::raw(((('latitude'- $request->input("lat"))*('latitude'-$request->input("lat"))) + (('longitude' - $request->input("lon"))*('longitude' - $request->input("lon")))) 
            as 'distance'
            )
    ->where('nomAnnonce','like','%'.$request->input("nomAnnonce").'%')
    ->orderby('distance', 'ASC')
    ->get();
    echo $annonce;}
0
calm 4 czerwiec 2018, 13:58