欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-02 18:50:20
...

 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));