根据经纬度计算地球上两点之间的距离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 相关文章推荐
一个原生的用户等级的进度条
Jul 03 Javascript
真正的JQuery.ajax传递中文参数的解决方法
May 28 Javascript
ToolTips JQEURY插件之简洁小提示框效果
Nov 19 Javascript
eclipse导入jquery包后报错的解决方法
Feb 17 Javascript
Javascript中的关键字和保留字整理
Oct 16 Javascript
jQuery使用$.each遍历json数组的简单实现方法
Apr 18 Javascript
jQuery Validate插件ajax方式验证输入值的实例
Dec 21 jQuery
vue单页面实现当前页面刷新或跳转时提示保存
Nov 02 Javascript
vue多层嵌套路由实例分析
Mar 19 Javascript
jQuery中实现text()的方法
Apr 04 jQuery
JS实现的碰撞检测与周期移动完整示例
Sep 02 Javascript
javascript前端实现多视频上传
Dec 13 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
Flash空降上海 化身大魔王接受挑战
2020/03/02 星际争霸
PHP+AJAX实现无刷新注册(带用户名实时检测)
2007/01/02 PHP
PHP set_time_limit(0)长连接的实现分析
2010/03/02 PHP
Laravel框架路由管理简单示例
2019/05/07 PHP
php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例
2019/05/09 PHP
php输出文字乱码的解决方法
2019/10/04 PHP
js获取html文件的思路及示例
2013/09/17 Javascript
JS动态添加与删除select中的Option对象(示例代码)
2013/12/20 Javascript
js判断页面中是否有指定控件的简单实例
2014/03/04 Javascript
js实现无缝滚动特效
2015/12/20 Javascript
Linux下为Node.js程序配置MySQL或Oracle数据库的方法
2016/03/19 Javascript
Bootstrap零基础学习第一课之模板
2016/07/18 Javascript
JS判断输入的字符串是否是数字的方法(正则表达式)
2016/11/29 Javascript
javascript中replace使用方法总结
2017/03/01 Javascript
你点的 ES6一些小技巧,请查收
2018/04/25 Javascript
微信小程序自定义底部弹出框
2020/11/16 Javascript
jquery使用FormData实现异步上传文件
2018/10/25 jQuery
vue 解决异步数据更新问题
2019/10/29 Javascript
wxpython中利用线程防止假死的实现方法
2014/08/11 Python
python开发游戏的前期准备
2019/05/05 Python
Pandas分组与排序的实现
2019/07/23 Python
python实现本地批量ping多个IP的方法示例
2019/08/07 Python
Django 多表关联 存储 使用方法详解 ManyToManyField save
2019/08/09 Python
Django之编辑时根据条件跳转回原页面的方法
2019/08/21 Python
python实现与redis交互操作详解
2020/04/21 Python
python 读取.nii格式图像实例
2020/07/01 Python
Python tkinter之Bind(绑定事件)的使用示例
2021/02/05 Python
Under Armour西班牙官网:美国知名的高端功能性运动品牌
2018/12/12 全球购物
武汉高蓝德国际.net机试
2016/06/24 面试题
数控技术专科生自我评价
2014/01/08 职场文书
读群众路线的心得体会
2014/09/03 职场文书
房屋买卖协议书范本
2014/09/27 职场文书
社区学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
2016年五一促销广告语
2016/01/28 职场文书
青年人初次创业的“五不要”
2019/08/23 职场文书
python 用递归实现通用爬虫解析器
2021/04/16 Python