您的当前位置:首页>全部文章>文章详情

Thinkphp5/TP5/PHP通过经纬度计算距离获取附近信息

发表于:2024-04-23 17:51:14浏览:176次TAG: #ThinkPHP #PHP #附近 #经纬度

前言

实际开发中,常常需要获取用户附近的商家,思路是

获取用户位置(经纬度信息)
在数据库中查询在距离范围内的商家
注: 本文章内计算距离所使用地球半径统一为 6378.138 km

php代码

/**
 * @param $lat 纬度
 * @param $lng 经度
 * @param $radius 半径,单位:km
 * @return \think\response\Json
 * @throws \think\db\exception\DataNotFoundException
 * @throws \think\db\exception\DbException
 * @throws \think\db\exception\ModelNotFoundException
 */
public function get_near($lat,$lng,$radius = 1)
{
    $m = $radius * 1000;
    $distanceSql = "(6378.138 * 2 * asin(sqrt(pow(sin((lat * pi() / 180 - ".$lat." * pi() / 180) / 2),2) + cos(lat * pi() / 180) * cos(".$lat." * pi() / 180) * pow(sin((lng * pi() / 180 - ".$lng." * pi() / 180) / 2),2))) * 1000)";
    // 获取附近的人
    $list = Db::name('member')
        ->field("id,nickname,realname,lat,lng,".$distanceSql." as distance")
        ->whereRaw($distanceSql." <= ".$m)
        ->order('distance', 'ASC')
        ->select()
        ->each(function ($item) use ($lng,$lat){
            $item['distance'] = round($item['distance']);
            return $item;
        });
    return $this->json([
        'status'=>1,
        'msg'=>'success',
        'data'=>[
            'list'=>$list
        ]
    ]);
}