根据经纬度计算地球上两点之间的距离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随手笔记之常用的jQuery操作DOM事件
Nov 29 Javascript
jQuery插件passwordStrength密码强度指标详解
Jun 24 Javascript
JQuery动态添加Select的Option元素实现方法
Aug 29 Javascript
详解获取jq ul第一个li定位的四种解决方案
Nov 23 Javascript
jQuery中Chosen三级联动功能实例代码
Mar 07 Javascript
JavaScript中EventLoop介绍
Jan 22 Javascript
微信小程序开发实现消息推送
Nov 18 Javascript
js动态获取时间的方法分析
Aug 02 Javascript
vue3实现v-model原理详解
Oct 09 Javascript
详解js location.href和window.open的几种用法和区别
Dec 02 Javascript
jquery css实现流程进度条
Mar 26 jQuery
jQuery+ThinkPHP实现图片上传
Jul 23 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
CentOS系统中PHP安装扩展的方式汇总
2017/04/09 PHP
PHP7 windows支持
2021/03/09 PHP
js实现权限树的更新权限时的全选全消功能
2009/02/17 Javascript
js removeChild 障眼法 可能出现的错误
2009/10/06 Javascript
Javascript计算时间差的函数分享
2011/07/04 Javascript
jQuery 无刷新分页实例代码
2013/11/12 Javascript
关于原生js中bind函数的简单实现
2016/08/10 Javascript
AngularJS教程之环境设置
2016/08/16 Javascript
JavaScript使用键盘输入控制实现数字验证功能
2016/08/19 Javascript
vue.js 1.x与2.0中js实时监听input值的变化
2017/03/15 Javascript
Centos6.8下Node.js安装教程
2017/05/12 Javascript
React如何利用相对于根目录进行引用组件详解
2017/10/09 Javascript
微信公众平台获取access_token的方法步骤
2019/03/29 Javascript
mongodb初始化并使用node.js实现mongodb操作封装方法
2019/04/02 Javascript
实用的Vue开发技巧
2019/05/30 Javascript
vue项目创建步骤及路由router
2020/01/14 Javascript
vue 百度地图(vue-baidu-map)绘制方向箭头折线实例代码详解
2020/04/28 Javascript
Openlayers实现扩散的动态点(水纹效果)
2020/08/17 Javascript
vue-cli+webpack项目打包到服务器后,ttf字体找不到的解决操作
2020/08/28 Javascript
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
2014/04/26 Python
Python中random模块用法实例分析
2015/05/19 Python
Python实现定时任务
2017/02/08 Python
python 去除txt文本中的空格、数字、特定字母等方法
2018/07/24 Python
Python实现处理逆波兰表达式示例
2018/07/30 Python
python django model联合主键的例子
2019/08/06 Python
Python3使用PySynth制作音乐的方法
2019/09/09 Python
Python监听剪切板实现方法代码实例
2020/11/11 Python
使用css3实现的tab选项卡代码分享
2014/12/09 HTML / CSS
会计主管岗位职责
2014/01/03 职场文书
邮政员工辞职信
2014/01/16 职场文书
幼儿园元旦活动感言
2014/03/02 职场文书
小学趣味运动会加油稿
2014/09/25 职场文书
2015军训通讯稿大全
2015/07/18 职场文书
七夕情人节问候语
2015/11/11 职场文书
python非标准时间的转换
2021/07/25 Python
MySQL插入数据与查询数据
2022/03/25 MySQL