golang与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实现计算两个经纬度之间距离的方法 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 详解PHP数组赋值方法

    关于“详解PHP数组赋值方法”的完整攻略,我可以这样来讲解: 标题 (1)数组基础知识 在介绍PHP数组赋值方法之前,我们需要先了解一些数组的基础知识。数组是一种用来存储多个相同或不同类型的元素的数据结构。在PHP中,数组是一种容器,它能够容纳其他类型数据,包括标量、对象、数组等等。 PHP中的数组类型分为两种:索引数组和关联数组。索引数组使用数字下标来访问…

    PHP 2023年5月26日
    00
  • php实现数组按拼音顺序排序的方法 原创

    以下是“php实现数组按拼音顺序排序的方法 原创”的完整攻略。 1. 问题描述 在php开发中,我们常常会遇到需要将数组按照拼音顺序排序的需求,例如需要对一批中文姓名进行按拼音排序,或者需要对某个分类下的一些中文词汇进行按拼音排序。那么,在php实现一个数组按拼音顺序排序应该怎样实现呢? 2. 实现方法 2.1 导入pinyin类库 首先,我们需要使用拼音处…

    PHP 2023年5月26日
    00
  • PHP获取HTTP body内容的方法

    想要获取HTTP请求的body内容,可以通过PHP内置的$_POST、$_GET、$_REQUEST来获取。这些变量是自动解析并收集HTTP请求内容的关联数组,其中$_POST是存放POST请求的参数,$_GET是存放GET请求的参数,而$_REQUEST则是使用POST或GET请求发送的参数都能够获取。 但如果需要获取HTTP请求的原始body内容,需要使…

    PHP 2023年5月26日
    00
  • WIN2003+IIS6 PHP 5.3.8安装配置教程[图文]

    以下是WIN2003 + IIS6 PHP 5.3.8安装配置的完整攻略: 步骤一: 安装IIS6 安装IIS6需要使用”控制面板” > “添加/删除程序”。在”添加/删除程序”的左边选择”添加/删除Windows组件”,然后勾选”Internet Information Services (IIS)”,点击”下一步”之后进行安装,完成后重启Windo…

    PHP 2023年5月24日
    00
  • 关于PHP堆栈与列队的学习

    关于PHP堆栈与队列的学习 堆栈(Stack) 堆栈(Stack)是一种数据结构,它基于“先进后出”的顺序管理数据。在堆栈中,只有栈顶顶端的数据可以被读取或删除,任何其他数据必须先被删除才能访问栈顶的数据。 堆栈的实现 PHP中的堆栈可以通过数组实现,可以使用 array_pop() 函数将元素从堆栈顶部删除,使用 array_push() 函数将元素添加到…

    PHP 2023年5月26日
    00
  • 正则表达式口诀 正则表达式学习工具

    正则表达式是一种用来匹配字符串的工具,它在文本处理中非常常用。正则表达式口诀是一种线上的学习工具,可以辅助用户学习正则表达式。下面我将详细介绍如何使用这个工具。 正则表达式口诀使用攻略 1. 进入正则表达式口诀官网 进入正则表达式口诀官网,打开页面后可以看到一个包含文字和图示的输入框。 2. 输入要匹配的正则表达式 将想要匹配的正则表达式输入到输入框中,可以…

    PHP 2023年5月28日
    00
  • uni-app路由配置文件pages.json平台化拆分

    uni-app 是一个跨平台开发框架,可以将一个代码库编译成多个平台的小程序、H5、APP等。而 pages.json 就是 uni-app 项目中用于配置页面的路由配置文件,它可以帮助我们对应用进行页面的管理,包括页面路径、页面标题、页面导航栏颜色等。 但是,在跨平台开发过程中,不同平台的页面需求是不一样的。比如,在微信小程序中,可以使用原生导航栏进行页面…

    PHP 2023年5月30日
    00
  • 微信小程序 表单Form实例详解(附源码)

    下面我就来详细讲解“微信小程序 表单Form实例详解(附源码)”的完整攻略。 一、前言 在微信小程序的开发中,表单是非常常见的功能之一,而表单的开发需要使用到 Form 组件。本文将详细讲解微信小程序中的 Form 组件,并提供具体的实例与源码以供参考。 二、Form组件的介绍 Form 组件是微信小程序中的表单组件,它主要用于收集用户的输入数据,并进行数据…

    PHP 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部