微信小程序計算用戶離商家的距離(利用經緯度求距)

前言

最近在幫朋友(商家)寫小程序,因此看了很多關於小程序的知識,總結一下計算距離這條線。html

思路

一共有兩種方法,各有利弊:
1.利用小程序的wx.getLocation 方法獲得用戶的經緯度,而後用已知的商家的經緯進行計算;
2.利用騰訊地圖位置服務calculateDistance直接計算git

先熟悉下兩個單詞:
**longitude:經度;
latitude:緯度;**
下邊是兩種方法的具體實現web

1、獲取用戶的位置信息,再進行計算(wx.getLocation)

1.小程序提供了獲取用戶位置信息的api,因此咱們能直接獲取到經緯度;
2.在百度拾取座標系統,獲取商家的具體經緯度(例:北京故宮116.403414(經度),39.924091(緯度)。)
3.利用公式進行兩點的經緯度計算小程序

代碼:api

Page({
 data:{
    },
 onLoad: function() {
        var _this = this;
        _this.findXy() //查詢用戶與商家的距離
        },
        
   findXy() { //獲取用戶的經緯度
        var _this = this
        wx.getLocation({
            type: 'wgs84',
            success(res) {
                _this.getDistance(res.latitude, res.longitude, 39.924091,116.403414)
            }
        })
    },
    
     Rad: function(d) { //根據經緯度判斷距離
        return d * Math.PI / 180.0;
    },
    getDistance: function(lat1, lng1, lat2, lng2) {
        // lat1用戶的緯度
        // lng1用戶的經度
        // lat2商家的緯度
        // lng2商家的經度
        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) + '千米' //保留兩位小數
        console.log('經緯度計算的距離:' + s)
        return s
    }
    )}

2、利用騰訊地圖的位置服務

1.這裏配置的地方就比較多一點了,先到騰訊位置服務註冊登陸,申請key、引入依賴。
下圖的第三步配置是要在小程序的後臺那裏設置,記得不要找錯地方了。如圖:app

clipboard.png
2.配置完成了以後,小程序從新編譯一下
3.咱們看下騰訊的api,是怎麼求兩點距離的騰訊位置-兩點求距
4.讀完可知,咱們只須要商家的經緯度便可,咱們在小程序裏實驗一下ui

// 引入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' // 必填
        });
        // 調用接口
        demo.calculateDistance({
            to: [{

                latitude: 39.924091, //商家的緯度
                longitude: 116.403414, //商家的經度
            }],
            success: function(res) {
                let hw = res.result.elements[0].distance //拿到距離(米)
                if (hw && hw !== -1) { //拿到正確的值
                    //轉換成千米
                    hw = (hw / 2 / 500).toFixed(2) + '千米'
                } else {
                    hw = "距離太近或請刷新重試"
                }
          
                console.log('騰訊地圖計算距離商家' + hw);
            }
        });
    }
})

可能會出現的錯誤:
{status:199,message:'此key未開啓webservice功能'},
沒關係,打開騰訊位置-key配置,設置一下剛纔申請key的詳情頁面,把下列選項所有勾上,把你小程序的appid也寫上。
保存完,從新編譯再試this

clipboard.png

優缺點

優勢:
第一種方法,不用配置任何東西,只需兩點的經緯度便可,沒有使用次數限制;
第二種方法,不須要本身計算,騰訊會計算好,距離比較精確,只須要只要商家的經緯度便可spa


缺點:
第一種方法,計算精度上可能有待考量,在個人實驗下,感受是在上帝視角,直接計算兩個點的距離,不過好像兩點距離不太遠,問題不大;
下圖是我用兩種方法計算的杭州-石家莊的距離,方法一顯然比騰訊的少一點距離,騰訊可能參考了一些實際的路程、路況之類的吧,感受跟從地圖上查行程規劃出來的距離差很少。3d

clipboard.png
第二種方法,有使用次數上的限制,天天只能用1萬次,固然能夠再去買配額

建議

既然騰訊的api有使用次數限制,那咱們就寫個方法,先用騰訊的,加上判斷,用完了再用 經緯度計算的。固然,有錢的大佬能夠另外買騰訊的配額。

相關文章
相關標籤/搜索