根据经纬度计算地球上两点之间的距离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 获取元素位置的快速方法 getBoundingClientRect()
Nov 26 Javascript
JavaScript内核之基本概念
Oct 21 Javascript
自定义的一个简单时尚js下拉选择框
Nov 20 Javascript
JavaScript两种跨域技术全面介绍
Apr 16 Javascript
jQuery照片伸缩效果不影响其他元素的布局
May 09 Javascript
浅谈jquery点击label触发2次的问题
Jun 12 Javascript
图文详解Javascript中的上下文和作用域
Feb 15 Javascript
vue动态组件实现选项卡切换效果
Mar 08 Javascript
jquery DataTable实现前后台动态分页
Jun 17 jQuery
用VueJS写一个Chrome浏览器插件的实现方法
Feb 27 Javascript
layui表格内容溢出的解决方法
Sep 06 Javascript
jquery.tagsinput.js实现记录checkbox勾选的顺序
Sep 21 jQuery
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程序61条面向对象分析设计的经验小结
2008/11/12 PHP
简短几句jquery代码的实现一个图片向上滚动切换
2011/09/02 Javascript
js判断样式className同时增加class或删除class
2013/01/30 Javascript
JQuery获取样式中的background-color颜色值的问题
2013/08/20 Javascript
Jjcarousellite 实现图片列表滚动的简单实例
2013/11/29 Javascript
判断某个字符在一个字符串中是否存在的js代码
2014/02/28 Javascript
nodejs文件操作模块FS(File System)常用函数简明总结
2014/06/05 NodeJs
使用JQ来编写最基本的淡入淡出效果附演示动画
2014/10/31 Javascript
使用原生JS实现弹出层特效
2014/12/22 Javascript
jQuery实现给页面换肤的方法
2015/05/30 Javascript
javascript控制层显示或隐藏的方法
2015/07/22 Javascript
[原创]Javascript 实现广告后加载 可加载百度谷歌联盟广告
2016/05/11 Javascript
深入学习js瀑布流布局
2016/10/14 Javascript
原生JS实现图片轮播切换效果
2016/12/15 Javascript
js模块加载方式浅析
2017/08/12 Javascript
bootstrap3中container与container_fluid外层容器的区别讲解
2017/12/04 Javascript
关于Vue中axios的封装实例详解
2019/10/20 Javascript
js布局实现单选按钮控件
2020/01/17 Javascript
JavaScript交换变量的常用方法小结【4种方法】
2020/05/07 Javascript
Vue仿百度搜索功能
2020/12/28 Vue.js
零基础写python爬虫之urllib2中的两个重要概念:Openers和Handlers
2014/11/05 Python
python中bs4.BeautifulSoup的基本用法
2019/07/27 Python
Python3之字节串bytes与字节数组bytearray的使用详解
2019/08/27 Python
Python csv模块使用方法代码实例
2019/08/29 Python
Python with关键字,上下文管理器,@contextmanager文件操作示例
2019/10/17 Python
美国女性服饰销售网站:Nasty Gal(坏女孩)
2016/07/26 全球购物
Silk Therapeutics官网:清洁、抗衰老护肤品
2020/08/12 全球购物
教师档案管理制度
2014/01/23 职场文书
旷课检讨书1000字
2014/02/14 职场文书
在职证明书范本(2014新版)
2014/09/25 职场文书
幼儿园小班教师个人工作总结
2015/02/06 职场文书
测量员岗位职责
2015/02/14 职场文书
2015年七一建党节慰问信
2015/03/23 职场文书
2015年加油站站长工作总结
2015/05/27 职场文书
辛德勒的名单观后感
2015/06/03 职场文书
winserver2019安装软件一直卡在应用程序正在为首次使用做准备
2022/06/10 Servers