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

hykeda4年前JS1514

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距离

相关文章

19个提高工作效率的JavaScript单行代码

1. 生成随机字符串当我们需要一个唯一id时,通过Math.random创建一个随机字符串简直不要太方便噢!!!const randomString = () ...

WebAPP开发——H5标签audio(属性和API事件)

WebAPP开发——H5标签audio(属性和API事件)

audio支持的格式audio 定义音频 格式:mp3 wav oggmp3所有浏览器兼容ogg safari不支持wav 都支持js 能帮助生成audio对象 new Audio(); 等同于HTM...

ES6导出、导入模块方式

ES6使用 export 和 import 来导出、导入模块 。export导出的,导入需要用{}var firstName = 'Michael';var lastName = &#...

前端截取视频指定帧为封面的两种方法

前端截取视频指定帧为封面的两种方法

一、使用本地canvas截取我们在网页上传视频后,如果能给视频设置一个封面图,用户体验会比较好,但是如果使用video标签的默认实现,部分浏览器会显示视频的第一帧,有些浏览器则怎么都不会展示;通过创建...

关于js方法的写法

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

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

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

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

发表评论    

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