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

hykeda2年前JS349

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

相关文章

ES6导出、导入模块方式

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

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

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

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

js 对象合并和数组合并

1、对象的扩展运算符(...)用于取出参数对象的所有可遍历属性,拷贝到当前对象之中。let obj1 = {     name:...

关于js方法的写法

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

如何实现精准的setTimeout

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

生成随机图片

function getMockImagesURL() { let arr = [200, 250, 300, 350, 400, 450]; const width = arr[...

发表评论    

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