平常我们做项目,经常遇到根据用户当前位置来计算出与用户之间的距离,或者给用户展示方圆一公里的店铺商家之类的功能。所以在此记录一下方法。
计算两个经纬度地点之间的距离
/**
* 求两个已知经纬度之间的距离,单位为米
*
* @param lng1 $ ,lng2 经度
* @param lat1 $ ,lat2 纬度
* @return float 距离,单位米
* @author www.Alixixi.com
*/
function getdistance($lng1, $lat1, $lng2, $lat2) {
// 将角度转为狐度
$radLat1 = deg2rad($lat1); //deg2rad()函数将角度转换为弧度
$radLat2 = deg2rad($lat2);
$radLng1 = deg2rad($lng1);
$radLng2 = deg2rad($lng2);
$a = $radLat1 - $radLat2;
$b = $radLng1 - $radLng2;
$s = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2))) * 6378.137 * 1000;
return $s;
}
根据经纬度获取指定方圆距离的四个点
/**
* 获取指定方圆距离的四个点
* param lng float 经度
* param lat float 纬度
* param distance float 该点所在圆的半径,该圆与此正方形内切,默认值为单位米
* return array 正方形的四个点的经纬度坐标
*/
function getSquarePoint($lng, $lat,$distance)
{
$PI = 3.14159265;
$longitude = $lng;
$latitude = $lat;
$degree = (24901*1609)/360.0;
$raidusMile = $distance;
$dpmLat = 1/$degree;
$radiusLat = $dpmLat*$raidusMile;
$minLat = $latitude - $radiusLat; //拿到最小纬度
$maxLat = $latitude + $radiusLat; //拿到最大纬度
$mpdLng = $degree*cos($latitude * ($PI/180));
$dpmLng = 1 / $mpdLng;
$radiusLng = $dpmLng*$raidusMile;
$minLng = $longitude - $radiusLng; //拿到最小经度
$maxLng = $longitude + $radiusLng; //拿到最大经度
$range = array(
'minLat' => $minLat,
'maxLat' => $maxLat,
'minLon' => $minLng,
'maxLon' => $maxLng
);
return $range;
}
array:4 [
"minLat" => 116.37358780139
"maxLat" => 116.46344019861
"minLon" => 40.009328861985
"maxLon" => 39.807379138015
]
maxLon 比 minLon还小呢
模板怎么使用呢
$degree中这几个常数是什么意义
$degree = (24901*1609)/360.0;
地球的周长是24901英里,1英里等于1609米。360度数。
kankan
12312
随便看看