专栏首页小狼的世界利用JS实现的根据经纬度计算地球上两点之间的距离

利用JS实现的根据经纬度计算地球上两点之间的距离

最近用到了根据经纬度计算地球表面两点间距离的公式,然后就用JS实现了一下。

计算地球表面两点间的距离大概有两种办法。

第一种是默认地球是一个光滑的球面,然后计算任意两点间的距离,这个距离叫做大圆距离(The Great Circle Distance)。

公式如下:

使用JS来实现为:

var EARTH_RADIUS = 6378137.0;    //单位M
    var PI = Math.PI;
    
    function getRad(d){
        return d*PI/180.0;
    }
    
    /**
     * caculate the great circle distance
     * @param {Object} lat1
     * @param {Object} lng1
     * @param {Object} lat2
     * @param {Object} lng2
     */
    function getGreatCircleDistance(lat1,lng1,lat2,lng2){
        var radLat1 = getRad(lat1);
        var radLat2 = getRad(lat2);
        
        var a = radLat1 - radLat2;
        var b = getRad(lng1) - getRad(lng2);
        
        var s = 2*Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) + Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));
        s = s*EARTH_RADIUS;
        s = Math.round(s*10000)/10000.0;
                
        return s;
    }

这个公式在大多数情况下比较正确,只有在处理球面上的相对点的时候,会出现问题,有一个修正的公式,因为没有需要,就没有找出来,可以在wiki上查到。

当然,我们都知道,地球其实并不是一个真正的圆球体,而是椭球,所以有了下面的公式:

/**
     * approx distance between two points on earth ellipsoid
     * @param {Object} lat1
     * @param {Object} lng1
     * @param {Object} lat2
     * @param {Object} lng2
     */
    function getFlatternDistance(lat1,lng1,lat2,lng2){
        var f = getRad((lat1 + lat2)/2);
        var g = getRad((lat1 - lat2)/2);
        var l = getRad((lng1 - lng2)/2);
        
        var sg = Math.sin(g);
        var sl = Math.sin(l);
        var sf = Math.sin(f);
        
        var s,c,w,r,d,h1,h2;
        var a = EARTH_RADIUS;
        var fl = 1/298.257;
        
        sg = sg*sg;
        sl = sl*sl;
        sf = sf*sf;
        
        s = sg*(1-sl) + (1-sf)*sl;
        c = (1-sg)*(1-sl) + sf*sl;
        
        w = Math.atan(Math.sqrt(s/c));
        r = Math.sqrt(s*c)/w;
        d = 2*w*a;
        h1 = (3*r -1)/2/c;
        h2 = (3*r +1)/2/s;
        
        return d*(1 + fl*(h1*sf*(1-sg) - h2*(1-sf)*sg));
    }

这个公式计算出的结果要比第一个好一些,当然,最后结果的经度实际上还取决于传入的坐标的精度。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Mac下体验Hexo与Github Pages搭建

    很久之前就知道Github可以发布自己的博客,因为仅支持静态文件,一直懒于动手自己进行编辑。再了解到还存在 JekyII 和 Hexo 这样的内容生成框架后,终...

    大江小浪
  • 工作了这么久,文档管理这样做才最有效率

    今年以来,因为疫情的原因经常远程在家办公,很多工作中的文档无可避免的就保存在了家中的电脑上。在恢复现场办公后,又需要将家中电脑的文档与工作电脑中的文档合并起来。...

    大江小浪
  • Hexo博客写作与图片处理的经验

    Hexo是一款非常优秀的开源博客管理工具,所有的博客文档都通过Markdown格式编写,Markdown编辑器有很多,原来的时候我经常用Evernote编写,但...

    大江小浪
  • 【H5 音乐播放实例】第四节 音乐详情页制作 -音乐的播放和暂停

    剽悍一小兔
  • 软件开发最终会使自己过时吗

    自著名风险投资家马克·安德烈森(MarcAndreessen)宣称“软件正在吞噬世界”以来,已经过去了近十年。后来的几年已经证明了他的先见之明,众所周知,软件开...

    Lemon黄
  • 微信跳一跳秒shua分

    学一学大数据
  • 2018年IT行业必须面对的7个改变

    根据罗致恒富(Robert Half)2018年发布的薪酬指南,科技人员的好时机将一直持续到明年。该指南发现,今天的技术人才缺口将继续给2018年的企业带来压力...

    企鹅号小编
  • 人工智能很遥远?未来每个 HR 都离不开 AI

    几年前,HR SaaS 在市场爆发式的增长引发了大家的关注。Saas 大潮退去,人工智能在各行各业的风起云涌,HR 反而不小心成为了 AI 领域看似风平浪静的垂...

    达观数据
  • Navicat 连接MySQL数据库 报错2059 - authentication plugin 'caching_sha2_password'的解决办法

    Happy、Liu
  • 如何在相关矩阵图上添加p-value

    这篇文章可以说是《怎么分析和展示RNAseq基因表达数据中基因的相关性》的延续。上次绘制了下图:

    王诗翔呀

扫码关注云+社区

领取腾讯云代金券