当我们需要计算两个经纬度之间的距离时,有多种编程语言和算法可以选择,其中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实现计算两个经纬度之间距离的方法
基础教程推荐
- 解析PHP之提取多维数组指定列的方法 2024-02-05
- PHP微商城开源代码实例 2023-01-04
- Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例 2023-03-01
- laravel 实现关闭CSRF(全部关闭、部分关闭) 2023-03-03
- 浅谈PHP中pack、unpack的详细用法 2022-10-08
- PHP7新增运算符用法实例分析 2023-12-18
- PHP实现将上传图片自动缩放到指定分辨率,并保持清晰度封装类示例 2023-01-20
- php中的常见攻击解读 2023-07-03
- 使用PHP+Redis实现延迟任务,实现自动取消订单功能 2023-03-13
- PHP 7.4 新语法之箭头函数实例详解 2023-01-14