根据经纬度计算地球上两点之间的距离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 相关文章推荐
js post方式传递提交的实现代码
May 31 Javascript
js中widow.open()方法使用详解
Jul 30 Javascript
jquery的ajax和getJson跨域获取json数据的实现方法
Feb 04 Javascript
jQuery操作JSON的CRUD用法实例
Feb 25 Javascript
巧用Vue.js+Vuex制作专门收藏微信公众号的app
Nov 03 Javascript
JavaScript 字符串常用操作小结(非常实用)
Nov 30 Javascript
Javascript基础回顾之(二) js作用域
Jan 31 Javascript
解决JQuery全选/反选第二次失效的问题
Oct 11 jQuery
bootstrap模态框嵌套、tabindex属性、去除阴影的示例代码
Oct 17 Javascript
python爬取安居客二手房网站数据(实例讲解)
Oct 19 Javascript
浅析Proxy可以优化vue的数据监听机制问题及实现思路
Nov 29 Javascript
详解js实时获取并显示当前时间的方法
May 10 Javascript
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
用Socket发送电子邮件
2006/10/09 PHP
真正的ZIP文件操作类(php)
2007/07/21 PHP
PHP读取XML值的代码(推荐)
2011/01/01 PHP
详解PHP中的null合并运算符
2015/12/30 PHP
微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
2016/01/12 PHP
php使用json_decode后数字对象转换成了科学计数法的解决方法
2017/02/20 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
JS 页面内容搜索,类似于 Ctrl+F功能的实现代码
2007/08/13 Javascript
ASP Json Parser修正版
2009/12/06 Javascript
jquery validate poshytip 自定义样式
2012/11/26 Javascript
Jquery easyui 下loaing效果示例代码
2013/08/12 Javascript
jquery实现保存已选用户
2014/07/21 Javascript
jQuery中:selected选择器用法实例
2015/01/04 Javascript
JavaScript中的方法重载实例
2015/03/16 Javascript
Vue.js -- 过滤器使用总结
2017/02/18 Javascript
使用vue-cli(vue脚手架)快速搭建项目的方法
2018/05/21 Javascript
element-ui循环显示radio控件信息的方法
2018/08/24 Javascript
使用layer弹窗提交表单时判断表单是否输入为空的例子
2019/09/26 Javascript
vue基于v-charts封装双向条形图的实现代码
2019/12/09 Javascript
echarts.js 动态生成多个图表 使用vue封装组件操作
2020/07/19 Javascript
[53:21]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-CDEC
2014/05/22 DOTA
[01:00:53]OG vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[59:30]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
python执行shell获取硬件参数写入mysql的方法
2014/12/29 Python
Python实现Pig Latin小游戏实例代码
2018/02/02 Python
django+mysql的使用示例
2018/11/23 Python
python Cartopy的基础使用详解
2020/11/01 Python
求职推荐信范文
2013/12/01 职场文书
初中化学教学反思
2014/01/23 职场文书
医学生自我评价
2014/01/27 职场文书
服装采购员岗位职责
2014/03/15 职场文书
大学生求职计划书
2014/04/30 职场文书
说明书格式及范文
2014/05/07 职场文书
党员教师四风问题整改措施思想汇报
2014/10/08 职场文书
关于拾金不昧的感谢信
2015/01/21 职场文书
幼儿园新生开学寄语
2015/05/27 职场文书