PHP 计算经纬度坐标的周围某段距离的正方形的四个点及计算两个坐标点的距离

 1.计算某个经纬度的周围某段距离的正方形的四个点

/**
 *计算某个经纬度的周围某段距离的正方形的四个点
 *@param lng float 经度
 *@param lat float 纬度
 *@param distance float 该点所在圆的半径,该圆与此正方形内切,默认值为0.5千米
 *@return array 正方形的四个点的经纬度坐标
 */
function returnSquarePoint($lng, $lat, $distance = 0.5)
{
	$earthdata=6371;//地球半径,平均半径为6371km
	$dlng = 2 * asin(sin($distance / (2 * $earthdata)) / cos(deg2rad($lat)));
	$dlng = rad2deg($dlng);
	$dlat = $distance/$earthdata;
	$dlat = rad2deg($dlat);
	$data=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)
	);
	return $data;
}
//调用
$lng = '121.437799';
$lat = '31.243208';
$point = returnSquarePoint($lng,$lat);
print_r($point);

2.从数据库中查询此范围内的网点

//从数据库中查询此范围内的网点
$sql = "select uid,mobile,lng,lat from user 
        where lat!=0 and lng!=0 and 
        lat>" . $point['right_bottom']['lat'] . " and 
        lat<" . $point['left_top']['lat'] . " and 
        lng>" . $point['left_top']['lng'] . " and 
        lng<" . $point['right_bottom']['lng'];

3.计算两个坐标的距离

/**
 * 计算两个坐标的距离
 * @param $lng1, $lng2 经度
 * @param $lat1, $lat2 纬度
 * @param int $unit 单位 1:米 2:千米
 * @param int $decimal 精度 保留小数位数
 */
function getDistance($lng1, $lat1, $lng2, $lat2, $unit = 1, $decimal = 2)
{
    $earthdata = 6371;//地球半径,平均半径为6371km
    // 将角度转为狐度
    $radLat1 = deg2rad($lat1); //deg2rad()函数将角度转换为弧度
    $radLat2 = deg2rad($lat2);
    $radLng1 = deg2rad($lng1);
    $radLng2 = deg2rad($lng2);
    $dlat    = $radLat1 - $radLat2;
    $dlng    = $radLng1 - $radLng2;
    $length  = 2 * asin(sqrt(pow(sin($dlat / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($dlng / 2), 2))) * $earthdata*1000;

    if ($unit==2) {
        $length /= 1000;
    }
    $length = round($length, $decimal);
    return $length;
}

//调用
print_r(getDistance(120.1946550000,30.1852870000,113.9441590000,22.5342250000,2));

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咯拉咯啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值