两点之间距离 PHP、JS版(美团技术博客算法)

admin2年前他山之石149
/**
 * 计算两点之间距离 有少许可以忽略的误差
 * 两点不能差距太远
 * 适用于 附近商家  附近的人 等距离计算
 * @author tony (*****************)
 * @param $lat1
 * @param $lng1
 * @param $lat2
 * @param $lng2
 * @return string
 */
function pointDistance($lat1, $lng1, $lat2, $lng2)
{
    //地球半径
    $r = 6367000;
    $diffLat = bcsub($lat1, $lat2, 5);
    $diffLng = bcsub($lng1, $lng2, 5);
    $averageLat = bcdiv(($lat1 + $lat2), 2, 5);
    $WEDistance = bcmul(bcmul(deg2rad($diffLng), $r, 5),cos(deg2rad($averageLat)), 5);
    $NSDistance = bcmul($r, deg2rad($diffLat), 5);
    return bcadd(sqrt($WEDistance * $WEDistance + $NSDistance * $NSDistance), 0, 2);
}


        /*计算两点距离 
         * lat1  点1纬度
         * lng1  点1经度
         * lat2  点2纬度
         * lng2  点2经度
         * 
        */ 
        function pointDistance(lat1, lng1, lat2, lng2) {
            var rad2deg = function (r) {
                var degree = r * 180 / Math.PI;
                return degree;
            }
            var deg2rad = function(degree) {
                var r = (degree / 180) * Math.PI;
                return r;
            }
            //地球半径 米 半径越精确计算后的距离越精确
            //var r = 6367000;
            var r = 6378137;
            var diffLat = lat1 - lat2;
            var diffLng = lng1 - lng2;
            var averageLat = (lat1 + lat2) / 2;
            var weDistance = (deg2rad(diffLng) * r) * Math.cos(deg2rad(averageLat))
            var nsDistance = r * deg2rad(diffLat);
            var distance = (Math.sqrt(weDistance * weDistance + nsDistance * nsDistance)).toFixed(2);
            return distance;
        }


相关文章

nginx+php大文件上传参数配置(转)

大文件上传要注意几个环节1,上传文件需要花费较长上传时间和处理执行时间,需要设置nginx上传时间、延攻php执行超时时间2,大文件处理需要占用较大内存,需要增加php内存池,考虑到有多个文件上传处理...

Docker PHP安装扩展步骤详解(转)

前言此篇,主要是演示docker-php-source , docker-php-ext-install ,docker-php-enable-docker-configure 这四个命令到底是用来干...

如何用tun2socks更优雅的实现Linux全局代理(转)

tun2sockstun2socks分支有相当多,如下go-tun2socks(Golang版本)badvpn-tun2socks(C版本 内存占用小)安装badvpn安装很简单,官方有binary源...

KCPTUN参数解释(转)

为什么要使用KCP?高RTT的网络,TCP的三次握手、慢启动是非常影响体验的机制。150ms RTT,使用BBR拥塞控制且网络0丢包的情况下,慢启动到100Mbps至少需要2s,500Mbps至少5s...

linux测试硬盘速度(转)

在Linux下,一条简单的名利'dd'就可以帮我们到达这个目的。以下内容是关于如何使用‘dd’命令来测试USB硬盘的读写速度。1. 测试写速度:$ sudo mou...

dockerfile详解(转)

什么是dockerfile?Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。docker b...

发表评论    

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