thinkphp根据经纬度计算距离


            $field = 'ACOS(SIN(('.$addr["lat"].' * 3.1415) / 180 ) *SIN((a.lat * 3.1415) / 180 ) +COS(('.$addr["lat"].' * 3.1415) / 180 )
                * COS((a.lat * 3.1415) / 180 ) *COS(('.$addr["lng"].' * 3.1415) / 180 - (a.lng * 3.1415) / 180 ) ) * 6380 as distance';
            $dot=Db::name('dot')
                ->alias('a')
                ->field($field.",dot_store_name,dot_door_photo,id,business_status,service_distance,xysm")
                ->where($where)
                ->having( "distance<=service_distance")
                ->order("distance asc")
//                ->page($page,$limit)
                ->select();
thinkphp 5.1 
 mysql 5.7版本以上
 https://dev.mysql.com/doc/refman/5.7/en/spatial-convenience-functions.html  
 

 

 

 

 

 
$lists = \app\cars\model\Wash::fieldRaw("round(st_distance_sphere(point(".$data["longitude"].",".$data["latitude"]."),point(`longitude`,`latitude`))) distance ")
->where("status",1)
->orderRaw($order .",is_recommend desc")
->paginate();
 
原生sql
select shop.* 
from
(
select * ,round(st_distance_sphere(point(120.012484,30.298926),point(`longitude`,`latitude`))) dis
 from test111.store 
having dis < 5000
 order by dis limit 100000 ) shop
group by shop.item_id
order by dis
limit 10


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM