Как получить расстояние в км в этом запросе - PullRequest
0 голосов
/ 26 апреля 2018
$salons = Salon::select('salons.*')
    ->selectRaw('( 6371* acos( cos( radians(?) ) *
                   cos( radians( lat ) )
                   * cos( radians( lng ) - radians(?)
                   ) + sin( radians(?) ) *
                   sin( radians( lat ) ) )
                 ) AS distance', [$lat, $lng, $lat])
    ->havingRaw("distance < 25")
    ->where("category_Id" , "=" , $id)
    ->get();

этот запрос дает мне это-

"distance": 0.05205731665026305, I want distance like this 1.2KM

я пытался, но не нашел решения

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Попробуйте запрос ниже

$data = DB::table('salons AS S')
                ->selectRaw("
                        ( FLOOR(6371 * ACOS( COS( RADIANS( '$lat' ) ) * COS( RADIANS( S.lat ) ) * COS( RADIANS( S.lng ) - RADIANS( '$lng' ) ) + SIN( RADIANS( '$lat' ) ) * SIN( RADIANS( S.lat ) ) )) ) distance")
                ->havingRaw("distance < 25")
                ->where("category_Id" , "=" , $id)
                ->get();

$ lat, $ lng - переменные.

0 голосов
/ 26 апреля 2018

Лучше будет использовать PHP. Расчеты SQL стоят дорого. В некоторых исходных счетах разница может составлять 30 с против 0,04 с;)

public function scopeDistance($query, $from_latitude, $from_longitude, $distance)
    {
        $between_coords = \App\Services\PlaceServices::calcCoordinates($from_longitude, $from_latitude, $distance);

        return $query
            ->where(function ($q) use ($between_coords) {
                $q->whereBetween('places.longitude', [$between_coords['min']['lng'], $between_coords['max']['lng']]);
            })
            ->where(function ($q) use ($between_coords) {
                $q->whereBetween('places.latitude', [$between_coords['min']['lat'], $between_coords['max']['lat']]);
            });
    }

и calcCoodinates ()

public static function calcCoordinates($longitude, $latitude, $radius = 20)
    {
        $lng_min = $longitude - $radius / abs(cos(deg2rad($latitude)) * 69);
        $lng_max = $longitude + $radius / abs(cos(deg2rad($latitude)) * 69);
        $lat_min = $latitude - ($radius / 69);
        $lat_max = $latitude + ($radius / 69);

        return [
            'min' => [
                'lat' => $lat_min,
                'lng' => $lng_min,
            ],
            'max' => [
                'lat' => $lat_max,
                'lng' => $lng_max,
            ],
        ];
    }

Тогда просто используйте YourModel::distance($lat, $lon, $km)->get()

0 голосов
/ 26 апреля 2018

для получения km вы должны использовать 111.045 km за градус (в качестве приблизительного значения)

   ( 111.045 * acos( cos( radians(?) ) *
                       cos( radians( lat ) )
                       * cos( radians( lng ) - radians(?)
                       ) + sin( radians(?) ) *
                       sin( radians( lat ) ) )
                     )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...