当前位置:首页 > 网站建设 > 源码技巧 > 正文内容

PHP根据经纬度,计算2点之间的距离的2种方法

热淘网3年前 (2018-08-21)源码技巧793
/**
 * @param $lat1
 * @param $lng1
 * @param $lat2
 * @param $lng2
 * @return int
 */
function getDistance($lat1, $lng1, $lat2, $lng2){

    //将角度转为狐度

    $radLat1=deg2rad($lat1);//deg2rad()函数将角度转换为弧度

    $radLat2=deg2rad($lat2);

    $radLng1=deg2rad($lng1);

    $radLng2=deg2rad($lng2);

    $a=$radLat1-$radLat2;

    $b=$radLng1-$radLng2;

    $s=2*asin(sqrt(pow(sin($a/2),2)+cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)))*6378.137;

    return $s;

}

/**
 * @param $lat1
 * @param $lon1
 * @param $lat2
 * @param $lon2
 * @param float $radius  星球半径
 * @return float
 */
function distance($lat1, $lon1, $lat2,$lon2,$radius = 6378.137)
{
    $rad = floatval(M_PI / 180.0);

    $lat1 = floatval($lat1) * $rad;
    $lon1 = floatval($lon1) * $rad;
    $lat2 = floatval($lat2) * $rad;
    $lon2 = floatval($lon2) * $rad;

    $theta = $lon2 - $lon1;

    $dist = acos(sin($lat1) * sin($lat2) +
                cos($lat1) * cos($lat2) * cos($theta)
            );

    if ($dist < 0 ) {
        $dist += M_PI;
    }

    return $dist = $dist * $radius;
}
$lat1 = '31.253411';
$lon1 = '121.518998';

$lat2 = '31.277117';
$lon2 = '120.744587';

echo getDistance($lat1, $lon1, $lat2, $lon2);  // 73.734589823361

echo distance($lat1, $lon1, $lat2, $lon2);   // 73.734589823354

整理后完善的相关方法

/**
 * 计算两点地理坐标之间的距离
 * @param  Decimal $longitude1 起点经度
 * @param  Decimal $latitude1  起点纬度
 * @param  Decimal $longitude2 终点经度 
 * @param  Decimal $latitude2  终点纬度
 * @param  Int     $unit       单位 1:米 2:公里
 * @param  Int     $decimal    精度 保留小数位数
 * @return Decimal
 */
function getDistance($longitude1, $latitude1, $longitude2, $latitude2, $unit=1, $decimal=0){

    $EARTH_RADIUS = 6370.996; // 地球半径系数
    $PI = 3.1415926;

    $radLat1 = $latitude1 * $PI / 180.0;
    $radLat2 = $latitude2 * $PI / 180.0;

    $radLng1 = $longitude1 * $PI / 180.0;
    $radLng2 = $longitude2 * $PI /180.0;

    $a = $radLat1 - $radLat2;
    $b = $radLng1 - $radLng2;

    $distance = 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1) * cos($radLat2) * pow(sin($b/2),2)));
    $distance = $distance * $EARTH_RADIUS * 1000;

    if($unit==2){
        $distance = $distance / 1000;
    }

    return round($distance, $decimal);

}

<p>扫描二维码推送至手机访问。</p><p>版权声明:本文由<strong>网站标题</strong>发布,如需转载请注明出处。</p>

本文链接:https://www.retao5.com/yuanma/1313.html

分享给朋友:

相关文章

ECshop放大镜代码

ECshop放大镜代码

以gbk默认模版为例:1.解压把mz-packed.js放到ecshop网店文档目录(不是模版目录)的js文件夹里头。2.用记事本或者其他编辑器打开拷贝MagicZoom.css样式到style.cs...

php利用PHP QR Code生成二维码(带logo)

php利用PHP QR Code生成二维码(带logo)

我们要生成二维码都需要借助一些类库来实现了,下面我介绍利用PHP QR Code生成二维码吧,生成方法很简单,下面我来介绍一下。利用php类库PHP QR Code来实现,不需要装额外的php扩展首先...

DIY模块模板语法详解

DIY模块模板语法详解

基本语句        [loop]...[/loop]标签来循环显示模块中的数据;如果要在模板中多处循环可以使用[loop1]...[/l...

php 自带过滤和转义函数及各种编码解码函数

php 自带过滤和转义函数及各种编码解码函数

 php 自带过滤和转义函数及各种编码解码函数,html标签过滤,url编码,URL解码函数名释义介绍htmlspecialchars将与、单双引号、大于和小于号化成HTML格式&转...

设为主页代码及添加到收藏夹代码大全(详解)

设为主页代码及添加到收藏夹代码大全(详解)

关闭网页时弹出设为主页对话框代码:复制代码 <BODY id=iehomepageonunload="iehomepage.style.behavior='url(#defau...

php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串

php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串

$str="你好<我>(爱)[北京]{天安门}";echo f1($str); //返回你好 echo f2($str); //返回我 echo f3($str); /...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。