詳解js根據(jù)百度地圖提供經(jīng)緯度計(jì)算兩點(diǎn)距離
正常在使用百度地圖時(shí),我們可以通過(guò)BMap的實(shí)例對(duì)象提供的方法計(jì)算距離:
var map = new BMap.Map('map_canvas');
map.getDistance(point1 ,point2);
//point1、point2 是Point對(duì)象
如果在不使用百度地圖,但是已知百度地圖的經(jīng)緯度情況下也是可以計(jì)算出與上面相同的值的
三方庫(kù) 此庫(kù)提供計(jì)算兩點(diǎn)距離的方法
引用此庫(kù)使用 返回(米)
BMapLib.GeoUtils.getDistance(point1 ,point2)
當(dāng)然如果只想計(jì)算距離也可以直接用下面的代碼:
注:BMap需要導(dǎo)入,使用如下:
BMapLib.GeoUtils.getDistance(lng1,lat1,lng2,lat2)
import BMap from 'BMap'
var BMapLib = window.BMapLib = BMapLib || {};
(function() {
/**
* 地球半徑
*/
var EARTHRADIUS = 6370996.81;
/**
* @exports GeoUtils as BMapLib.GeoUtils
*/
var GeoUtils =
/**
* GeoUtils類(lèi),靜態(tài)類(lèi),勿需實(shí)例化即可使用
* @class GeoUtils類(lèi)的<b>入口</b>。
* 該類(lèi)提供的都是靜態(tài)方法,勿需實(shí)例化即可使用。
*/
BMapLib.GeoUtils = function(){
};
/**
* 將度轉(zhuǎn)化為弧度
* @param {degree} Number 度
* @returns {Number} 弧度
*/
GeoUtils.degreeToRad = function(degree){
return Math.PI * degree/180;
}
/**
* 將v值限定在a,b之間,緯度使用
*/
function _getRange(v, a, b){
if(a != null){
v = Math.max(v, a);
}
if(b != null){
v = Math.min(v, b);
}
return v;
}
/**
* 將v值限定在a,b之間,經(jīng)度使用
*/
function _getLoop(v, a, b){
while( v > b){
v -= b - a
}
while(v < a){
v += b - a
}
return v;
}
/**
* 計(jì)算兩點(diǎn)之間的距離,兩點(diǎn)坐標(biāo)必須為經(jīng)緯度
* @param {lng1} Number 點(diǎn)對(duì)象
* @param {lat1} Number 點(diǎn)對(duì)象
* @param {lng2} Number 點(diǎn)對(duì)象
* @param {lat2} Number 點(diǎn)對(duì)象
* @returns {Number} 兩點(diǎn)之間距離,單位為米
*/
GeoUtils.getDistance = function(lng1, lat1, lng2 ,lat2){
let point1 = new BMap.Point(parseFloat(lng1) ,parseFloat(lat1));
let point2 =new BMap.Point(parseFloat(lng2) ,parseFloat(lat2));
//判斷類(lèi)型
if(!(point1 instanceof BMap.Point) ||
!(point2 instanceof BMap.Point)){
return 0;
}
point1.lng = _getLoop(point1.lng, -180, 180);
point1.lat = _getRange(point1.lat, -74, 74);
point2.lng = _getLoop(point2.lng, -180, 180);
point2.lat = _getRange(point2.lat, -74, 74);
let x1, x2, y1, y2;
x1 = GeoUtils.degreeToRad(point1.lng);
y1 = GeoUtils.degreeToRad(point1.lat);
x2 = GeoUtils.degreeToRad(point2.lng);
y2 = GeoUtils.degreeToRad(point2.lat);
return EARTHRADIUS * Math.acos((Math.sin(y1) * Math.sin(y2) + Math.cos(y1) * Math.cos(y2) * Math.cos(x2 - x1)));
}
})();
以上所述是小編給大家介紹的js根據(jù)百度地圖提供經(jīng)緯度計(jì)算兩點(diǎn)距離詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
一文詳解如何用原型鏈的方式實(shí)現(xiàn)JS繼承
JavaScript中,每當(dāng)創(chuàng)建一個(gè)對(duì)象,都會(huì)給這個(gè)對(duì)象提供一個(gè)內(nèi)置對(duì)象 [[Prototype]] 。這個(gè)對(duì)象就是原型對(duì)象,[[Prototype]] 的層層嵌套就形成了原型鏈。本文將詳細(xì)講解如何用原型鏈的方式實(shí)現(xiàn)一個(gè) JS 繼承,感興趣的可以了解下2022-04-04
js將類(lèi)數(shù)組對(duì)象轉(zhuǎn)換成數(shù)組對(duì)象
javascript與dom有許多瑕疵,如著名的類(lèi)數(shù)組對(duì)象Arguments,其他諸如HTMLCollection,NodeList如果它們都是數(shù)組的子類(lèi),那多省時(shí)啊。2010-05-05
javascript常見(jiàn)數(shù)據(jù)驗(yàn)證插件大全
這篇文章主要介紹了javascript常見(jiàn)數(shù)據(jù)驗(yàn)證插件大全,需要的朋友可以參考下2015-08-08
js數(shù)組常見(jiàn)操作及數(shù)組與字符串相互轉(zhuǎn)化實(shí)例詳解
這篇文章主要介紹了js數(shù)組常見(jiàn)操作及數(shù)組與字符串相互轉(zhuǎn)化方法,以實(shí)例形式較為詳細(xì)的分析并總結(jié)了JavaScript數(shù)組的常見(jiàn)使用技巧與轉(zhuǎn)化方法,需要的朋友可以參考下2015-11-11
JavaScript實(shí)現(xiàn)登錄拼圖驗(yàn)證的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用JavaScript實(shí)現(xiàn)登錄拼圖驗(yàn)證的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-01-01
微信小程序?qū)崿F(xiàn)簽到彈窗動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)簽到彈窗動(dòng)畫(huà),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09
JavaScript中函數(shù)(Function)的apply與call理解
這篇文章主要介紹了JavaScript中函數(shù)(Function)的apply與call理解,本文講解了JavaScript函數(shù)調(diào)用分為4中模式以及通過(guò)apply和call實(shí)現(xiàn)擴(kuò)展和繼承兩方面,需要的朋友可以參考下2015-07-07
詳解Bootstrap網(wǎng)格垂直和水平對(duì)齊方式
網(wǎng)格在網(wǎng)頁(yè)布局中是一個(gè)重點(diǎn)和難點(diǎn),布局是網(wǎng)頁(yè)設(shè)計(jì)的起點(diǎn)和基礎(chǔ),本文主要介紹了Bootstrap網(wǎng)格垂直和水平對(duì)齊方式,感興趣的可以了解一下2021-07-07

