根據(jù)經(jīng)緯度計(jì)算地球上兩點(diǎn)之間的距離js實(shí)現(xiàn)代碼
更新時(shí)間:2013年03月05日 14:13:45 作者:
最近用到了根據(jù)經(jīng)緯度計(jì)算地球表面兩點(diǎn)間距離的公式,然后就用JS實(shí)現(xiàn)了一下,根據(jù)地球是一個(gè)光滑的球面以及并不是一個(gè)真正的圓球體,而是橢球延伸出兩種方法,感興趣的你可以參考下
利用JS實(shí)現(xiàn)的根據(jù)經(jīng)緯度計(jì)算地球上兩點(diǎn)之間的距離
最近用到了根據(jù)經(jīng)緯度計(jì)算地球表面兩點(diǎn)間距離的公式,然后就用JS實(shí)現(xiàn)了一下。
計(jì)算地球表面兩點(diǎn)間的距離大概有兩種辦法。
第一種是默認(rèn)地球是一個(gè)光滑的球面,然后計(jì)算任意兩點(diǎn)間的距離,這個(gè)距離叫做大圓距離(The Great Circle Distance)。
公式如下:
使用JS來實(shí)現(xiàn)為:
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;
}
這個(gè)公式在大多數(shù)情況下比較正確,只有在處理球面上的相對(duì)點(diǎn)的時(shí)候,會(huì)出現(xiàn)問題,有一個(gè)修正的公式,因?yàn)闆]有需要,就沒有找出來,可以在wiki上查到。
當(dāng)然,我們都知道,地球其實(shí)并不是一個(gè)真正的圓球體,而是橢球,所以有了下面的公式:
/**
* 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));
}
這個(gè)公式計(jì)算出的結(jié)果要比第一個(gè)好一些,當(dāng)然,最后結(jié)果的經(jīng)度實(shí)際上還取決于傳入的坐標(biāo)的精度。
最近用到了根據(jù)經(jīng)緯度計(jì)算地球表面兩點(diǎn)間距離的公式,然后就用JS實(shí)現(xiàn)了一下。
計(jì)算地球表面兩點(diǎn)間的距離大概有兩種辦法。
第一種是默認(rèn)地球是一個(gè)光滑的球面,然后計(jì)算任意兩點(diǎn)間的距離,這個(gè)距離叫做大圓距離(The Great Circle Distance)。
公式如下:
使用JS來實(shí)現(xiàn)為:
復(fù)制代碼 代碼如下:
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;
}
這個(gè)公式在大多數(shù)情況下比較正確,只有在處理球面上的相對(duì)點(diǎn)的時(shí)候,會(huì)出現(xiàn)問題,有一個(gè)修正的公式,因?yàn)闆]有需要,就沒有找出來,可以在wiki上查到。
當(dāng)然,我們都知道,地球其實(shí)并不是一個(gè)真正的圓球體,而是橢球,所以有了下面的公式:
復(fù)制代碼 代碼如下:
/**
* 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));
}
這個(gè)公式計(jì)算出的結(jié)果要比第一個(gè)好一些,當(dāng)然,最后結(jié)果的經(jīng)度實(shí)際上還取決于傳入的坐標(biāo)的精度。
您可能感興趣的文章:
- 微信JS-SDK坐標(biāo)位置如何轉(zhuǎn)換為百度地圖坐標(biāo)
- 基于JavaScript實(shí)現(xiàn)高德地圖和百度地圖提取行政區(qū)邊界經(jīng)緯度坐標(biāo)
- 通過百度地圖獲取公交線路的站點(diǎn)坐標(biāo)的js代碼
- 利用java、js或mysql計(jì)算高德地圖中兩坐標(biāo)之間的距離
- JavaScript獲取對(duì)象在頁(yè)面中位置坐標(biāo)的方法
- javascript獲取文檔坐標(biāo)和視口坐標(biāo)
- js浮點(diǎn)數(shù)精確計(jì)算(加、減、乘、除)
- 精通Javascript系列之?dāng)?shù)值計(jì)算
- js中火星坐標(biāo)、百度坐標(biāo)、WGS84坐標(biāo)轉(zhuǎn)換實(shí)現(xiàn)方法示例
相關(guān)文章
新發(fā)現(xiàn)原來documenet.URL也可以實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)
新發(fā)現(xiàn)原來documenet.URL也可以實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)...2007-08-08
詳解Webpack loader 之 file-loader
這篇文章主要介紹了詳解Webpack loader 之 file-loader,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11
一個(gè)檢測(cè)表單數(shù)據(jù)的JavaScript實(shí)例
這篇文章主要介紹了一個(gè)檢測(cè)表單數(shù)據(jù)的JavaScript實(shí)例,很簡(jiǎn)單,很實(shí)用,比較適合初學(xué)者2014-10-10
JavaScript中Function函數(shù)與Object對(duì)象的關(guān)系
這篇文章主要介紹了JavaScript中Function函數(shù)與Object對(duì)象的關(guān)系的相關(guān)資料,需要的朋友可以參考下2015-12-12
js表格排序?qū)嵗治觯ㄖС謎nt,float,date,string四種數(shù)據(jù)類型)
這篇文章主要介紹了js表格排序?qū)嵗治觯ㄖС謎nt,float,date,string四種數(shù)據(jù)類型),涉及javascript常用的升序、降序及數(shù)據(jù)類型轉(zhuǎn)換等相關(guān)技巧,需要的朋友可以參考下2015-05-05
uniapp 仿微信的右邊下拉選擇彈出框的實(shí)現(xiàn)代碼
這篇文章主要介紹了uniapp 仿微信的右邊下拉選擇彈出框的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
JavaScript中的Map數(shù)據(jù)結(jié)構(gòu)詳解
這篇文章主要為大家介紹了JavaScript的Map數(shù)據(jù)結(jié)構(gòu),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01

