根据经纬度计算地球上两点之间的距离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简单瀑布流实现原理及ie8下测试代码
Jan 23 Javascript
Extjs4 GridPanel的主要配置参数详细介绍
Apr 18 Javascript
使用Grunt.js管理你项目的应用说明
Apr 24 Javascript
jQuery中校验时间格式的正则表达式小结
Sep 22 Javascript
javascript unicode与GBK2312(中文)编码转换方法
Nov 14 Javascript
引用外部脚本时script标签关闭的写法
Jan 20 Javascript
详解node-ccap模块生成captcha验证码
Jul 01 Javascript
微信小程序自定义导航栏
Dec 31 Javascript
vue实现form表单与table表格的数据关联功能示例
Jan 29 Javascript
vue实现图片懒加载的方法分析
Feb 05 Javascript
element 动态合并表格的步骤
Dec 31 Javascript
详解JSON.parse和JSON.stringify用法
Feb 18 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
模仿OSO的论坛(四)
2006/10/09 PHP
基于php-fpm 参数的深入理解
2013/06/03 PHP
ThinkPHP中处理表单中的注意事项
2014/11/22 PHP
Yii2框架redis基本应用示例
2018/07/13 PHP
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
2006/12/22 Javascript
jQuery学习笔记[1] jQuery中的DOM操作
2010/12/03 Javascript
通过百度地图获取公交线路的站点坐标的js代码
2012/05/11 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
2013/02/26 Javascript
获取元素距离浏览器周边的位置的方法getBoundingClientRect
2013/04/17 Javascript
Jjcarousellite 实现图片列表滚动的简单实例
2013/11/29 Javascript
jQuery实现移动 和 渐变特效的点击事件
2015/02/26 Javascript
jquery使用animate方法实现控制元素移动
2015/03/27 Javascript
AngularJS中使用HTML5手机摄像头拍照
2016/02/22 Javascript
BootStrap表单控件之文本域textarea
2017/05/23 Javascript
jquery实现回车键触发事件(实例讲解)
2017/11/21 jQuery
react-router4 配合webpack require.ensure 实现异步加载的示例
2018/01/18 Javascript
element-ui表格合并span-method的实现方法
2019/05/21 Javascript
webpack打包优化的几个方法总结
2020/02/10 Javascript
详解Vue3中对VDOM的改进
2020/04/23 Javascript
[02:24]DOTA2痛苦女王 英雄基础教程
2013/11/26 DOTA
[00:59]DOTA2背景故事第二期之四大基本法则
2020/07/07 DOTA
Python实现的简单hangman游戏实例
2015/06/28 Python
以一个投票程序的实例来讲解Python的Django框架使用
2016/02/18 Python
itchat和matplotlib的结合使用爬取微信信息的实例
2017/08/25 Python
使用Python制作微信跳一跳辅助
2018/01/31 Python
python控制windows剪贴板,向剪贴板中写入图片的实例
2018/05/31 Python
python3.7.0的安装步骤
2018/08/27 Python
python常用函数与用法示例
2019/07/02 Python
简单了解Java Netty Reactor三种线程模型
2020/04/26 Python
python实现凯撒密码、凯撒加解密算法
2020/06/11 Python
HTML5 drag和drop具体使用详解
2021/01/18 HTML / CSS
某公司部分笔试题
2013/11/05 面试题
离婚协议书怎样才有法律效力
2014/10/10 职场文书
赢在执行观后感
2015/06/16 职场文书
乡镇干部学习心得体会
2016/01/23 职场文书
java协程框架quasar和kotlin中的协程对比分析
2022/02/24 Java/Android