根据经纬度计算地球上两点之间的距离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 相关文章推荐
IE中createElement需要注意的一个问题
Jul 13 Javascript
基于Jquery的跨域传输数据(JSONP)
Mar 10 Javascript
jquery中的事件处理详细介绍
Jun 24 Javascript
js实现防止被iframe的方法
Jul 03 Javascript
JavaScript事件处理的方式(三种)
Apr 26 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单
Nov 25 Javascript
浅谈通过JS拦截 pushState和replaceState事件
Jul 21 Javascript
jquery+css实现下拉列表功能
Sep 03 jQuery
使用vue-cli打包过程中的步骤以及问题的解决
May 08 Javascript
webpack项目轻松混用css module的方法
Jun 12 Javascript
vue请求本地自己编写的json文件的方法
Apr 25 Javascript
vue通过数据过滤实现表格合并
Nov 30 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 zend解密软件绿色版测试可用
2008/04/14 PHP
PHP header函数分析详解
2011/08/06 PHP
PHP获取客户端及服务器端IP的封装类
2016/07/21 PHP
php实现分页功能的详细实例方法
2019/09/29 PHP
文字幻灯片
2006/06/26 Javascript
简单实用的反馈表单无刷新提交带验证
2013/11/15 Javascript
关闭页面window.location事件未执行的原因及解决方法
2014/09/01 Javascript
《JavaScript DOM 编程艺术》读书笔记之DOM基础
2015/01/09 Javascript
javascript字符串循环匹配实例分析
2015/07/17 Javascript
七个不允许错过的jQuery小技巧
2015/12/21 Javascript
JS封装的选项卡TAB切换效果示例
2016/09/20 Javascript
数组Array的一些方法(总结)
2017/02/17 Javascript
微信小程序实现获取自己所处位置的经纬度坐标功能示例
2017/11/30 Javascript
利用vue组件自定义v-model实现一个Tab组件方法示例
2017/12/06 Javascript
angularJs-$http实现百度搜索时的动态下拉框示例
2018/02/27 Javascript
nodejs爬虫初试superagent和cheerio
2018/03/05 NodeJs
基于JS实现带动画效果的流程进度条
2018/06/01 Javascript
React 组件间的通信示例
2018/06/14 Javascript
javascript中如何判断类型汇总
2019/05/14 Javascript
JavaScript canvas绘制圆弧与圆形
2020/02/18 Javascript
[02:49]DAC2018决赛日TOP5 LGD开启黑暗之门绝杀VP
2018/04/08 DOTA
Python random模块(获取随机数)常用方法和使用例子
2014/05/13 Python
Python threading多线程编程实例
2014/09/18 Python
python中对list去重的多种方法
2014/09/18 Python
Python的Bottle框架中返回静态文件和JSON对象的方法
2015/04/30 Python
python中判断文件编码的chardet(实例讲解)
2017/12/21 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
2019/12/13 Python
独特的礼品和创新的科技产品:The Grommet
2018/02/24 全球购物
世界上最具创新性的增强型知名运动品牌:Proviz
2018/04/03 全球购物
Lacoste(法国鳄鱼)加拿大官网:以标志性的POLO衫而闻名
2019/05/15 全球购物
护士实习自我鉴定
2013/10/22 职场文书
班长演讲稿范文
2014/04/24 职场文书
群众路线查摆问题整改措施思想汇报
2014/10/10 职场文书
立秋之描写立秋的作文(五年级)
2019/08/08 职场文书
Apache Hudi的多版本清理服务彻底讲解
2022/03/31 Servers
MySQL数据库安装方法与图形化管理工具介绍
2022/05/30 MySQL