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

yizhihongxing

当我们需要计算两个经纬度之间的距离时,有多种编程语言和算法可以选择,其中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实现递归抓取网页类实例”的完整攻略。 确定需要爬取页面的URL 在开始抓取页面之前,首先需要确定需要爬取的网页地址。一种常见的方式是使用一个数组来存储这些地址,例如: $url_list = array( ‘https://example.com/page1’, ‘https://example.com/page2’, ‘https://…

    PHP 2023年5月27日
    00
  • php 操作excel文件的方法小结

    下面是“php 操作excel文件的方法小结”的完整攻略: 一、前言 Microsoft Excel 是一款功能强大的电子表格软件,不仅在办公用途中很常用,而且在数据分析和处理方面也有着很广泛的应用。本文介绍如何使用 PHP 来操作 Excel 文件。 二、操作 Excel 文件 1. 使用 PHPExcel 库 PHPExcel 是 PHP 操作 Exce…

    PHP 2023年5月26日
    00
  • php去除换行符的方法小结(PHP_EOL变量的使用)

    下面是详细讲解“php去除换行符的方法小结(PHP_EOL变量的使用)”的完整攻略: 什么是PHP_EOL PHP_EOL 是 PHP 中的预定义常量,代表不同操作系统下的换行符。例如在 Windows 系统中,换行符为 \r\n,而在 Unix/Linux 系统中,换行符为 \n。 如何使用PHP_EOL 为了能够正确地去除换行符,我们需要根据当前操作系统…

    PHP 2023年5月26日
    00
  • PHP判断一个数组是另一个数组子集的方法详解

    首先,判断一个数组是否是另一个数组的子集,可以使用PHP的内置函数array_diff()来进行比较。 array_diff()函数 array_diff()函数可以用来比较两个数组的差异,在比较时,将第一个数组作为参照,将第二个数组与其进行比较,并返回差异值。 示例代码: php$arr1 = array(‘apple’, ‘orange’, ‘banan…

    PHP 2023年5月26日
    00
  • PHP实现LRU算法的原理详解

    PHP实现LRU算法的原理详解 什么是LRU算法 LRU(Least Recently Used)是一种缓存算法,它的过期规则是:缓存空间满时,优先淘汰最近最少使用的缓存数据。即在一段时间内,如果某个数据没有被访问到,那么接下来它被访问到的几率也很小,就可以被淘汰掉。可以理解为”长时间不用的东西,就扔掉”。 LRU算法原理 LRU算法可以通过哈希表和双向链表…

    PHP 2023年5月27日
    00
  • PHP实现简单实用的分页类代码

    这里是实现PHP分页类的攻略。 第一步:创建类文件 首先,我们需要拥有一个类文件,定义一个Pagination类。该类具有以下属性: $pageNums:总页数 $pageSize:每页显示数据的数量 $currentPage:当前页面 $totalNums:总记录数 除此之外,类中还需要包含公共方法用于获取总页数、总记录数及当前页数据。 class Pag…

    PHP 2023年5月27日
    00
  • php curl选项列表(超详细)

    下面就为你详细讲解 “Php curl选项列表(超详细)” 的攻略。 什么是 Curl? CURL 是一个开源的免费工具,可以在各种操作系统上用来传输或接收文件、数据等。同时, CURL 也是一个非常强大的命令行工具,通过 CURL 可以实现 HTTP、FTP、SMTP、POP3 等协议的请求。 在 PHP 语言中, CURL 也是一个非常重要的扩展,并用于…

    PHP 2023年5月27日
    00
  • PDO实现学生管理系统

    实现一个学生管理系统,需要使用数据库来存储学生的信息,而PHP提供了许多不同的数据库接口,其中PDO是一个流行的选择,因为它提供了一个统一的方式访问多种不同类型的数据库。 下面是实现PDO学生管理系统的完整攻略: 创建数据库表 首先需要创建一个包含学生信息的数据表。例如,可以创建一个名为“students”的表,包含学生的姓名、年龄、性别、成绩等字段。在执行…

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