根据经纬度计算地球上两点之间的距离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 innerText和innerHtml应用
Jan 28 Javascript
node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用
Nov 04 Javascript
JS实现控制表格行内容垂直对齐的方法
Mar 30 Javascript
JS获得图片alt信息的方法
Apr 01 Javascript
Jquery中基本选择器用法实例详解
May 18 Javascript
JavaScript字符串常用的方法
Mar 10 Javascript
javascript计算对象长度的方法
Oct 25 Javascript
Vue-Router模式和钩子的用法
Feb 28 Javascript
vue.extend实现alert模态框弹窗组件
Apr 28 Javascript
配置eslint规范项目代码风格
Mar 11 Javascript
vue 组件内获取actions的response方式
Nov 08 Javascript
使用react+redux实现计数器功能及遇到问题
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&mysql(六)
2006/10/09 PHP
PHP_Cooikes不同页面无法传递的解决方法
2014/03/07 PHP
PHP微信红包API接口
2015/12/05 PHP
PHP简单实现无限级分类的方法
2016/05/13 PHP
PHP7生产环境队列Beanstalkd用法详解
2020/05/19 PHP
JavaScript接口实现代码 (Interfaces In JavaScript)
2010/06/11 Javascript
一个html5播放视频的video控件只支持android的默认格式mp4和3gp
2014/05/08 Javascript
JavaScript判断文件上传类型的方法
2014/09/02 Javascript
Javascript 是你的高阶函数(高级应用)
2015/06/15 Javascript
使用AngularJS处理单选框和复选框的简单方法
2015/06/19 Javascript
Bootstrap每天必学之级联下拉菜单
2016/03/27 Javascript
使用Bootstrap typeahead插件实现搜索框自动补全的方法
2016/07/07 Javascript
angular双向绑定模拟探索
2016/12/26 Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
2017/05/17 Javascript
JS库之Three.js 简易入门教程(详解之一)
2017/09/13 Javascript
Vue精简版风格指南(推荐)
2018/01/30 Javascript
从零开始搭建webpack+react开发环境的详细步骤
2018/05/18 Javascript
谈谈Python进行验证码识别的一些想法
2016/01/25 Python
Python3使用PyQt5制作简单的画板/手写板实例
2017/10/19 Python
python使用selenium实现批量文件下载
2019/03/11 Python
基于python实现监听Rabbitmq系统日志代码示例
2020/11/28 Python
教你使用Canvas处理图片的方法
2017/11/28 HTML / CSS
德国低价购买灯具和家具网站:Style-home.de
2016/11/25 全球购物
四方通行旅游网:台湾订房、出国旅游
2017/09/20 全球购物
连带责任保证书
2014/04/29 职场文书
会计专业自荐信
2014/06/03 职场文书
对照四风自我剖析材料
2014/10/07 职场文书
四川省传达学习贯彻党的群众路线教育实践活动总结大会精神新闻稿
2014/10/26 职场文书
2014镇党委书记党建工作汇报材料
2014/11/02 职场文书
2014年骨干教师工作总结
2014/12/19 职场文书
2015年项目工作总结
2015/04/29 职场文书
聘任通知书
2015/09/21 职场文书
2016关于读书活动的心得体会
2016/01/14 职场文书
职场新人刚入职工作总结该怎么写?
2019/05/15 职场文书
python 管理系统实现mysql交互的示例代码
2021/12/06 Python
MySQL如何使备份得数据保持一致
2022/05/02 MySQL