如何在此查询中获取以公里为单位的距离

p8ekf7hl  于 2021-06-24  发布在  Mysql
关注(0)|答案(3)|浏览(315)
$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

我试过,但没有找到解决办法

tsm1rwdh

tsm1rwdh1#

更好的方法是使用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']]);
            });
    }

钙离子()

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()

20jt8wwn

20jt8wwn2#

为了获得 km 你应该使用 111.045 km 每度(近似值)

( 111.045 * acos( cos( radians(?) ) *
                       cos( radians( lat ) )
                       * cos( radians( lng ) - radians(?)
                       ) + sin( radians(?) ) *
                       sin( radians( lat ) ) )
                     )
ztmd8pv5

ztmd8pv53#

尝试下面的查询

$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是变量。

相关问题