PHP实现通过经纬度计算距离和查附近店门
单位:公里
laravel查附近店门
DB::table('shops')->selectRaw('id, address, lat, lng, round((
6370.996 * acos ( cos ( radians( ? ) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians( ? ) ) + sin ( radians( ? ) ) * sin( radians( lat ) ) ) ),1) AS distance', [$lat, $lng, $lat])
->orderBy('distance')->first();
PHP实现通过经纬度计算距离
$lng1 = 102.76;
$lat1 = 25.00;
$lat2 = auth()->user()->lat;
$lng2 = auth()->user()->lng;
//将角度转为狐度
$radLat1 = deg2rad($lat1);
$radLat2 = deg2rad($lat2);
$radLng1 = deg2rad($lng1);
$radLng2 = deg2rad($lng2);
$a=$radLat1-$radLat2;//两纬度之差,纬度<90
$b=$radLng1-$radLng2;//两经度之差纬度<180
$s= 2*asin(sqrt(pow(sin($a/2),2)+cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)))*6378.137;
本作品采用《CC 协议》,转载必须注明作者和本文链接
针对不规则的形状怎么处理呢,之前做过类似项目,不规则的区域有 bug
为啥不用 redis
GEO
不用查数据库时那么写,mysql有自带的距离函数的。 select st_distance_sphere(point( ?,? ), point( house.lng, house.lat )) distance from house where id= ?
用redis更好
用geohash更方便
用geohash,速度起飞,唯一不好得就是查出来需要自己按距离重新排一下序
用postgis
mark一下
经纬度查询距离,一开始做的时候也是用的这个。后面有看到redis的,其他的没用过。
不要用redis geo,不完善,多条件筛选不好做
建议用 mysql 自带的函数 ST_Distance_Sphere 简单一些。