uniapp小程序?qū)崙?zhàn)之利用騰訊地圖獲取定位
前言
本篇文章分享一下我在實(shí)際開(kāi)發(fā)小程序時(shí)遇到的需要獲取用戶當(dāng)前位置的問(wèn)題,在小程序開(kāi)發(fā)過(guò)程中經(jīng)常使用到的獲取定位功能。uniapp官方也提供了相應(yīng)的API供我們使用。
官網(wǎng)地址:uni.getLocation(OBJECT))
1、首先看官網(wǎng)
uni.getLocation(OBJECT)
獲取當(dāng)前的地理位置、速度。
OBJECT 參數(shù)說(shuō)明
參數(shù)名 | 類型 | 必填 | 說(shuō)明 | 平臺(tái)差異說(shuō)明 |
---|---|---|---|---|
type | String | 否 | 默認(rèn)為 wgs84 返回 gps 坐標(biāo),gcj02 返回國(guó)測(cè)局坐標(biāo),可用于 uni.openLocation 和 map 組件坐標(biāo),App 和 H5 需配置定位 SDK 信息才可支持 gcj02。 | |
altitude | Boolean | 否 | 傳入 true 會(huì)返回高度信息,由于獲取高度需要較高精確度,會(huì)減慢接口返回速度 | 字節(jié)跳動(dòng)小程序、飛書(shū)小程序、支付寶小程序不支持 |
geocode | Boolean | 否 | 默認(rèn)false,是否解析地址信息 | 僅App平臺(tái)支持(安卓需指定 type 為 gcj02 并配置三方定位SDK) |
highAccuracyExpireTime | Number | 否 | 高精度定位超時(shí)時(shí)間(ms),指定時(shí)間內(nèi)返回最高精度,該值3000ms以上高精度定位才有效果 | App (3.2.11+)、H5 (3.2.11+)、微信小程序 (基礎(chǔ)庫(kù) 2.9.0+) |
timeout | String | 否 | 默認(rèn)為 5,定位超時(shí)時(shí)間,單位秒 | 僅飛書(shū)小程序支持 |
cacheTimeout | Number | 否 | 定位緩存超時(shí)時(shí)間,單位秒;每次定位緩存當(dāng)前定位數(shù)據(jù),并記下時(shí)間戳,當(dāng)下次調(diào)用在cacheTimeout之內(nèi)時(shí),返回緩存數(shù)據(jù) | 僅飛書(shū)小程序、支付寶小程序支持 |
accuracy | String | 否 | 默認(rèn)為 high,指定期望精度,支持 high,best。當(dāng)指定 high 時(shí),期望精度值為100m,當(dāng)指定 best 時(shí)期望精度值為20m。當(dāng)定位得到的精度不符合條件時(shí),在timeout之前會(huì)繼續(xù)定位,嘗試拿到符合要求的定位結(jié)果 | 僅飛書(shū)小程序支持 |
isHighAccuracy | Boolean | 否 | 開(kāi)啟高精度定位 | App (3.4.0+)、H5 (3.4.0+)、微信小程序 (基礎(chǔ)庫(kù) 2.9.0+) |
success | Function | 是 | 接口調(diào)用成功的回調(diào)函數(shù),返回內(nèi)容詳見(jiàn)返回參數(shù)說(shuō)明。 | |
fail | Function | 否 | 接口調(diào)用失敗的回調(diào)函數(shù) | |
complete | Function | 否 | 接口調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會(huì)執(zhí)行) |
success 返回參數(shù)說(shuō)明
參數(shù) | 說(shuō)明 |
---|---|
latitude | 緯度,浮點(diǎn)數(shù),范圍為-90~90,負(fù)數(shù)表示南緯 |
longitude | 經(jīng)度,浮點(diǎn)數(shù),范圍為-180~180,負(fù)數(shù)表示西經(jīng) |
speed | 速度,浮點(diǎn)數(shù),單位m/s |
accuracy | 位置的精確度 |
altitude | 高度,單位 m |
verticalAccuracy | 垂直精度,單位 m(Android 無(wú)法獲取,返回 0) |
horizontalAccuracy | 水平精度,單位 m |
address | 地址信息(僅App端支持,需配置geocode為true) |
address 地址信息說(shuō)明
屬性 | 類型 | 描述 | 說(shuō)明 |
---|---|---|---|
country | String | 國(guó)家 | 如“中國(guó)”,如果無(wú)法獲取此信息則返回undefined |
province | String | 省份名稱 | 如“北京市”,如果無(wú)法獲取此信息則返回undefined |
city | String | 城市名稱 | 如“北京市”,如果無(wú)法獲取此信息則返回undefined |
district | String | 區(qū)(縣)名稱 | 如“朝陽(yáng)區(qū)”,如果無(wú)法獲取此信息則返回undefined |
street | String | 街道信息 | 如“酒仙橋路”,如果無(wú)法獲取此信息則返回undefined |
streetNum | String | 獲取街道門牌號(hào)信息 | 如“3號(hào)”,如果無(wú)法獲取此信息則返回undefined |
poiName | String | POI信息 | 如“電子城.國(guó)際電子總部”,如果無(wú)法獲取此信息則返回undefined |
postalCode | String | 郵政編碼 | 如“100016”,如果無(wú)法獲取此信息則返回undefined |
cityCode | String | 城市代碼 | 如“010”,如果無(wú)法獲取此信息則返回undefined |
示例
uni.getLocation({ type: 'wgs84', success: function (res) { console.log('當(dāng)前位置的經(jīng)度:' + res.longitude); console.log('當(dāng)前位置的緯度:' + res.latitude); } });
#注意
H5 平臺(tái)
- 在較新的瀏覽器上,H5 端獲取定位信息,要求部署在 https 服務(wù)上,本地預(yù)覽(localhost)仍然可以使用 http 協(xié)議。
- 國(guó)產(chǎn)安卓手機(jī)上,H5若無(wú)法定位,檢查手機(jī)是否開(kāi)通位置服務(wù)、GPS,ROM是否給該瀏覽器位置權(quán)限、瀏覽器是否對(duì)網(wǎng)頁(yè)彈出請(qǐng)求給予定位的詢問(wèn)框。
- 安卓手機(jī) 在原生App內(nèi)嵌H5時(shí),無(wú)法定位需要原生App處理Webview。
- 移動(dòng)端瀏覽器 普遍僅支持GPS定位,在GPS信號(hào)弱的地方可能定位失敗。
- PC 設(shè)備 使用 Chrome 瀏覽器的時(shí)候,位置信息是連接谷歌服務(wù)器獲取的,國(guó)內(nèi)用戶可能獲取位置信息失敗。
- 微信公眾號(hào)可使用微信js sdk,詳見(jiàn)
- 2.9.9 版本以上,優(yōu)化 uni.getLocation 支持通過(guò) IP 定位。默認(rèn)通過(guò) GPS 獲取,如果獲取失敗,備選方案是通過(guò) IP 定位獲取,需填寫三方地圖服務(wù)平臺(tái)的秘鑰(key)。key配置:manifest.json —> H5配置 —> 定位和地圖 —> key。
App 平臺(tái)
- Android由于谷歌服務(wù)被墻,或者手機(jī)上沒(méi)有GMS,想正常定位就需要向高德等三方服務(wù)商申請(qǐng)SDK資質(zhì),獲取AppKey。否則打包后定位就會(huì)不準(zhǔn)。云打包時(shí)需要在manifest的SDK配置中填寫 Appkey。在 manifest 可視化界面有詳細(xì)申請(qǐng)指南,詳見(jiàn):https://ask.dcloud.net.cn/article/29。離線打包自行在原生工程中配置。注意包名、appkey、證書(shū)信息必須匹配。真機(jī)運(yùn)行可以正常定位,是因?yàn)檎鏅C(jī)運(yùn)行基座使用了DCloud向高德申請(qǐng)的sdk配置,打包后必須由開(kāi)發(fā)者自己申請(qǐng)。如果手機(jī)自帶GMS且網(wǎng)絡(luò)環(huán)境可以正常訪問(wèn)google定位服務(wù)器,此時(shí)無(wú)需在 manifest 填寫高德定位的 sdk 配置。
- 注意手機(jī)自身要開(kāi)啟定位、同時(shí)要給App賦予定位權(quán)限。權(quán)限判斷可參考:https://uniapp.dcloud.net.cn/api/system/getappauthorizesetting.html
- <map> 組件默認(rèn)為國(guó)測(cè)局坐標(biāo) gcj02,調(diào)用 uni.getLocation 返回結(jié)果傳遞給 <map> 組件時(shí),需指定 type 為 gcj02。
- 定位 和 map 是兩個(gè)東西。通過(guò) getLocation 得到位置坐標(biāo)后,可以在任意map地圖上展示,比如定位使用高德,地圖使用 google 的 webview 版地圖。如果坐標(biāo)系不同時(shí),注意轉(zhuǎn)換坐標(biāo)系。
- 如果使用 web-view 加載地圖,無(wú)需在manifest里配地圖的sdk配置。
- 持續(xù)定位方案:iOS端可以申請(qǐng)持續(xù)定位權(quán)限,參考。Android如果進(jìn)程被殺,代碼無(wú)法執(zhí)行??梢允褂?unipush ,通過(guò)服務(wù)器激活A(yù)pp,執(zhí)行透?jìng)飨?,讓App啟動(dòng)然后采集位置。Android上,即使自己寫原生插件做后臺(tái)進(jìn)程,也很容易被殺,unipush是更合適的方案
- 3.3.0 版本以上 優(yōu)化系統(tǒng)定位模塊,可不使用三方定位SDK的進(jìn)行高精度定位,具體參考:系統(tǒng)定位。
小程序平臺(tái)
- api默認(rèn)不返回詳細(xì)地址中文描述。需要中文地址有2種方式:1、使用高德地圖小程序sdk,在app和微信上都可以獲得中文地址,參考。2、只考慮app,使用plus.geolocation也可以獲取中文地址。manifest里的App SDK配置僅用于app,小程序無(wú)需在這里配置。
- 可以通過(guò)用戶授權(quán)API來(lái)判斷用戶是否給應(yīng)用授予定位權(quán)限,詳見(jiàn)
- 在 微信小程序 中,當(dāng)用戶離開(kāi)應(yīng)用后,此接口無(wú)法調(diào)用,需要申請(qǐng) 后臺(tái)持續(xù)定位權(quán)限 ,另外新版本中需要使用 wx.onLocationChange 監(jiān)聽(tīng)位置信息變化;當(dāng)用戶點(diǎn)擊“顯示在聊天頂部”時(shí),此接口可繼續(xù)調(diào)用
補(bǔ)充: 以上內(nèi)容為 官方文檔 搬運(yùn)過(guò)來(lái)的,詳情可點(diǎn)擊鏈接跳轉(zhuǎn)至官網(wǎng)。
我們本次開(kāi)發(fā)的是小程序,需要注意的是,我們本次小程序獲取定位使用的是騰訊位置服務(wù),所以需要申請(qǐng)騰訊位置服務(wù)的SDK。
2、騰訊位置服務(wù)平臺(tái)申請(qǐng)密鑰和下載SDK
申請(qǐng)步驟:詳細(xì)文檔
2.1 申請(qǐng)開(kāi)發(fā)者秘鑰
點(diǎn)擊文檔中的申請(qǐng)秘鑰鏈接,跳轉(zhuǎn)至騰訊位置服務(wù)平臺(tái),如下圖所示申請(qǐng)即可。(沒(méi)有賬號(hào)的先注冊(cè)賬號(hào))
2.2 開(kāi)通webserviceAPI服務(wù)
開(kāi)通webserviceAPI服務(wù):控制臺(tái) ->應(yīng)用管理 -> 我的應(yīng)用 ->添加key-> 勾選WebServiceAPI -> 保存
(小程序SDK需要用到webserviceAPI的部分服務(wù),所以使用該功能的KEY需要具備相應(yīng)的權(quán)限)
1、申請(qǐng)Key
2、復(fù)制申請(qǐng)好的Key值等待使用
2.3 下載微信小程序JavaScriptSDK
微信小程序JavaScriptSDK下載地址(點(diǎn)擊文字即可跳轉(zhuǎn))
下載好解壓完成后,我們一般放在根目錄下面的common目錄下(如下圖)
2.4 安全域名設(shè)置
安全域名設(shè)置,在小程序管理后臺(tái) -> 開(kāi)發(fā) -> 開(kāi)發(fā)管理 -> 開(kāi)發(fā)設(shè)置 -> “服務(wù)器域名” 中設(shè)置request合法域名,添加https://apis.map.qq.com
到這里終于算是申請(qǐng)完了,在配置一下就好了。
3、配置manifest.json文件
"permission" : { "scope.userLocation" : { "desc" : "為了您更好的體驗(yàn),請(qǐng)確認(rèn)獲取您的位置" } } "requiredPrivateInfos": ["getLocation", "chooseLocation"]
4、示例代碼展示
4.1 引用下載好的SDK
這里我放到了common目錄下:
import QQMapWX from "../../common/qqmap-wx-jssdk.js"
4.2 獲取定位函數(shù)示例
methods: { //獲取位置信息 async getLocationInfo() { return new Promise((resolve) => { //位置信息默認(rèn)數(shù)據(jù) let location = { longitude: 0, latitude: 0, province: "", city: "", area: "", street: "", address: "", }; uni.getLocation({ type: "gcj02", success(res) { location.longitude = res.longitude; location.latitude = res.latitude; // 騰訊地圖Api const qqmapsdk = new QQMapWX({ key: 'XXXXXXXXXXXXXXXXXXXXXXXX' //這里填寫自己申請(qǐng)的key }); qqmapsdk.reverseGeocoder({ location, success(response) { let info = response.result; console.log(info); location.province = info.address_component.province; location.city = info.address_component.city; location.area = info.address_component.district; location.street = info.address_component.street; location.address = info.address; resolve(location); }, }); }, fail(err) { console.log(err) resolve(location); }, }); }); } }
4.3 調(diào)用函數(shù)
函數(shù)調(diào)用可以自己去選擇在頁(yè)面加載的時(shí)候加載,或者有一個(gè)觸發(fā)條件。(我是用的頁(yè)面加載,所以放在了onload方法中)。
async onLoad() { const location = await this.getLocationInfo(); this.position = location.address },
注意:這里使用的this.position,是在data中定義的,代碼示例中沒(méi)有寫。需要自己在data方法中定一個(gè)position變量
4.4 頁(yè)面渲染
<view style="margin-top: 40rpx;margin-left: 16rpx;color:red;"> 當(dāng)前定位:{{position}} </view>
5、效果展示
到這里就結(jié)束啦!想要的獲取用戶位置信息的功能就實(shí)現(xiàn)啦。
總結(jié)
到此這篇關(guān)于uniapp小程序?qū)崙?zhàn)之利用騰訊地圖獲取定位的文章就介紹到這了,更多相關(guān)uniapp小程序用騰訊地圖獲取定位內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS導(dǎo)入本地json文件數(shù)據(jù)的三類方法舉例講解
作為一名剛?cè)胄械拈_(kāi)發(fā)者,你可能會(huì)遇到需要在JavaScript中引用JSON文件的情況,下面這篇文章主要給大家介紹了關(guān)于JS導(dǎo)入本地json文件數(shù)據(jù)的三類方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09uniapp 引用 js 組件的方法(場(chǎng)景分析)
在UniApp開(kāi)發(fā)過(guò)程中,我們不僅需要掌握各種UI組件的使用方法,還需要了解如何在項(xiàng)目中引入JS文件,在本文中,我將介紹UniApp中如何引入JS的方法,感興趣的朋友跟隨小編一起看看吧2023-09-09js 鍵盤記錄實(shí)現(xiàn)(兼容FireFox和IE)
用js實(shí)現(xiàn)鍵盤記錄,要關(guān)注瀏覽器的三種按鍵事件類型,即keydown,keypress和keyup,它們分別對(duì)應(yīng)onkeydown、onkeypress和onkeyup這三個(gè)事件句柄。一個(gè)典型的按鍵會(huì)產(chǎn)生所有這三種事件,依次是keydown,keypress,然后是按鍵釋放時(shí)候的keyup。2010-02-02JavaScript運(yùn)動(dòng)框架 解決速度正負(fù)取整問(wèn)題(一)
這篇文章主要為大家詳細(xì)介紹了JavaScript運(yùn)動(dòng)框架的第一部分,解決速度正負(fù)取整問(wèn)題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05javascript設(shè)計(jì)模式之解釋器模式詳解
這篇文章主要介紹了javascript設(shè)計(jì)模式之解釋器模式詳解,當(dāng)有一個(gè)語(yǔ)言需要解釋執(zhí)行,并且可以將該語(yǔ)言中的句子表示為一個(gè)抽象語(yǔ)法樹(shù)的時(shí)候,可以考慮使用解釋器模式,需要的朋友可以參考下2014-06-06關(guān)于預(yù)加載InstantClick的問(wèn)題解決方法
本篇文章主要介紹了關(guān)于預(yù)加載InstantClick的問(wèn)題解決方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09javascript加號(hào)"+"的二義性說(shuō)明
單個(gè)的加號(hào)作為運(yùn)算符在 JavaScript 中有三種作用。2013-03-03