根据经纬度计算地球上两点之间的距离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技术实现的web小游戏(不含网游)
Jun 12 Javascript
JavaScript在IE和Firefox浏览器下的7个差异兼容写法小结
Jun 18 Javascript
50款非常棒的 jQuery 插件分享
Mar 29 Javascript
jquery动态增加text元素以及删除文本内容实例代码
Jul 01 Javascript
基于javascript实现漂亮的页面过渡动画效果附源码下载
Oct 26 Javascript
原生JavaScript实现异步多文件上传
Dec 02 Javascript
javascript实现数字倒计时特效
Mar 30 Javascript
JS基础随笔(菜鸟必看篇)
Jul 13 Javascript
jQuery和JavaScript节点插入元素的方法对比
Nov 18 Javascript
深入解读Node.js中的koa源码
Jun 17 Javascript
JS中作用域以及变量范围分析
Jul 18 Javascript
three.js中多线程的使用及性能测试详解
Jan 07 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 array_search() 函数使用
2010/04/13 PHP
PHP和C#可共用的可逆加密算法详解
2015/10/26 PHP
RR vs IO BO3 第一场2.13
2021/03/10 DOTA
去除链接虚线全面分析总结
2006/08/15 Javascript
用Jquery实现多级下拉框无刷新的联动
2010/12/22 Javascript
基于jQuery的图片左右无缝滚动插件
2012/05/23 Javascript
仿谷歌主页js动画效果实现代码
2013/07/14 Javascript
jQuery中delegate()方法用法实例
2015/01/19 Javascript
jquery滚动加载数据的方法
2015/03/09 Javascript
JavaScript中调用函数的4种方式代码实例
2015/07/08 Javascript
jQuery使用animate创建动画用法实例
2015/08/07 Javascript
JS组件中bootstrap multiselect两大组件较量
2016/01/26 Javascript
学习使用bootstrap基本控件(table、form、button)
2016/04/12 Javascript
json与jsonp知识小结(推荐)
2016/08/16 Javascript
Nginx 配置多站点vhost 的方法
2018/01/07 Javascript
关于HTML5的data-*自定义属性的总结
2018/05/05 Javascript
微信小程序实现文字从右向左无限滚动
2020/11/18 Javascript
jQuery实现鼠标移入显示蒙版效果
2020/01/11 jQuery
vue实现简单的登录弹出框
2020/10/26 Javascript
详解vue中在父组件点击按钮触发子组件的事件
2020/11/13 Javascript
JavaScript用document.write()输出换行的示例代码
2020/11/26 Javascript
[05:39]2014DOTA2国际邀请赛 DK晋级胜者组专访战队国士无双
2014/07/14 DOTA
python 测试实现方法
2008/12/24 Python
python获取当前计算机cpu数量的方法
2015/04/18 Python
Python使用Paramiko模块编写脚本进行远程服务器操作
2016/05/05 Python
python实现时间o(1)的最小栈的实例代码
2018/07/23 Python
Python拆分大型CSV文件代码实例
2019/10/07 Python
基于Django实现日志记录报错信息
2019/12/17 Python
详解Django配置JWT认证方式
2020/05/09 Python
python爬虫把url链接编码成gbk2312格式过程解析
2020/06/08 Python
CSS3 倾斜的网页图片库实例教程
2009/11/14 HTML / CSS
html5拖曳操作 HTML5实现网页元素的拖放操作
2013/01/02 HTML / CSS
苏宁红孩子母婴商城:redbaby
2017/02/12 全球购物
澳大利亚礼品篮网站:Macarthur Baskets
2019/10/14 全球购物
2015年税务稽查工作总结
2015/05/26 职场文书
爱的教育读书笔记
2015/06/26 职场文书