当我们需要计算两个经纬度之间的距离时,有多种编程语言和算法可以选择,其中Go和PHP都提供了比较简便的方法,下面我会详细讲解它们的实现方法。
当我们需要计算两个经纬度之间的距离时,有多种编程语言和算法可以选择,其中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实现计算两个经纬度之间距离的方法
- thinkphp实现数组分页示例 2023-12-30
- 如何使用PHP对象POPO来优化你的代码 2022-09-01
- Thinkphp页面跳转设置跳转等待时间的操作 2023-03-02
- PHP判断当前使用的是什么浏览器(推荐) 2023-03-12
- 分享几种好用的PHP自定义加密函数(可逆/不可逆) 2023-05-02
- 解决PHP报错cURL Error #:SSL certificate problem: unable to get local issuer certificate 2023-08-30
- 如何用Laravel包含你自己的帮助函数 2023-06-12
- Lnmp修改php.ini配置以及使exec()函数可用 2023-09-01
- ThinkPHP5.1框架数据库链接和增删改查操作示例 2023-01-31
- laravel中数据显示方法(默认值和下拉option默认选中) 2023-02-22