栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在PHP中测量两个坐标之间的距离

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在PHP中测量两个坐标之间的距离

不久前,我写了一个haversine公式的示例,并将其发布在我的网站上:

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公式。

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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/597057.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号