微信小程序-獲取當前城市位置 , 在一些小程序,會根據不一樣的城市,展示不一樣的商品,和內容,這就須要獲取位置,轉換位城市來處理。javascript
1, 獲取當前地理位置,首先要拿到用戶的受權wx.openSetting;html
調起客戶端小程序設置界面,返回用戶設置的操做結果。設置界面只會出現小程序已經向用戶請求過的權限 ,若沒位置受權,則彈出。java
2,微信的getLocation接口,獲取當前用戶的地理位置(微信返回的是經緯度,速度等參數)git
獲取當前的地理位置、速度。當用戶離開小程序後,此接口沒法調用json
3,微信沒有將經緯度直接轉換爲地理位置,借用騰訊位置服務中關於微信小程序的地理轉換JS SDK 的API(返回信息中包括國家,省,市,區,經緯度等地理位置)小程序
圖示爲獲取用戶地理位置受權彈窗微信小程序
在用戶首次進入某頁面(須要地理位置受權)時候,在頁面進行onLoad,onShow時候,進行調用wx.getLocation要求用戶進行受權;之後每次進入該頁面時,經過wx.getSetting接口,返回用戶受權具體信息。api
wx.getSetting接口具體API地址連接爲點擊打開連接安全
(圖 有照片、錄音、用戶信息、座標位置)微信
上圖中scope.userLocation就是地理受權的標誌;
當該標誌是underfind,表示用戶初次進入該頁面,當該標誌是false,表示用戶初次進入該頁面拒絕了地理受權,應進行從新要求獲取受權。
wx.getSetting({ success: (res) => { console.log(JSON.stringify(res)) // res.authSetting['scope.userLocation'] == undefined 表示 初始化進入該頁面 // res.authSetting['scope.userLocation'] == false 表示 非初始化進入該頁面,且未受權 // res.authSetting['scope.userLocation'] == true 表示 地理位置受權 if (res.authSetting['scope.userLocation'] != undefined && res.authSetting['scope.userLocation'] != true) { wx.showModal({ title: '請求受權當前位置', content: '須要獲取您的地理位置,請確認受權', success: function (res) { if (res.cancel) { wx.showToast({ title: '拒絕受權', icon: 'none', duration: 1000 }) } else if (res.confirm) { wx.openSetting({ success: function (dataAu) { if (dataAu.authSetting["scope.userLocation"] == true) { wx.showToast({ title: '受權成功', icon: 'success', duration: 1000 }) //再次受權,調用wx.getLocation的API } else { wx.showToast({ title: '受權失敗', icon: 'none', duration: 1000 }) } } }) } } }) } else if (res.authSetting['scope.userLocation'] == undefined) { //調用wx.getLocation的API } else { //調用wx.getLocation的API } } })
在拿到用戶受權之後,使用微信的API獲取當前位置的經緯度微信獲取位置API
這裏,咱們進行使用的是騰訊位置服務;專爲小程序開發者提供LBS數據服務工具包,能夠在小程序中調用騰訊位置服務的POI檢索、關鍵詞輸入提示、地址解析、逆地址解析、行政區劃和距離計算等數據。
2,下載微信小程序javaScriptSDK,
3,安全域名設置,在「設置」 -> 「開發設置」中設置request合法域名,添加http://api.map.qq.com
在文件中引入對應的javaScriptSDK文件
var QQMapWX = require('../../../utils/qqmap-wx-jssdk.js'); var qqmapsdk;
在文件中進行js調用,
最後的結果就是能夠得到本身所在城市的具體位置了
以前忘記說了,這邊調用wx.getLocation須要用戶受權,就要在app.json中配置一下
"permission": { "scope.userLocation": { "desc": "你的位置信息將用於小程序位置接口的效果展現" } },
詳細的在 index.js部分的代碼
//index.js //獲取應用實例 const app = getApp(); var QQMapWX = require('../../../utils/qqmap-wx-jssdk.js'); var qqmapsdk; Page({ data: { province: '', city: '', latitude: '', longitude: '' }, onLoad: function () { qqmapsdk = new QQMapWX({ key: 'XXXX-XXXX-XXXX-XXXX' //這裏本身的key祕鑰進行填充 }); }, onShow: function () { let vm = this; vm.getUserLocation(); }, getUserLocation: function () { let vm = this; wx.getSetting({ success: (res) => { console.log(JSON.stringify(res)) // res.authSetting['scope.userLocation'] == undefined 表示 初始化進入該頁面 // res.authSetting['scope.userLocation'] == false 表示 非初始化進入該頁面,且未受權 // res.authSetting['scope.userLocation'] == true 表示 地理位置受權 if (res.authSetting['scope.userLocation'] != undefined && res.authSetting['scope.userLocation'] != true) { wx.showModal({ title: '請求受權當前位置', content: '須要獲取您的地理位置,請確認受權', success: function (res) { if (res.cancel) { wx.showToast({ title: '拒絕受權', icon: 'none', duration: 1000 }) } else if (res.confirm) { wx.openSetting({ success: function (dataAu) { if (dataAu.authSetting["scope.userLocation"] == true) { wx.showToast({ title: '受權成功', icon: 'success', duration: 1000 }) //再次受權,調用wx.getLocation的API vm.getLocation(); } else { wx.showToast({ title: '受權失敗', icon: 'none', duration: 1000 }) } } }) } } }) } else if (res.authSetting['scope.userLocation'] == undefined) { //調用wx.getLocation的API vm.getLocation(); } else { //調用wx.getLocation的API vm.getLocation(); } } }) }, // 微信得到經緯度 getLocation: function () { let vm = this; wx.getLocation({ type: 'wgs84', success: function (res) { console.log(JSON.stringify(res)) var latitude = res.latitude var longitude = res.longitude var speed = res.speed var accuracy = res.accuracy; vm.getLocal(latitude, longitude) }, fail: function (res) { console.log('fail' + JSON.stringify(res)) } }) }, // 獲取當前地理位置 getLocal: function (latitude, longitude) { let vm = this; qqmapsdk.reverseGeocoder({ location: { latitude: latitude, longitude: longitude }, success: function (res) { console.log(JSON.stringify(res)); let province = res.result.ad_info.province let city = res.result.ad_info.city vm.setData({ province: province, city: city, latitude: latitude, longitude: longitude }) }, fail: function (res) { console.log(res); }, complete: function (res) { // console.log(res); } }); } })
頁面展現部分的代碼
<!--index.wxml--> <view class="retailStore"> <view class="cnaps borderBottom"> <text>所在城市</text> <input class='m-bbt' placeholder-class='plhStyle' type='number' maxlength='50' placeholder='' bindinput="bindKeyInput" value='{{province}} {{city}}' disabled></input> </view> </view>
版權聲明:本文爲CSDN博主「Anita梅梅」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。
原文連接:https://blog.csdn.net/weixin_42262436/article/details/80458430
嘿嘿, 認爲這 個 知識點,其餘小程序也會遇到,特此記錄。 轉載了 「Anita梅梅」的原創文章。 本身 也加深印象。之後遇到這樣問題 有的放矢。