国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

根據經緯度計算地球上兩點之間的距離js實現代碼

2024-05-06 14:19:25
字體:
來源:轉載
供稿:網友
利用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));
}

這個公式計算出的結果要比第一個好一些,當然,最后結果的經度實際上還取決于傳入的坐標的精度。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 乌拉特中旗| 濉溪县| 稻城县| 福安市| 麻阳| 肥乡县| 郑州市| 永泰县| 筠连县| 陆河县| 将乐县| 于田县| 长葛市| 托克托县| 长治市| 乐亭县| 静宁县| 西宁市| 酒泉市| 明光市| 察隅县| 黄平县| 锡林浩特市| 盱眙县| 峨眉山市| 扎囊县| 喀喇沁旗| 张家港市| 驻马店市| 囊谦县| 突泉县| 朔州市| 蒙城县| 宽城| 伽师县| 射洪县| 墨江| 珲春市| 通渭县| 敖汉旗| 盖州市|