<?php
class Distance
{
const EARTH_RADIUS_AVG = (6378137 + 6356752.3142) / 2;//地球半径 平均值,单位米
/**
* 参数:纬度1,经度1、纬度2.经度2、
* 使用Haversine公式,计算2个经纬度之间的距离。
*
* @param $lat1 纬度1
* @param $lon1 经度1
* @param $lat2 纬度2
* @param $lon2 经度2
* @return float|int 返回距离,单位:米
*/
public static function GetDistance( $lat1, $lon1, $lat2, $lon2)
{
//经纬度转换成弧度
$lat1 = self::GetRadians($lat1);
$lon1 = self::GetRadians($lon1);
$lat2 = self::GetRadians($lat2);
$lon2 = self::GetRadians($lon2);
//差值
$vLon = Abs($lon1 - $lon2);
$vLat = Abs($lat1 - $lat2);
$h = self::HaverSin($vLat) + Cos($lat1) * Cos($lat2) * self::HaverSin($vLon);
$distance = 2 * self::EARTH_RADIUS_AVG * Asin(Sqrt($h));
return $distance;
}
/**
* 将角度换算为弧度
*
* @param $deg 角度
* @return float 弧度
*/
public static function GetRadians( $deg)
{
return PI() * $deg / 180.0;
}
/**
* 半正矢公式(Haversine公式)
*
* @param $theta
* @return float|int
*/
public static function HaverSin($theta)
{
$v = Sin($theta / 2);
return $v * $v;
}
}
$lat1 =39.929377;//纬度1
$lon1=116.408149;//经度1
$lat2=39.920054;//纬度2
$lon2=116.408545;//经度2
echo (new Distance())::GetDistance($lat1,$lon1,$lat2,$lon2); //输出:1036.6413225215(米);如果换算成千米,保留小数点后三位,结果为1.037(千米)
根据在线计算距离工具所得结果和以上代码执行结果一致, 在线计算距离工具计算结果如下图所示:
在线计算方位角网址:方位角在线计算--方位角-距离在线计算器
|