根据经纬度计算地球上两点之间的距离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 String 对象
Apr 25 Javascript
javascript SocialHistory 检查访问者是否访问过某站点
Aug 02 Javascript
javascript textarea光标定位方法(兼容IE和FF)
Mar 12 Javascript
JavaScript 放大镜 放大倍率和视窗尺寸
May 09 Javascript
如何防止回车(enter)键提交表单
May 11 Javascript
深入理解JavaScript系列(50):Function模式(下篇)
Mar 04 Javascript
探究Javascript模板引擎mustache.js使用方法
Jan 26 Javascript
BootStrap iCheck插件全选与获取value值的解决方法
Aug 24 Javascript
浅谈Node.js轻量级Web框架Express4.x使用指南
May 03 Javascript
给Easyui-Datebox设置隐藏或者不可用的解决方法
May 26 Javascript
Three.js中网格对象MESH的属性与方法详解
Sep 27 Javascript
详细介绍解决vue和jsp结合的方法
Feb 06 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下MAIL的另一解决方案
2006/10/09 PHP
PHP缓存技术的使用说明
2011/08/06 PHP
PHP小技巧之JS和CSS优化工具Minify的使用方法
2014/05/19 PHP
PHP中file_exists函数不支持中文名的解决方法
2014/07/26 PHP
PHP内存缓存Memcached类实例
2014/12/08 PHP
Avengerls vs Newbee BO3 第二场2.18
2021/03/10 DOTA
基础的prototype.js常用函数及其用法
2007/03/10 Javascript
JavaScript简单实现鼠标拖动选择功能
2014/03/06 Javascript
jQuery插件开发详细教程
2014/06/06 Javascript
JavaScript中判断原生函数检查function是否是原生代码
2014/09/09 Javascript
轻松创建nodejs服务器(5):事件处理程序
2014/12/18 NodeJs
javascript数据结构与算法之检索算法
2015/04/04 Javascript
javascript简单实现类似QQ头像弹出效果的方法
2015/08/03 Javascript
jQuery插件Flexslider实现图片轮播、图文结合滑动切换效果
2020/04/16 Javascript
JavaScript比较两个数组的内容是否相同(推荐)
2017/05/02 Javascript
vue中实现在外部调用methods的方法(推荐)
2018/02/08 Javascript
深入理解 TypeScript Reflect Metadata
2019/12/12 Javascript
JavaScript HTML DOM 元素 (节点)新增,编辑,删除操作实例分析
2020/03/02 Javascript
js实现简单五子棋游戏
2020/05/28 Javascript
[05:10]2014DOTA2国际邀请赛 通往胜利之匙赛场探秘之旅
2014/07/18 DOTA
[49:11]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.20
2020/12/23 DOTA
Python标准库之循环器(itertools)介绍
2014/11/25 Python
使用Python的判断语句模拟三目运算
2015/04/24 Python
Python设计模式之代理模式简单示例
2018/01/09 Python
基于python list对象中嵌套元组使用sort时的排序方法
2018/04/18 Python
解决Python 爬虫URL中存在中文或特殊符号无法请求的问题
2018/05/11 Python
Python数据库小程序源代码
2019/09/15 Python
零基础学python应该从哪里入手
2020/08/11 Python
python3 kubernetes api的使用示例
2021/01/12 Python
Html5大文件断点续传实现方法
2015/12/05 HTML / CSS
北京一家公司的.net开发工程师笔试题
2012/04/17 面试题
高三政治教学反思
2014/02/06 职场文书
《金色的脚印》教后反思
2014/04/23 职场文书
大学生自我评价200字(4篇)
2014/09/17 职场文书
2015年社区宣传工作总结
2015/05/20 职场文书
工作简报怎么写
2015/07/21 职场文书