在网上学习了根据经纬度计算距离的代码,很多的例子。特整理一份并且已经验证。
/**
* 根据两点间的经纬度计算距离
* @param $lng1
* @param $lat1
* @param $lng2
* @param $lat2
* @return int
*/
public static function getDistance($lng1, $lat1, $lng2, $lat2)
{
//将角度转为狐度
$radLat1 = deg2rad($lat1);//deg2rad()函数将角度转换为弧度
$radLat2 = deg2rad($lat2);
$radLng1 = deg2rad($lng1);
$radLng2 = deg2rad($lng2);
$a = $radLat1 - $radLat2;
$b = $radLng1 - $radLng2;
$s = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2))) * 6378.137 * 1000;
return $s;
}
PS :
1 、返回的结果单位 m 。
2 、测试 Google 地图经纬度和百度地图经纬度差 1m 左右。
详情地址: http://blog.mofeiwo.com/?p=408
欢迎指导。
1
fising 2016-01-11 14:35:07 +08:00
这些不都是很成熟的东西了么
|
3
imxz 2016-01-11 14:54:02 +08:00
你可能没有考虑地球并不是一个完美的圆的问题。经纬度转距离跟所在位置是有关的。
|
5
BOYPT 2016-01-11 15:02:11 +08:00 1
楼主辛苦了
要是我的话,直接 google 搜索几个词"php distance longitude latitude" 第一个结果就是 https://www.geodatasource.com/developers/php |
7
mofeiwo OP @BOYPT 。测试了两个方法。发现 https://www.geodatasource.com/developers/php 方法返回的结果不对。
使用的百度坐标是 118.703006,30.071796,118.834940,30.140164 。分别为龙须山和蓝天凹。 从百度地图返回的距离是 14.9KM 左右。 www.geodatasource.com 中的方法返回的是 0.9m 。 文章中的方法返回的是: 14.8KM 。 |
8
BOYPT 2016-01-11 16:32:10 +08:00
@mofeiwo 那可能你算法更准吧,按你的数据,我用 geo 的程序结果是:
echo distance(118.703006,30.071796,118.834940,30.140164, "K"); //15.119024532788 KM 0.9 其实是 statute miles ,不是米。 |
9
BOYPT 2016-01-11 16:35:28 +08:00
误差应该出在英里和公里的转换上, geo 的算法是以英里为基准的魔数 1.1515 ,而楼主的魔数 6378.137 是基于公里的;因此在公里为单位上,楼主的结果更准确;而如果在英里单位 i ,应当 geo 的更准了;
其实代码都一样。 |
10
hahasong 2016-01-11 16:37:51 +08:00
已经成熟的算法,网上大把,前几天刚看了一个。三角函数计算很消耗性能,有种优化的方案是只用一个 cos ,但是对精度几乎没有影响
|
11
seki 2016-01-11 16:39:21 +08:00
haversine 公式嘛
|
12
mofeiwo OP @BOYPT
地址中方法 distance($lat1, $lon1, $lat2, $lon2, $unit)。经纬度写反了。 按照你的写法返回结果 15.119024533086KM 。 两个方法计算方式不一样。不知道其他的情况哪个更准确了。 |
15
Plumes 2016-01-11 16:59:49 +08:00
sin , cos 这些最好是使用泰勒级数展开吧,取到 o(x^3) 就可以了
|
17
ty0716 2016-01-11 22:17:59 +08:00
这种距离没啥意义,计算实际路线到达距离才是正解
|
19
NCE 2016-01-12 09:06:33 +08:00
我觉得很有意义。
|
20
NCE 2016-01-12 09:07:09 +08:00
再就是,百度的坐标并不是正规的经纬度,,,这个不要和谷歌的搞混。
|