php经纬度怎么算距离
-
PHP经纬度怎么算距离?
在PHP中,计算经纬度之间的距离可以使用Haversine公式或Vincenty公式。下面分别介绍这两种方法的实现。
1. Haversine公式
Haversine公式是一种简化的计算地球上两点之间距离的方法,适用于短距离计算。该公式的原理是根据点与地球中心的夹角来计算距离。“`php
function distanceHaversine($lat1, $lon1, $lat2, $lon2) {
$earthRadius = 6371; // 地球半径,单位为千米
$dLat = deg2rad($lat2 – $lat1);
$dLon = deg2rad($lon2 – $lon1);
$a = sin($dLat / 2) * sin($dLat / 2) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * sin($dLon / 2) * sin($dLon / 2);
$c = 2 * atan2(sqrt($a), sqrt(1 – $a));
$distance = $earthRadius * $c;
return $distance;
}
“`使用示例:
“`php
$lat1 = 39.904202;
$lon1 = 116.407394;
$lat2 = 31.230393;
$lon2 = 121.473704;$distance = distanceHaversine($lat1, $lon1, $lat2, $lon2);
echo “两点之间的距离为:” . round($distance, 2) . “千米”;
“`2. Vincenty公式
Vincenty公式是一种更精确的计算地球上两点之间距离的方法,适用于长距离计算。该公式考虑了地球的椭球形状,并考虑了地球离正球体的偏离程度。“`php
function distanceVincenty($lat1, $lon1, $lat2, $lon2) {
$earthRadius = 6371; // 地球半径,单位为千米
$a = 6378137; // 长半轴
$b = 6356752.3142; // 短半轴
$f = 1 / 298.257223563; // 扁率
$L = deg2rad($lon2 – $lon1);
$U1 = atan((1 – $f) * tan(deg2rad($lat1)));
$U2 = atan((1 – $f) * tan(deg2rad($lat2)));
$sinU1 = sin($U1);
$cosU1 = cos($U1);
$sinU2 = sin($U2);
$cosU2 = cos($U2);$lambda = $L;
$lambdaP = 2 * pi();
$iterLimit = 100;
while (abs($lambda – $lambdaP) > 1e-12 && $iterLimit > 0) {
$sinLambda = sin($lambda);
$cosLambda = cos($lambda);
$sinSigma = sqrt(($cosU2 * $sinLambda) * ($cosU2 * $sinLambda) + ($cosU1 * $sinU2 – $sinU1 * $cosU2 * $cosLambda) * ($cosU1 * $sinU2 – $sinU1 * $cosU2 * $cosLambda));
if ($sinSigma == 0) {
return 0; // 两点重合
}
$cosSigma = $sinU1 * $sinU2 + $cosU1 * $cosU2 * $cosLambda;
$sigma = atan2($sinSigma, $cosSigma);
$sinAlpha = ($cosU1 * $cosU2 * $sinLambda) / ($sinSigma);
$cosSqAlpha = 1 – $sinAlpha * $sinAlpha;
$cos2SigmaM = $cosSigma – 2 * ($sinU1 * $sinU2) / $cosSqAlpha;
$C = $f / 16 * $cosSqAlpha * (4 + $f * (4 – 3 * $cosSqAlpha));
$lambdaP = $lambda;
$lambda = $L + (1 – $C) * $f * $sinAlpha * ($sigma + $C * $sinSigma * ($cos2SigmaM + $C * $cosSigma * (-1 + 2 * $cos2SigmaM * $cos2SigmaM)));
$iterLimit–;
}if ($iterLimit == 0) {
return false; // 计算失败
}$uSq = $cosSqAlpha * ($a * $a – $b * $b) / ($b * $b);
$A = 1 + $uSq / 16384 * (4096 + $uSq * (-768 + $uSq * (320 – 175 * $uSq)));
$B = $uSq / 1024 * (256 + $uSq * (-128 + $uSq * (74 – 47 * $uSq)));
$deltaSigma = $B * $sinSigma * ($cos2SigmaM + $B / 4 * ($cosSigma * (-1 + 2 * $cos2SigmaM * $cos2SigmaM)
– $B / 6 * $cos2SigmaM * (-3 + 4 * $sinSigma * $sinSigma) * (-3 + 4 * $cos2SigmaM * $cos2SigmaM)));$distance = $b * $A * ($sigma – $deltaSigma);
return $distance;
}
“`使用示例:
“`php
$lat1 = 39.904202;
$lon1 = 116.407394;
$lat2 = 31.230393;
$lon2 = 121.473704;$distance = distanceVincenty($lat1, $lon1, $lat2, $lon2);
echo “两点之间的距离为:” . round($distance, 2) . “千米”;
“`以上就是在PHP中计算经纬度之间距离的两种方法,你可以根据实际需求选择适合的方法来计算距离。
2年前 -
计算经纬度之间的距离是一个常见的问题,有许多方法可以求解。下面介绍几种常见的方法。
1. 使用球面三角法计算距离:这是一个基于球面三角学的方法,将地球看作一个球体,将经纬度转换为球面坐标,并利用三角关系来计算两点之间的距离。该方法适用于较短距离的计算,但由于地球并非完全球形,所以在较长距离的计算中可能会有一定误差。
2. 使用Vincenty公式计算距离:Vincenty公式是一种更精确的球面三角计算方法,根据椭球体的参数来计算两点之间的距离。该方法考虑了地球的椭球形状,适用于任意两点间的距离计算,并且在较短距离和较长距离的计算中都能提供较高的精度。
3. 使用Haversine公式计算距离:Haversine公式是一种基于球面三角法的简化方法,将地球看作一个完全球形,并且忽略了地球的椭球形状。该方法适用于较短距离的计算,并且在计算速度方面较快,但在较长距离的计算中可能会有一定误差。
4. 使用Google Maps API计算距离:Google Maps API提供了一个方便的接口,可以根据两个地点的经纬度来计算它们之间的距离。该方法利用了Google地图中的路线规划和导航功能,可以计算最短路径上的距离,适用于需要考虑实际道路网络的情况。
5. 使用第三方库计算距离:除了上述方法,还有许多第三方库提供了经纬度计算距离的功能,例如GDAL、Proj4等。这些库提供了更多的功能和选项,可以满足不同的应用需求。使用这些库可以更加方便地实现经纬度的距离计算。
2年前 -
经纬度是用来表示地球上任意一点位置的坐标,通常表示为纬度(Latitude)和经度(Longitude)。计算两个经纬度之间的距离可以利用数学算法,其中最常用的方法是使用Haversine公式。
Haversine公式是一个基于球面三角形的计算方法,可以使用经纬度信息来估算两个地点之间的距离。该公式基于假设地球是一个完美的球体,因此可以用简单的三角形来近似描述地球的形状。
下面是一种通过php计算经纬度之间距离的方法:
1. 引入必要的数学函数和常量
“`php
2年前