/**
* @desc 根据两点间的经纬度计算距离
* @param float $lat 纬度值
* @param float $lng 经度值
*/
function dr_distance($lat1, $lng1, $lat2, $lng2, $mark = '米,千米') {
$earthRadius = 6367000; //近似地球半径(米)
// 将这些度数转换为弧度使用公式
$lat1 = ($lat1 * pi() ) / 180;
$lng1 = ($lng1 * pi() ) / 180;
$lat2 = ($lat2 * pi() ) / 180;
$lng2 = ($lng2 * pi() ) / 180;
// 使用半正矢公式 计算距离 :
http://en.wikipedia.org/wiki/Haversine_formula
$calcLongitude = $lng2 - $lng1;
$calcLatitude = $lat2 - $lat1;
$stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2); $stepTwo = 2 * asin(min(1, sqrt($stepOne)));
$calculatedDistance = $earthRadius * $stepTwo;
$value = round($calculatedDistance);
if (!$mark) {
return $value;
}
$dw = '';
$mark = @explode(',', $mark);
if ($value < 1000) {
$dw = isset($mark[0]) ? $mark[0] : '';
} elseif ($value >= 1000) {
$dw = isset($mark[1]) ? $mark[1] : '';
$dw && $value = $value / 1000;
}
return $value.$dw;
}
另
/**
*计算某个经纬度的周围某段距离的正方形的四个点
*
*@param lng float 经度
*@param lat float 纬度
*@param distance float 该点所在圆的半径,该圆与此正方形内切,默认值为0.5千米
*@return array 正方形的四个点的经纬度坐标
*/
function dr_square_point($lng, $lat, $distance = 0.5){
$distance = $distance ? $distance : 1;
$r = 6371; //地球半径,平均半径为6371km
$dlng = 2 * asin(sin($distance / (2 * $r)) / cos(deg2rad($lat)));
$dlng = rad2deg($dlng);
$dlat = $distance/$r;
$dlat = rad2deg($dlat);
return array(
'left-top'=>array('lat'=>$lat + $dlat,'lng'=>$lng-$dlng),
'right-top'=>array('lat'=>$lat + $dlat, 'lng'=>$lng + $dlng),
'left-bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng - $dlng),
'right-bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng + $dlng)
);
}
/**
*计算某个经纬度的周围某段距离的正方形北东南西四边位置
*@param float lng 经度
*@param float lat 纬度
*@param float distance 该点所在圆的半径,该圆与此正方形内切,默认值为0.5千米
*@return array 正方形的四个点的经纬度坐标
*/
function dr_four_sides($lng, $lat, $distance = 0.5){
$distance = $distance ? $distance : 1;
$r = 6371; //地球半径,平均半径为6371km
$dlng = 2 * asin(sin($distance / (2 * $r)) / cos(deg2rad($lat)));
$dlng = rad2deg($dlng);
$dlat = $distance/$r;
$dlat = rad2deg($dlat);
return array(
'n'=>$lat - $dlat,
'e'=>$lng + $dlng,
's'=>$lat + $dlat,
'w'=>$lng - $dlng
);
}
坐标系转换
/*
* 百度地图BD09坐标---->中国正常GCJ02坐标
* 腾讯地图用的也是GCJ02坐标
* @param double $lat 纬度
* @param double $lng 经度
* @return array();
*/
function Convert_BD09_To_GCJ02($lat, $lng)
{
$x_pi = 3.14159265358979324 * 3000.0 / 180.0;
$x = $lng - 0.0065;
$y = $lat - 0.006;
$z = sqrt($x * $x + $y * $y) - 0.00002 * sin($y * $x_pi);
$theta = atan2($y, $x) - 0.000003 * cos($x * $x_pi);
$lng = $z * cos($theta);
$lat = $z * sin($theta);
return array('lng' => $lng, 'lat' => $lat);
}
/*
* 中国正常GCJ02坐标---->百度地图BD09坐标
* 腾讯地图用的也是GCJ02坐标
* @param double $lat 纬度
* @param double $lng 经度
*/
function Convert_GCJ02_To_BD09($lat, $lng): array
{
$x_pi = 3.14159265358979324 * 3000.0 / 180.0;
$x = $lng;
$y = $lat;
$z = sqrt($x * $x + $y * $y) + 0.00002 * sin($y * $x_pi);
$theta = atan2($y, $x) + 0.000003 * cos($x * $x_pi);
$lng = $z * cos($theta) + 0.0065;
$lat = $z * sin($theta) + 0.006;
return array('lng' => $lng, 'lat' => $lat);
}