tp5根据经纬度测距并排序

之前一直喜欢用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';
  }

在这里插入图片描述

posted @ 2020-09-15 10:17  Twoknives_li  阅读(77)  评论(0)    收藏  举报