计算两个经纬度之间的距离
Posted 娜娜很乖的
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算两个经纬度之间的距离相关的知识,希望对你有一定的参考价值。
//计算两个经纬度之间的距离
/**
* 计算两点地理坐标之间的距离
* @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);}
以上是关于计算两个经纬度之间的距离的主要内容,如果未能解决你的问题,请参考以下文章