golang与php实现计算两个经纬度之间距离的方法

当我们需要计算两个经纬度之间的距离时,有多种编程语言和算法可以选择,其中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实现计算两个经纬度之间距离的方法

基础教程推荐