定位一直是一個讓人頭疼的問題,不是這個有問題就是那里有問題。這里結合我多方查找和實際運行,獲得的一些經(jīng)驗給予分享。
怎么進行定位?基本流程是:
1.去騰訊位置服務的控制那里創(chuàng)建一個應用
騰訊位置服務 - 立足生態(tài),連接未來 (qq.com)
2.添加一個key,并開通WebServiceAPI服務
這個key是到時候用來定位的標識(必要的)。開發(fā)的哪種就選擇哪種就行。
3.下載微信jssdk(這里會用到逆地址解析等等)
微信小程序JavaScript SDK | 騰訊位置服務 (qq.com)
點擊去下載其中之一即可。
?下載好后,我將它放在這個文件夾中進行使用,放在其它文件夾也行(不一定跟我一樣),看自己習慣,只要到時候導入路徑寫對。
4.去小程序后臺管理開啟安全域名
小程序 (qq.com)
將這個域名添加進去
https://apis.map.qq.com
5.修改配置manifest.json文件
將位置接口勾選了
還要修改其源碼,將以下這段代碼添加:
"permission" : {
"scope.userLocation" : {
"desc" : "為了您更好的體驗,請確認獲取您的位置信息"
}
},
"requiredPrivateInfos" : [
"getLocation",
"chooseLocation",
"onLocationChange",
"startLocationUpdateBackground"
]
具體在這里下面添加:?
6.在使用到的頁面引入sdk
import QQMapWX from "../../common/qqmap-wx-jssdk.js"
不過這里有個坑,這樣導入會報錯,我查閱了一下,使用require導入也不行,具體是這樣操作之后就可以了。
找到剛才你下載的sdk源文件,打開它滑倒最下面,將
module.exports = QQMapWX;注釋掉,換成
export default QQMapWX;
7.使用uni.getLocation獲取經(jīng)緯度信息給QQMapWX實例進行使用
uni.getLocation(OBJECT) | uni-app官網(wǎng) (dcloud.net.cn)
uni.getLocation(OBJECT)
獲取當前的地理位置、速度。
OBJECT 參數(shù)說明
參數(shù)名 | 類型 | 必填 | 說明 | 平臺差異說明 |
---|---|---|---|---|
type | String | 否 | 默認為 wgs84 返回 gps 坐標,gcj02 返回國測局坐標,可用于?uni.openLocation ?和 map 組件坐標,App 和 H5 需配置定位 SDK 信息才可支持 gcj02。 |
|
altitude | Boolean | 否 | 傳入 true 會返回高度信息,由于獲取高度需要較高精確度,會減慢接口返回速度 | 抖音小程序、飛書小程序、支付寶小程序不支持 |
geocode | Boolean | 否 | 默認false,是否解析地址信息 | 僅App平臺支持(安卓需指定 type 為 gcj02 并配置三方定位SDK) |
highAccuracyExpireTime | Number | 否 | 高精度定位超時時間(ms),指定時間內返回最高精度,該值3000ms以上高精度定位才有效果 | App (3.2.11+)、H5 (3.2.11+)、微信小程序 (基礎庫 2.9.0+) |
timeout | String | 否 | 默認為 5,定位超時時間,單位秒 | 僅飛書小程序支持 |
cacheTimeout | Number | 否 | 定位緩存超時時間,單位秒;每次定位緩存當前定位數(shù)據(jù),并記下時間戳,當下次調用在cacheTimeout之內時,返回緩存數(shù)據(jù) | 僅飛書小程序、支付寶小程序支持 |
accuracy | String | 否 | 默認為 high,指定期望精度,支持 high,best。當指定 high 時,期望精度值為100m,當指定 best 時期望精度值為20m。當定位得到的精度不符合條件時,在timeout之前會繼續(xù)定位,嘗試拿到符合要求的定位結果 | 僅飛書小程序支持 |
isHighAccuracy | Boolean | 否 | 開啟高精度定位 | App (3.4.0+)、H5 (3.4.0+)、微信小程序 (基礎庫 2.9.0+) |
success | Function | 是 | 接口調用成功的回調函數(shù),返回內容詳見返回參數(shù)說明。 | |
fail | Function | 否 | 接口調用失敗的回調函數(shù) | |
complete | Function | 否 | 接口調用結束的回調函數(shù)(調用成功、失敗都會執(zhí)行) |
success 返回參數(shù)說明
參數(shù) | 說明 |
---|---|
latitude | 緯度,浮點數(shù),范圍為-90~90,負數(shù)表示南緯 |
longitude | 經(jīng)度,浮點數(shù),范圍為-180~180,負數(shù)表示西經(jīng) |
speed | 速度,浮點數(shù),單位m/s |
accuracy | 位置的精確度 |
altitude | 高度,單位 m |
verticalAccuracy | 垂直精度,單位 m(Android 無法獲取,返回 0) |
horizontalAccuracy | 水平精度,單位 m |
address | 地址信息(僅App端支持,需配置geocode為true) |
address 地址信息說明
屬性 | 類型 | 描述 | 說明 |
---|---|---|---|
country | String | 國家 | 如“中國”,如果無法獲取此信息則返回undefined |
province | String | 省份名稱 | 如“北京市”,如果無法獲取此信息則返回undefined |
city | String | 城市名稱 | 如“北京市”,如果無法獲取此信息則返回undefined |
district | String | 區(qū)(縣)名稱 | 如“朝陽區(qū)”,如果無法獲取此信息則返回undefined |
street | String | 街道信息 | 如“酒仙橋路”,如果無法獲取此信息則返回undefined |
streetNum | String | 獲取街道門牌號信息 | 如“3號”,如果無法獲取此信息則返回undefined |
poiName | String | POI信息 | 如“電子城.國際電子總部”,如果無法獲取此信息則返回undefined |
postalCode | String | 郵政編碼 | 如“100016”,如果無法獲取此信息則返回undefined |
cityCode | String | 城市代碼 | 如“010”,如果無法獲取此信息則返回undefined |
示例
uni.getLocation({
type: 'wgs84',
success: function (res) {
console.log('當前位置的經(jīng)度:' + res.longitude);
console.log('當前位置的緯度:' + res.latitude);
}
});
使用type:'gcj02?'會準確一些。
以下是完整demo代碼,其中參考了這位老哥的文章【uniapp小程序實戰(zhàn)】—— 使用騰訊地圖獲取定位_uniapp 騰訊地圖-CSDN博客
<template>
<view class="content">
<view class="address" @click="getposition">
獲取定位
</view>
當前的定位是:{{position}}
</view>
</template>
<script>
import QQMapWX from "../../common/qqmap-wx-jssdk.js"
export default {
data() {
return {
title: 'Hello',
position:''
}
},
methods: {
async getposition() {
const location = await this.getLocationInfo()
console.log("lo",location)
this.position = location.formatted_addresses
console.log("po",this.position)
},
async getLocationInfo() {
return new Promise((resolve) => {
let location = {
longitude: 0,
latitude: 0,
province: "",
city: "",
area: "",
street: "",
address: "",
formatted_addresses:""
};
// 使用uni.getLocation獲取經(jīng)緯度
uni.getLocation({
type: "gcj02",
isHighAccuracy: true,
success(res) {
location.longitude = res.longitude;
location.latitude = res.latitude;
// 創(chuàng)建實例
const qqmapsdk = new QQMapWX({
key: 'ONXBZ-6G2L3-7OT3O-ODZDC-K35HK-5KBF5' //這里填寫自己申請的key
});
// 使用騰訊的逆地址解析
qqmapsdk.reverseGeocoder({
location,
success(response) {
console.log("成功!",response.result)
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;
location.formatted_addresses = info.formatted_addresses.standard_address
resolve(location);
},
});
},
fail(err) {
console.log(err)
resolve(location);
},
});
});
}
}
}
</script>
<style scoped>
.address{
width: 50px;
height: 50px;
background-color: aqua;
}
</style>
8.為了防止不同步配置,在微信小程序開發(fā)者平臺檢查一下,如果沒有同步過來可以關了重新編譯。
點擊獲取定位,能夠成功獲取到定位信息。?
?具體返回的json文件可以點開這里查看保存下來,因為請求的騰訊api每天的額度有上限(具體額度在下面有說明),雙擊打開保存下來可以參考使用。
9.可能存在位置發(fā)生偏移(不準確)的問題
我將獲取到的經(jīng)緯度拿去坐標拾取器里面復原位置是準確的,也就是說經(jīng)緯度對應逆地址解析的位置是正確的,問題出現(xiàn)在獲取到的經(jīng)緯度不準確。綜合來看,就是uni.getLocation的問題。
為此,查看了一下其它文章,在編輯器中獲取的定位信息確實是有偏差,我這里就去真機調試了一番,我這里的結果是真機調試的位置誤差小于100,而在編輯器中卻是有2公里左右的誤差。具體的解決方案有待討論。 (比較菜,暫時找不到方案解決)
10.存在真機調試getLocation報錯
真機調試控制臺窗口
我也是多次幾次才成功的! (這個位置就比較準確)
?
報錯的原因可能是:
也就是說30秒內僅一次有效。??
11. 調用額度說明
具體是這個模塊
這里為接口分配額度,普通開發(fā)者只有最高每天10000的額度,升級為企業(yè)級會多一些。
調用了多少,可以在這里看到,這里主要使用逆地址解析接口:
?文章來源:http://www.zghlxwxcb.cn/news/detail-836534.html
以上就是使用騰訊地圖進行定位的完整過程,其它方案如果有好的,也歡迎分享交流。文章來源地址http://www.zghlxwxcb.cn/news/detail-836534.html
到了這里,關于uniapp開發(fā)小程序獲取定位信息(騰訊地圖)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!