计算两个经纬度之间的距离

hykeda4年前JS1805

PHP计算:

#lng为经度,lat为纬度,一定不要弄错了哦
function distance($lat1, $lng1, $lat2, $lng2){
    return (2*ATAN2(SQRT(SIN(($lat1-$lat2)*PI()/180/2)
    *SIN(($lat1-$lat2)*PI()/180/2)+
    COS($lat2*PI()/180)*COS($lat1*PI()/180)
    *SIN(($lng1-$lng2)*PI()/180/2)
    *SIN(($lng1-$lng2)*PI()/180/2)),
    SQRT(1-SIN(($lat1-$lat2)*PI()/180/2)
    *SIN(($lat1-$lat2)*PI()/180/2)
    +COS($lat2*PI()/180)*COS($lat1*PI()/180)
    *SIN(($lng1-$lng2)*PI()/180/2)
    *SIN(($lng1-$lng2)*PI()/180/2))))*6378140;
}

mysql计算:

set @lng1=116.3899;
set @lat1=39.91578;
set @lng2=116.3904;
set @lat2=39.91576; 
select (2*ATAN2(SQRT(SIN((@lat1-@lat2)*PI()/180/2)  
        *SIN((@lat1-@lat2)*PI()/180/2)+  
        COS(@lat2*PI()/180)*COS(@lat1*PI()/180)  
        *SIN((@lng1-@lng2)*PI()/180/2)  
        *SIN((@lng1-@lng2)*PI()/180/2)),  
        SQRT(1-SIN((@lat1-@lat2)*PI()/180/2)  
        *SIN((@lat1-@lat2)*PI()/180/2)  
        +COS(@lat2*PI()/180)*COS(@lat1*PI()/180)  
        *SIN((@lng1-@lng2)*PI()/180/2)  
        *SIN((@lng1-@lng2)*PI()/180/2))))*6378140;

google给的解决方案(基于公里km)

SELECT  
  geo_id, `name`,(  
    6371 * acos (  
      cos ( radians(33.958887) )  
      * cos( radians( lat ) )  
      * cos( radians( lng ) - radians(118.302416) )  
      + sin ( radians(33.958887) )  
      * sin( radians( lat ) )  
    )  
  ) AS distance  
FROM geo
HAVING distance < 20  
ORDER BY distance 
LIMIT 0 , 20;

javascript方案:

function getDisance(lat1, lng1, lat2, lng2) { // lat为纬度, lng为经度, 一定不要弄错
    function toRad(d) {  return d * Math.PI / 180; }
    var dis = 0;
    var radLat1 = toRad(lat1);
    var radLat2 = toRad(lat2);
    var deltaLat = radLat1 - radLat2;
    var deltaLng = toRad(lng1) - toRad(lng2);
    var dis = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(deltaLng / 2), 2)));
    return dis * 6378137;
}
alert(  getDisance(39.91917,116.3896,39.91726,116.3940) );
标签: gps距离

相关文章

天地图用服务端去调用接口提示403错误,解决办法

天地图用服务端去调用接口提示403错误,这里很有可能就是跨域问题。可以使用天地图官方的处理跨域的地址去处理:https://api.tianditu.gov.cn/apiserver/ajaxprox...

在使用do.js进行js管理时遇到的问题

在使用do.js进行js管理时遇到的问题

Do.js 是一个轻量级的 JavaScript 模块加载器和 DOM 就绪事件处理器,它主要用于管理 JavaScript 和 CSS 文件的异步加载、处理模块依赖关系以及执行 DOM 就绪后的回调...

20个js工具函数助力高效开发

前言日常开发中,面对各种不同的需求,我们经常会用到以前开发过的一些工具函数,把这些工具函数收集起来,将大大提高我们的开发效率。1、校验数据类型export const typeOf...

如何实现精准的setTimeout

setTimeout 是不准的。因为 setTimeout 是一个宏任务,它的指定时间指的是:进入主线程的时间。setTimeout(callback, 进入主线程的时间)所以什么时候可以执...

JavaScript图片延迟加载微型库Echo.js

JavaScript图片延迟加载微型库Echo.js

JavaScript图片延迟加载微型库Echo.js Echo.js是一个标准的独立的Javascript图片懒加载(延迟加载)库,它非常小巧快速,只有2KB,它使用HT...

关于js方法的写法

在写js方法时,现在有很多种写法:写法1:最最常见的写法function test(params){     //内部 }写法2:变量形式,箭头函...

发表评论    

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