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