php公式,Haversine公式与PHP

小编典典

您使用的公式似乎是反 余弦 而不是 Haversine 公式。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;

}

PS我找不到您的代码中的错误,所以这只是您写的错字$lat= 41.9133741000 $lat= 12.5203944000吗?也许您只是使用$

lat = 12.5203​​944000和$ long = 0进行了计算,因为您重写了$ lat变量。

编辑:

测试了代码,并返回了正确的结果:

$center_lat = 41.8350;

$center_lng = 12.470;

$lat = 41.9133741000;

$lng = 12.5203944000;

// test with your arccosine formula

$distance =( 6371 * acos((cos(deg2rad($center_lat)) ) * (cos(deg2rad($lat))) * (cos(deg2rad($lng) - deg2rad($center_lng)) )+ ((sin(deg2rad($center_lat))) * (sin(deg2rad($lat))))) );

print($distance); // prints 9.662174538188

// test with my haversine formula

$distance = haversineGreatCircleDistance($center_lat, $center_lng, $lat, $lng, 6371);

print($distance); // prints 9.6621745381693

2020-05-29

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值