码迷,mamicode.com
首页 > 其他好文 > 详细

计算两个经纬度之间的距离

时间:2018-08-08 15:01:38      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:url   地理   each   options   unit   之间   join   option   ack   

//计算两个经纬度之间的距离
/**
* 计算两点地理坐标之间的距离
* @param Decimal $longitude1 起点经度
* @param Decimal $latitude1 起点纬度
* @param Decimal $longitude2 终点经度
* @param Decimal $latitude2 终点纬度
* @param Int $unit 单位 1:2:公里
* @param Int $decimal 精度 保留小数位数
* @return Decimal
*/

function getDistance($longitude1, $latitude1, $longitude2, $latitude2, $unit=2, $decimal=2){

$EARTH_RADIUS = 6370.996; // 地球半径系数
$PI = 3.1415926;

$radLat1 = $latitude1 * $PI / 180.0;
$radLat2 = $latitude2 * $PI / 180.0;

$radLng1 = $longitude1 * $PI / 180.0;
$radLng2 = $longitude2 * $PI /180.0;

$a = $radLat1 - $radLat2;
$b = $radLng1 - $radLng2;

$distance = 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1) * cos($radLat2) * pow(sin($b/2),2)));
$distance = $distance * $EARTH_RADIUS * 1000;

if($unit==2){
$distance = $distance / 1000;
}

return round($distance, $decimal);

}



//根据给的距离算出自己附近的经纬度范围,算出距离后排序
public function vicinity()
{
if (!request()->isPost()) {
return result_set(-1);
}
$page = input(‘post.page/d‘);
$page_num = input(‘post.page_num/d‘) ? input(‘post.page_num/d‘) : 10;
if (isset($page) && NULL !== $page) {
$current_page = $page;
} else {
$current_page = 1;
}
$options = [
‘page‘ => $current_page,
‘path‘ => url(‘index‘)
];
$uid = $this->uid;
$lng = trim(input("post.lng"));
$lat = trim(input("post.lat"));
$distance = config(‘distance‘);


$degree = (24901*1609)/360.0;
$dpmLat = 1/$degree;

$radiusLat = $dpmLat*$distance;
$minLat = $lat - $radiusLat; // 最小纬度
$maxLat = $lat + $radiusLat; // 最大纬度

$mpdLng = $degree*cos($lat * (M_PI/180));
$dpmLng = 1 / $mpdLng;
$radiusLng = $dpmLng*$distance;
$minLng = $lng - $radiusLng; // 最小经度
$maxLng = $lng + $radiusLng; // 最大经度
$condition[‘p.lng‘] = [‘between‘, [$minLng, $maxLng]];
$condition[‘p.lat‘] = [‘between‘, [$minLat, $maxLat ]];


$data = db(‘member_position‘) ->alias(‘p‘) ->join(‘member m‘, ‘p.uid=m.uid‘)
->where(‘p.uid‘, ‘<>‘, $uid)
->where($condition)
->field(‘p.lng,p.lat,p.uid,m.authentication_status,m.thumb as thumb,m.nickname,m.start,m.brief‘)
->paginate($page_num, false, $options);
$data = $data->toArray();
foreach ($data[‘data‘] as $k => $v) {
$data[‘data‘][$k][‘thumb‘] = ‘http://‘ . config(‘DOMAIN‘) . ‘/‘ . $v[‘thumb‘];
$data[‘data‘][$k][‘distance‘] = getDistance($lng, $lat, $v[‘lng‘], $v[‘lat‘], 1);
}
$arr = $data[‘data‘]; $date = array_column($arr, ‘distance‘);
array_multisort($date,SORT_ASC,$arr);
return result_set(1, ‘成功‘, $arr);}
 

  









计算两个经纬度之间的距离

标签:url   地理   each   options   unit   之间   join   option   ack   

原文地址:https://www.cnblogs.com/nnhgd/p/9442430.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!