根据经纬度计算地球上两点之间的距离js实现代码


Posted in Javascript onMarch 05, 2013

利用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)); 
}

这个公式计算出的结果要比第一个好一些,当然,最后结果的经度实际上还取决于传入的坐标的精度。
Javascript 相关文章推荐
jquery tab插件精简版分享
Sep 10 Javascript
用Move.js配合创建CSS3动画的入门指引
Jul 22 Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
Aug 10 Javascript
浅析$(function) ready和onload 的区别
Sep 03 Javascript
JS树形菜单组件Bootstrap TreeView使用方法详解
Dec 21 Javascript
BootStrap表单时间选择器详解
May 09 Javascript
React Navigation 使用中遇到的问题小结
May 08 Javascript
从零到一详聊创建Vue工程及遇到的常见问题
Apr 25 Javascript
微信小程序实现同时上传多张图片
Feb 03 Javascript
JS实现简单移动端鼠标拖拽
Jul 23 Javascript
vue动态加载SVG文件并修改节点数据的操作代码
Aug 17 Javascript
Vue vee-validate插件的简单使用
Jun 22 Vue.js
js日期时间补零的小例子
Mar 05 #Javascript
6款新颖的jQuery和CSS3进度条插件推荐
Mar 05 #Javascript
html超链接打开窗口大小的方法
Mar 05 #Javascript
js关闭当前页面(窗口)的几种方式总结
Mar 05 #Javascript
jQuery中(function(){})()执行顺序的理解
Mar 05 #Javascript
Yii-自定义删除确认弹框(zyd)jquery实现代码
Mar 04 #Javascript
js异步加载的三种解决方案
Mar 04 #Javascript
You might like
同时提取多条新闻中的文本一例
2006/10/09 PHP
php dirname(__FILE__) 获取当前文件的绝对路径
2011/06/28 PHP
php创建基本身份认证站点的方法详解
2013/06/08 PHP
PHP如何利用P3P实现跨域
2013/08/24 PHP
PHP抓屏函数实现屏幕快照代码分享
2014/01/02 PHP
laravel实现登录时监听事件,添加登录用户的记录方法
2019/09/30 PHP
基于laravel缓冲cache的用法详解
2019/10/23 PHP
关于viewport,Ext.panel和Ext.form.panel的关系
2009/05/07 Javascript
js切换光标示例代码
2013/10/10 Javascript
JS实现程序暂停与继续功能代码解读
2013/10/10 Javascript
jquery 页面滚动到底部自动加载插件集合
2014/01/31 Javascript
DOM基础教程之事件类型
2015/01/20 Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
2015/07/01 Javascript
C#中使用迭代器处理等待任务
2015/07/13 Javascript
JS给swf传参数的实现方法
2016/09/13 Javascript
Javascript 实现放大镜效果实例详解
2016/12/03 Javascript
video.js 实现视频只能后退不能快进的思路详解
2018/08/09 Javascript
js模拟实现百度搜索
2020/06/28 Javascript
jQuery实现穿梭框效果
2021/01/19 jQuery
JavaScript 生成唯一ID的几种方式
2021/02/19 Javascript
python检测空间储存剩余大小和指定文件夹内存占用的实例
2018/06/11 Python
tensorflow: 查看 tensor详细数值方法
2018/06/13 Python
Python批处理删除和重命名文件夹的实例
2018/07/11 Python
Python中生成一个指定长度的随机字符串实现示例
2019/11/06 Python
Python全局锁中如何合理运用多线程(多进程)
2019/11/06 Python
Python利用Pillow(PIL)库实现验证码图片的全过程
2020/10/04 Python
thinkphp5 路由分发原理
2021/03/18 PHP
Gerry Weber德国官网:优质女性时装,德国最大的时装公司之一
2019/11/02 全球购物
出纳试用期自我鉴定
2014/04/07 职场文书
保证书范文大全
2014/04/28 职场文书
学生党员批评与自我批评
2014/10/15 职场文书
九年级语文教学反思
2016/03/03 职场文书
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
2021/04/06 Python
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python
使用refresh_token实现无感刷新页面
2022/04/26 Javascript
windows系统搭建WEB服务器详细教程
2022/08/05 Servers