根据经纬度计算地球上两点之间的距离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 相关文章推荐
使用onbeforeunload属性后的副作用
Mar 08 Javascript
javascript标签在页面中的位置探讨
Apr 11 Javascript
jquery mobile实现拨打电话功能的几种方法
Aug 05 Javascript
Javascript call和apply区别及使用方法
Nov 14 Javascript
chrome调试javascript详解
Oct 21 Javascript
sso跨域写cookie的一段js脚本(推荐)
May 25 Javascript
JavaScript门面模式详解
Oct 19 Javascript
JavaScript基于面向对象实现的猜拳游戏
Jan 03 Javascript
jQuery插件jsonview展示json数据
May 26 jQuery
微信小程序表单验证插件WxValidate的二次封装功能(终极版)
Sep 03 Javascript
JavaScript原型继承和原型链原理详解
Feb 04 Javascript
在Vue中创建可重用的 Transition的方法
Jun 02 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
php注入实例
2006/10/09 PHP
PHP5权威编程阅读学习笔记 附电子书下载
2012/07/05 PHP
php判断数组是否为空的实例方法
2020/05/10 PHP
js 利用className得到对象的实现代码
2011/11/15 Javascript
jQuery解决下拉框select设宽度时IE 6/7/8下option超出显示不全
2013/05/27 Javascript
Jquery 动态生成表格示例代码
2013/12/24 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
2015/05/16 Javascript
JS实现仿QQ面板的手风琴效果折叠菜单代码
2015/09/11 Javascript
原生js实现淘宝购物车功能
2020/06/23 Javascript
Javascript基础回顾之(一) 类型
2017/01/31 Javascript
Angularjs 依赖压缩及自定义过滤器写法
2017/02/04 Javascript
荐书|您有一份JavaScript书单待签收
2017/07/21 Javascript
AngularJS 中的数据源的循环输出
2017/10/12 Javascript
用vue快速开发app的脚手架工具
2018/06/11 Javascript
vue项目前端埋点的实现
2019/03/06 Javascript
Vue 动态路由的实现及 Springsecurity 按钮级别的权限控制
2019/09/05 Javascript
Layui实现主窗口和Iframe层参数传递
2019/11/14 Javascript
JS操作Fckeditor的一些常用方法(获取、插入等)
2020/02/19 Javascript
VSCode Vue开发推荐插件和VSCode快捷键(小结)
2020/08/08 Javascript
javascript实现雪花飘落效果
2020/08/19 Javascript
跟老齐学Python之关于循环的小伎俩
2014/10/02 Python
python3实现短网址和数字相互转换的方法
2015/04/28 Python
python单元测试unittest实例详解
2015/05/11 Python
使用Python生成随机密码的示例分享
2016/02/18 Python
详解Python如何生成词云的方法
2018/06/01 Python
Python制作动态字符图的实例
2019/01/27 Python
Python代码一键转Jar包及Java调用Python新姿势
2020/03/10 Python
维多利亚的秘密官方网站:Victoria’s Secret
2018/10/24 全球购物
荷兰照明、灯具和配件网上商店:dmlights
2019/08/25 全球购物
string = null 和string = ''的区别
2013/04/28 面试题
家长写给老师的建议书
2014/03/13 职场文书
售后客服个人自我评价
2014/09/14 职场文书
2014年村官工作总结
2014/11/24 职场文书
个人汇报材料范文
2014/12/30 职场文书
银行自荐信范文
2015/03/25 职场文书
Vue过滤器(filter)实现及应用场景详解
2021/06/15 Vue.js