之前一直喜欢用api,后来发现太慢了,在网上搜索了下,大多是基于Haversine
R为地球半径,可取平均值 6371km;
φ1, φ2 表示两点的纬度;
然后整理下已经有写好的代码
$list = Db::name('merchant')->alias('ml')
->where('status',0)->where('longitude','<>','')->where('latitude','<>','')
->field("ml.merchantName, ml.latitude, ml.longitude, ml.ratingBarCounts, (6378.138 * 2 * asin(sqrt(pow(sin((latitude * pi() / 180 - ".$params['lat']." * pi() / 180) / 2),2) + cos(latitude * pi() / 180) * cos(".$params['lat']." * pi() / 180) * pow(sin((longitude * pi() / 180 - ".$params['lng']." * pi() / 180) / 2),2))) * 1000) as distance")
->order('distance')
->paginate(20)
->toArray();
接着就得到了,这里显示的米,单位根据自己需要来转换
foreach($list['data'] as $k=>$v){
$list['data'][$k]['distance']=round($v['distance']/1000,2).'Km';
}