嗨,我需要计算具有经度和纬度的两个点之间的距离。
我想避免对外部API的任何调用。
我试图在PHP中实现Haversine公式:
这是代码:
class CoordDistance
{
public $lat_a = 0;
public $lon_a = 0;
public $lat_b = 0;
public $lon_b = 0;
public $measure_unit = 'kilometers';
public $measure_state = false;
public $measure = 0;
public $error = '';
public function DistAB()
{
$delta_lat = $this->lat_b - $this->lat_a ;
$delta_lon = $this->lon_b - $this->lon_a ;
$earth_radius = 6372.795477598;
$alpha = $delta_lat/2;
$beta = $delta_lon/2;
$a = sin(deg2rad($alpha)) * sin(deg2rad($alpha)) + cos(deg2rad($this->lat_a)) * cos(deg2rad($this->lat_b)) * sin(deg2rad($beta)) * sin(deg2rad($beta)) ;
$c = asin(min(1, sqrt($a)));
$distance = 2*$earth_radius * $c;
$distance = round($distance, 4);
$this->measure = $distance;
}
}
用一些距离公共的给定点进行测试,我没有得到可靠的结果。
我不知道原始公式或实现中是否有错误
不久前,我写了一个haversine公式的示例,并将其发布在我的网站上:
/**
* Calculates the great-circle distance between two points, with
* the Haversine formula.
* @param float $latitudeFrom Latitude of start point in [deg decimal]
* @param float $longitudeFrom Longitude of start point in [deg decimal]
* @param float $latitudeTo Latitude of target point in [deg decimal]
* @param float $longitudeTo Longitude of target point in [deg decimal]
* @param float $earthRadius Mean earth radius in [m]
* @return float Distance between points in [m] (same as earthRadius)
*/
function haversineGreatCircleDistance(
$latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 6371000)
{
// convert from degrees to radians
$latFrom = deg2rad($latitudeFrom);
$lonFrom = deg2rad($longitudeFrom);
$latTo = deg2rad($latitudeTo);
$lonTo = deg2rad($longitudeTo);
$latDelta = $latTo - $latFrom;
$lonDelta = $lonTo - $lonFrom;
$angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) +
cos($latFrom) * cos($latTo) * pow(sin($lonDelta / 2), 2)));
return $angle * $earthRadius;
}
➽请注意,返回的距离与使用参数传入时所用的单位相同$earthRadius
。默认值为6371000米,因此结果也将以[m]为单位。要获得以英里为单位的结果,您可以例如传递3959英里,$earthRadius
结果将以[mi]为单位。我认为,如果没有特殊原因,坚持SI单位是个好习惯。
编辑:
正如TreyA正确指出的那样,由于舍入误差,Haversine公式在对映点上具有弱点(尽管对于短距离而言
是 稳定的)。要绕过它们,可以改用Vincenty公式。
/**
* Calculates the great-circle distance between two points, with
* the Vincenty formula.
* @param float $latitudeFrom Latitude of start point in [deg decimal]
* @param float $longitudeFrom Longitude of start point in [deg decimal]
* @param float $latitudeTo Latitude of target point in [deg decimal]
* @param float $longitudeTo Longitude of target point in [deg decimal]
* @param float $earthRadius Mean earth radius in [m]
* @return float Distance between points in [m] (same as earthRadius)
*/
public static function vincentyGreatCircleDistance(
$latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 6371000)
{
// convert from degrees to radians
$latFrom = deg2rad($latitudeFrom);
$lonFrom = deg2rad($longitudeFrom);
$latTo = deg2rad($latitudeTo);
$lonTo = deg2rad($longitudeTo);
$lonDelta = $lonTo - $lonFrom;
$a = pow(cos($latTo) * sin($lonDelta), 2) +
pow(cos($latFrom) * sin($latTo) - sin($latFrom) * cos($latTo) * cos($lonDelta), 2);
$b = sin($latFrom) * sin($latTo) + cos($latFrom) * cos($latTo) * cos($lonDelta);
$angle = atan2(sqrt($a), $b);
return $angle * $earthRadius;
}
本文向大家介绍php如何计算两坐标点之间的距离,包括了php如何计算两坐标点之间的距离的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了php计算两坐标点之间距离的实现代码,供大家参考,具体内容如下 地球上两个点之间,可近可远。 当比较近的时候,可以忽略球面因素,当做是一个平面,这样就有了两种计算方法。 小编再为大家分享一段php坐标之间距离的求解代码: 以上就是本文的全部内容,希望对
本文向大家介绍PHP计算百度地图两个GPS坐标之间距离的方法,包括了PHP计算百度地图两个GPS坐标之间距离的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP计算百度地图两个GPS坐标之间距离的方法。分享给大家供大家参考。 具体实现方法如下: 希望本文所述对大家的php程序设计有所帮助。
我试图将X Y Z变量的数组或列表传递给计算欧几里德距离的方法。 这是我的方法: 这是我的主要代码: 输出为:1.7782794。。应该是10的时候。有什么想法吗?
问题内容: 我有一个文本文件,如下所示 我想计算两个α碳原子之间的距离,即计算第一个和第二个原子之间的距离,然后计算第二个和第三个原子之间的距离,依此类推.....两个原子之间的距离可以表示为: 7,8和9列分别代表x,y和z坐标。我需要打印距离和对应的残基对(第4列),如下所示(距离的值不是实数) 如何使用Perl或python进行此计算? 问题答案: 如果您的数据用空格隔开,那么简单就可以完成
本文向大家介绍php两点地理坐标距离的计算方法,包括了php两点地理坐标距离的计算方法的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了php计算两点地理坐标距离的具体代码,供大家参考,具体内容如下 功能:根据圆周率和地球半径系数与两点坐标的经纬度,计算两点之间的球面距离。 获取两点坐标距离: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
本文向大家介绍java实现计算地理坐标之间的距离,包括了java实现计算地理坐标之间的距离的使用技巧和注意事项,需要的朋友参考一下 java实现计算两经纬度点之间的距离,直接上代码,具体解释请参考注释 以上就是本文的全部内容了,希望大家能够喜欢。