当我们需要计算两个经纬度之间的距离时,有多种编程语言和算法可以选择,其中Go和PHP都提供了比较简便的方法,下面我会详细讲解它们的实现方法。
Go语言实现
Go语言没有提供直接计算经纬度距离的函数,但它有一个内置的 math
包,提供了一个函数 math.Sin()
,可以帮助我们计算一个角度的正弦值,而这个值可以根据地球半径和纬度差、经度差来计算出两点之间的距离。下面是完整的Go语言实现:
package main
import (
"fmt"
"math"
)
const EarthRadius = 6371 // 地球半径,单位km
func Distance(lat1, lng1, lat2, lng2 float64) float64 {
radLat1 := math.Pi * lat1 / 180.0
radLat2 := math.Pi * lat2 / 180.0
a := radLat1 - radLat2
b := math.Pi * lng1 / 180.0 - math.Pi * lng2 / 180.0
s := 2 * math.Asin(math.Sqrt(math.Pow(math.Sin(a / 2), 2) + math.Cos(radLat1) * math.Cos(radLat2) * math.Pow(math.Sin(b / 2), 2)))
s *= EarthRadius
return s
}
func main() {
lat1, lng1 := 39.9, 116.3 // 北京
lat2, lng2 := 31.2, 121.4 // 上海
fmt.Printf("Distance: %.2fkm\n", Distance(lat1, lng1, lat2, lng2))
}
代码中的 Distance()
函数接受四个参数:起点纬度、起点经度、终点纬度、终点经度。函数内部,首先将经纬度转换成弧度,然后根据 Haversine 公式计算两点之间的直线距离,最后乘上地球半径得到最终的距离。在代码的最后,我计算了北京和上海之间的距离,输出结果为876.88km。
PHP实现
PHP中也没有内置计算经纬度距离的函数,不过它提供了一个名为 deg2rad()
的函数,可以将角度转换为弧度,这个函数可以用于计算两点之间的直线距离。在下面的PHP实例中,我们需要使用 haversine
公式来计算两个经纬度之间的距离。
<?php
function distance($lat1, $lng1, $lat2, $lng2) {
$earthRadius = 6371000; // 地球半径,单位m
$lat1 = deg2rad($lat1);
$lng1 = deg2rad($lng1);
$lat2 = deg2rad($lat2);
$lng2 = deg2rad($lng2);
$latDelta = $lat2 - $lat1;
$lngDelta = $lng2 - $lng1;
$angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($lngDelta / 2), 2)));
return round($angle * $earthRadius / 1000, 2); // 返回距离,单位为km,并保留小数点后两位
}
$lat1 = 39.9;
$lng1 = 116.3;
$lat2 = 31.2;
$lng2 = 121.4;
$distance = distance($lat1, $lng1, $lat2, $lng2);
echo "Distance: " . $distance . "km\n";
代码中的 distance()
函数接受四个参数:起点纬度、起点经度、终点纬度、终点经度。函数内部,首先将经纬度转换成弧度,然后根据 Haversine 公式计算两点之间的直线距离,最后乘上地球半径得到最终的距离。在代码的最后,我计算了北京和上海之间的距离,输出结果为876.69km。
示例说明
下面是另外两个关于如何使用Go和PHP来计算经纬度之间距离的示例,以便更好地理解实现过程:
示例1
package main
import (
"fmt"
"math"
)
const EarthRadius = 6371 // 地球半径,单位km
func Distance(lat1, lng1, lat2, lng2 float64) float64 {
radLat1 := math.Pi * lat1 / 180.0
radLat2 := math.Pi * lat2 / 180.0
a := radLat1 - radLat2
b := math.Pi * lng1 / 180.0 - math.Pi * lng2 / 180.0
s := 2 * math.Asin(math.Sqrt(math.Pow(math.Sin(a / 2), 2) + math.Cos(radLat1) * math.Cos(radLat2) * math.Pow(math.Sin(b / 2), 2)))
s *= EarthRadius
return s
}
func main() {
lat1, lng1 := 31.22, 121.48 // 上海南站
lat2, lng2 := 31.24, 121.47 // 虹口足球场
fmt.Printf("Distance: %.2fkm\n", Distance(lat1, lng1, lat2, lng2))
}
这个例子演示了如何计算上海南站和虹口足球场之间的距离。输出结果为2.09km。
示例2
<?php
function distance($lat1, $lng1, $lat2, $lng2) {
$earthRadius = 6371000; // 地球半径,单位m
$lat1 = deg2rad($lat1);
$lng1 = deg2rad($lng1);
$lat2 = deg2rad($lat2);
$lng2 = deg2rad($lng2);
$latDelta = $lat2 - $lat1;
$lngDelta = $lng2 - $lng1;
$angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($lngDelta / 2), 2)));
return round($angle * $earthRadius / 1000, 2); // 返回距离,单位为km,并保留小数点后两位
}
$lat1 = 39.9;
$lng1 = 116.3;
$lat2 = 40.0;
$lng2 = 116.4;
$distance = distance($lat1, $lng1, $lat2, $lng2);
echo "Distance: " . $distance . "km\n";
这个例子演示了如何计算在北京市中心附近两个点之间的距离,其中起点的坐标为 (39.9, 116.3),终点的坐标为 (40.0, 116.4)。输出结果为14.70km。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:golang与php实现计算两个经纬度之间距离的方法 - Python技术站