根据经纬度计算地球上两点之间的距离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 相关文章推荐
javascript 获取网页参数系统
Jul 19 Javascript
Javascript var变量隐式声明方法
Oct 19 Javascript
javascript:history.go()和History.back()的区别及应用
Nov 25 Javascript
JQuery入门——用bind方法绑定事件处理函数应用介绍
Feb 05 Javascript
document.write()及其输出内容的样式、位置控制
Aug 12 Javascript
原生javascript实现拖动元素示例代码
Sep 01 Javascript
JS实现屏蔽shift,Ctrl,alt等功能键的方法
Jun 01 Javascript
AngularJS  双向数据绑定详解简单实例
Oct 20 Javascript
在JSP中如何实现MD5加密的方法
Nov 02 Javascript
Vue编写多地区选择组件
Aug 21 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
Aug 24 Javascript
学习jQuery中的noConflict()用法
Sep 28 jQuery
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中通过smtp发邮件的类,测试通过
2007/01/22 PHP
Zend 输出产生XML解析错误
2009/03/03 PHP
php 从数据库提取二进制图片的处理代码
2009/09/09 PHP
destoon调用discuz论坛中带图片帖子的实现方法
2014/08/21 PHP
PHP实现递归复制整个文件夹的类实例
2015/08/03 PHP
php类中的$this,static,final,const,self这几个关键字使用方法
2015/12/14 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
PHP+jQuery实现即点即改功能示例
2019/02/21 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
2019/10/18 PHP
javascript中字符串替换函数replace()方法与c# 、vb 替换有一点不同
2010/06/25 Javascript
JavaScript中判断函数是new还是()调用的区别说明
2011/04/07 Javascript
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
2012/04/20 Javascript
简单的两种Extjs formpanel加载数据的方式
2013/11/09 Javascript
Asp.Net alert弹出提示信息的几种方法总结
2014/01/29 Javascript
jquery实现先淡出再折叠收起的动画效果
2015/08/07 Javascript
javascript运算符——位运算符全面介绍
2016/07/14 Javascript
基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询
2016/10/30 Javascript
js实现3D图片环展示效果
2017/03/09 Javascript
讲解vue-router之什么是编程式路由
2018/05/28 Javascript
JS实现的贪吃蛇游戏案例详解
2019/05/01 Javascript
JS 数组基本用法入门示例解析
2020/01/16 Javascript
Python实现一个简单的MySQL类
2015/01/07 Python
Tornado协程在python2.7如何返回值(实现方法)
2017/06/22 Python
Python中实例化class的执行顺序示例详解
2018/10/14 Python
Pandas统计重复的列里面的值方法
2019/01/30 Python
css3 按钮 利用css3实现超酷下载按钮
2013/03/18 HTML / CSS
Looking4Parking美国:全球排名第一的机场停车比较品牌
2019/08/26 全球购物
牛津在线药房:Oxford Online Pharmacy
2020/11/16 全球购物
为什么需要版本控制
2016/10/28 面试题
两只小狮子教学反思
2014/02/05 职场文书
生产操作工岗位职责
2014/09/16 职场文书
后进生评语大全
2015/01/04 职场文书
2015年幼师个人工作总结
2015/10/15 职场文书
2019入党申请书格式
2019/06/25 职场文书
webpack的移动端适配方案小结
2021/07/25 Javascript
Pygame Event事件模块的详细示例
2021/11/17 Python