最近在幫朋友(商家)寫小程序,所以看了不少關(guān)于小程序的知識,總結(jié)一下計算距離這條線。
一共有兩種方法,各有利弊:
1.利用小程序的wx.getLocation 方法得到用戶的經(jīng)緯度,然后用已知的商家的經(jīng)緯進(jìn)行計算;
2.利用騰訊地圖位置服務(wù)calculateDistance直接計算
先熟悉下兩個單詞:
**longitude:經(jīng)度;
latitude:緯度;**
下邊是兩種方法的具體實現(xiàn)
1.小程序提供了獲取用戶位置信息的api,所以我們能直接獲取到經(jīng)緯度;
2.在百度拾取坐標(biāo)系統(tǒng),獲取商家的具體經(jīng)緯度(例:北京故宮116.403414(經(jīng)度),39.924091(緯度)。)
3.利用公式進(jìn)行兩點的經(jīng)緯度計算
代碼:
Page({ data:{ }, onLoad: function() { var _this = this; _this.findXy() //查詢用戶與商家的距離 }, findXy() { //獲取用戶的經(jīng)緯度 var _this = this wx.getLocation({ type: 'wgs84', success(res) { _this.getDistance(res.latitude, res.longitude, 39.924091,116.403414) } }) }, Rad: function(d) { //根據(jù)經(jīng)緯度判斷距離 return d * Math.PI / 180.0; }, getDistance: function(lat1, lng1, lat2, lng2) { // lat1用戶的緯度 // lng1用戶的經(jīng)度 // lat2商家的緯度 // lng2商家的經(jīng)度 var radLat1 = this.Rad(lat1); var radLat2 = this.Rad(lat2); var a = radLat1 - radLat2; var b = this.Rad(lng1) - this.Rad(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 * 6378.137; s = Math.round(s * 10000) / 10000; s = s.toFixed(2) + '公里' //保留兩位小數(shù) console.log('經(jīng)緯度計算的距離:' + s) return s } )} |
1.這里配置的地方就比較多一點了,先到騰訊位置服務(wù)注冊登錄,申請key、引入依賴。
下圖的第三步配置是要在小程序的后臺那里設(shè)置,記得不要找錯地方了。如圖:
2.配置完成了之后,小程序重新編譯一下
3.我們看下騰訊的api,是怎么求兩點距離的騰訊位置-兩點求距
4.讀完可知,我們只需要商家的經(jīng)緯度即可,我們在小程序里實驗一下
// 引入SDK核心類 var QQMapWX = require('../../utils/qqmap-wx-jssdk.js'); Page({ onLoad: function() { var _this = this; _this.findShop() //查詢用戶與商家的距離 }, findShop() { //拿到商家的地理位置,用到了騰訊地圖的api // 實例化API核心類 var _that = this var demo = new QQMapWX({ key: '你申請到的key' // 必填 }); // 調(diào)用接口 demo.calculateDistance({ to: [{ latitude: 39.924091, //商家的緯度 longitude: 116.403414, //商家的經(jīng)度 }], success: function(res) { let hw = res.result.elements[0].distance //拿到距離(米) if (hw && hw !== -1) { //拿到正確的值 //轉(zhuǎn)換成公里 hw = (hw / 2 / 500).toFixed(2) + '公里' } else { hw = "距離太近或請刷新重試" } console.log('騰訊地圖計算距離商家' + hw); } }); } }) |
可能會出現(xiàn)的錯誤:
{status:199,message:'此key未開啟webservice功能'},
不要緊,打開騰訊位置-key配置,設(shè)置一下剛才申請key的詳情頁面,把下列選項全部勾上,把你小程序的appid也寫上。
保存完,重新編譯再試
優(yōu)點:
第一種方法,不用配置任何東西,只需兩點的經(jīng)緯度即可,沒有使用次數(shù)限制;
第二種方法,不需要自己計算,騰訊會計算好,距離比較精確,只需要只要商家的經(jīng)緯度即可
缺點:
第一種方法,計算精度上可能有待考量,在我的實驗下,感覺是在上帝視角,直接計算兩個點的距離,不過好像兩點距離不太遠(yuǎn),問題不大;
下圖是我用兩種方法計算的杭州-石家莊的距離,方法一顯然比騰訊的少一點距離,騰訊可能參考了一些實際的路程、路況之類的吧,感覺跟從地圖上查行程規(guī)劃出來的距離差不多。
第二種方法,有使用次數(shù)上的限制,每天只能用1萬次,當(dāng)然可以再去買配額
既然騰訊的api有使用次數(shù)限制,那我們就寫個方法,先用騰訊的,加上判斷,用完了再用 經(jīng)緯度計算的。當(dāng)然,有錢的大佬可以另外買騰訊的配額。
工作日 8:30-12:00 14:30-18:00
周六及部分節(jié)假日提供值班服務(wù)