根据经纬度计算地球上两点之间的距离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 相关文章推荐
JS获取scrollHeight问题想到的标准问题
May 27 Javascript
Javascript中的变量使用说明
May 18 Javascript
用jquery实现等比例缩放图片效果插件
Jul 24 Javascript
javascript相关事件的几个概念
May 21 Javascript
JS图片等比例缩放方法完整示例
Aug 03 Javascript
require、backbone等重构手机图片查看器
Nov 17 Javascript
JS中如何实现点击a标签返回页面顶部的问题
Jan 19 Javascript
node.js连接MongoDB数据库的2种方法教程
May 17 Javascript
JavaScript实现自动跳转文本功能
May 25 Javascript
vue3实现v-model原理详解
Oct 09 Javascript
node事件循环和process模块实例分析
Feb 14 Javascript
node koa2 ssr项目搭建的方法步骤
Dec 11 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
ThinkPHP 模板substr的截取字符串函数详解
2017/01/09 PHP
thinkPHP框架RBAC实现原理分析
2019/02/01 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
js innerHTML 改变div内容的方法
2013/08/03 Javascript
深入理解javascript的执行顺序
2014/04/04 Javascript
浅谈angularJS 作用域
2015/07/05 Javascript
在javascript中随机数 math random如何生成指定范围数值的随机数
2015/10/21 Javascript
jQuery增加和删除表格项目及实现表格项目排序的方法
2016/05/30 Javascript
jQuery得到多个值只能用取Class ,不能用取ID的方法
2016/12/04 Javascript
jQuery.parseHTML() 函数详解
2017/01/09 Javascript
从零学习node.js之搭建http服务器(二)
2017/02/21 Javascript
js实现带简单弹性运动的导航条
2017/02/22 Javascript
从零学习node.js之express入门(六)
2017/02/25 Javascript
微信小程序canvas写字板效果及实例
2017/06/15 Javascript
浅谈ElementUI中switch回调函数change的参数问题
2018/08/24 Javascript
微信小程序页面调用自定义组件内的事件详解
2019/09/12 Javascript
webpack打包优化的几个方法总结
2020/02/10 Javascript
vue 中this.$set 动态绑定数据的案例讲解
2021/01/29 Vue.js
简单介绍Ruby中的CGI编程
2015/04/10 Python
python常见数制转换实例分析
2015/05/09 Python
简单介绍Python中的readline()方法的使用
2015/05/24 Python
利用python发送和接收邮件
2016/09/27 Python
Python2随机数列生成器简单实例
2017/09/04 Python
Python 获得13位unix时间戳的方法
2017/10/20 Python
Tensorflow实现多GPU并行方式
2020/02/03 Python
使用Django搭建网站实现商品分页功能
2020/05/22 Python
Unix控制后台进程都有哪些进程
2016/09/22 面试题
Ruby中的保护方法和私有方法与一般面向对象程序设计语言的一样吗
2013/05/01 面试题
九月份红领巾广播稿
2014/01/22 职场文书
借款协议书范本
2014/04/22 职场文书
机关干部个人对照检查材料思想汇报
2014/09/28 职场文书
群众路线教育实践活动心得体会(四风)
2014/11/03 职场文书
出差报告格式模板
2014/11/06 职场文书
基于Go语言构建RESTful API服务
2021/07/25 Golang
pandas数值排序的实现实例
2021/07/25 Python
python中filter,map,reduce的作用
2022/06/10 Python