当前位置:   article > 正文

uniapp开发小程序获取定位信息(腾讯地图)_uniapp 定位

uniapp 定位

定位一直是一个让人头疼的问题,不是这个有问题就是那里有问题。这里结合我多方查找和实际运行,获得的一些经验给予分享。

怎么进行定位?基本流程是:

1.去腾讯位置服务的控制那里创建一个应用

腾讯位置服务 - 立足生态,连接未来 (qq.com)

2.添加一个key,并开通WebServiceAPI服务

这个key是到时候用来定位的标识(必要的)。开发的哪种就选择哪种就行。

3.下载微信jssdk(这里会用到逆地址解析等等)

微信小程序JavaScript SDK | 腾讯位置服务 (qq.com)

点击去下载其中之一即可。

 下载好后,我将它放在这个文件夹中进行使用,放在其它文件夹也行(不一定跟我一样),看自己习惯,只要到时候导入路径写对。

4.去小程序后台管理开启安全域名

小程序 (qq.com)

将这个域名添加进去

  1. https://apis.map.qq.com

5.修改配置manifest.json文件

将位置接口勾选了

还要修改其源码,将以下这段代码添加:

  1. "permission" : {
  2. "scope.userLocation" : {
  3. "desc" : "为了您更好的体验,请确认获取您的位置信息"
  4. }
  5. },
  6. "requiredPrivateInfos" : [
  7. "getLocation",
  8. "chooseLocation",
  9. "onLocationChange",
  10. "startLocationUpdateBackground"
  11. ]

具体在这里下面添加: 

6.在使用到的页面引入sdk

import QQMapWX from "../../common/qqmap-wx-jssdk.js"

不过这里有个坑,这样导入会报错,我查阅了一下,使用require导入也不行,具体是这样操作之后就可以了。

找到刚才你下载的sdk源文件,打开它滑倒最下面,将

module.exports = QQMapWX;注释掉,换成

export default QQMapWX;

7.使用uni.getLocation获取经纬度信息给QQMapWX实例进行使用

uni.getLocation(OBJECT) | uni-app官网 (dcloud.net.cn)

uni.getLocation(OBJECT)

获取当前的地理位置、速度。

OBJECT 参数说明

参数名类型必填说明平台差异说明
typeString默认为 wgs84 返回 gps 坐标,gcj02 返回国测局坐标,可用于 uni.openLocation 和 map 组件坐标,App 和 H5 需配置定位 SDK 信息才可支持 gcj02。
altitudeBoolean传入 true 会返回高度信息,由于获取高度需要较高精确度,会减慢接口返回速度抖音小程序、飞书小程序、支付宝小程序不支持
geocodeBoolean默认false,是否解析地址信息仅App平台支持(安卓需指定 type 为 gcj02 并配置三方定位SDK)
highAccuracyExpireTimeNumber高精度定位超时时间(ms),指定时间内返回最高精度,该值3000ms以上高精度定位才有效果App (3.2.11+)、H5 (3.2.11+)、微信小程序 (基础库 2.9.0+)
timeoutString默认为 5,定位超时时间,单位秒仅飞书小程序支持
cacheTimeoutNumber定位缓存超时时间,单位秒;每次定位缓存当前定位数据,并记下时间戳,当下次调用在cacheTimeout之内时,返回缓存数据仅飞书小程序、支付宝小程序支持
accuracyString默认为 high,指定期望精度,支持 high,best。当指定 high 时,期望精度值为100m,当指定 best 时期望精度值为20m。当定位得到的精度不符合条件时,在timeout之前会继续定位,尝试拿到符合要求的定位结果仅飞书小程序支持
isHighAccuracyBoolean开启高精度定位App (3.4.0+)、H5 (3.4.0+)、微信小程序 (基础库 2.9.0+)
successFunction接口调用成功的回调函数,返回内容详见返回参数说明。
failFunction接口调用失败的回调函数
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

success 返回参数说明

参数说明
latitude纬度,浮点数,范围为-90~90,负数表示南纬
longitude经度,浮点数,范围为-180~180,负数表示西经
speed速度,浮点数,单位m/s
accuracy位置的精确度
altitude高度,单位 m
verticalAccuracy垂直精度,单位 m(Android 无法获取,返回 0)
horizontalAccuracy水平精度,单位 m
address地址信息(仅App端支持,需配置geocode为true)

address 地址信息说明

属性类型描述说明
countryString国家如“中国”,如果无法获取此信息则返回undefined
provinceString省份名称如“北京市”,如果无法获取此信息则返回undefined
cityString城市名称如“北京市”,如果无法获取此信息则返回undefined
districtString区(县)名称如“朝阳区”,如果无法获取此信息则返回undefined
streetString街道信息如“酒仙桥路”,如果无法获取此信息则返回undefined
streetNumString获取街道门牌号信息如“3号”,如果无法获取此信息则返回undefined
poiNameStringPOI信息如“电子城.国际电子总部”,如果无法获取此信息则返回undefined
postalCodeString邮政编码如“100016”,如果无法获取此信息则返回undefined
cityCodeString城市代码如“010”,如果无法获取此信息则返回undefined

示例

  1. uni.getLocation({
  2. type: 'wgs84',
  3. success: function (res) {
  4. console.log('当前位置的经度:' + res.longitude);
  5. console.log('当前位置的纬度:' + res.latitude);
  6. }
  7. });

使用type:'gcj02 '会准确一些。

以下是完整demo代码,其中参考了这位老哥的文章【uniapp小程序实战】—— 使用腾讯地图获取定位_uniapp 腾讯地图-CSDN博客

  1. <template>
  2. <view class="content">
  3. <view class="address" @click="getposition">
  4. 获取定位
  5. </view>
  6. 当前的定位是:{{position}}
  7. </view>
  8. </template>
  9. <script>
  10. import QQMapWX from "../../common/qqmap-wx-jssdk.js"
  11. export default {
  12. data() {
  13. return {
  14. title: 'Hello',
  15. position:''
  16. }
  17. },
  18. methods: {
  19. async getposition() {
  20. const location = await this.getLocationInfo()
  21. console.log("lo",location)
  22. this.position = location.formatted_addresses
  23. console.log("po",this.position)
  24. },
  25. async getLocationInfo() {
  26. return new Promise((resolve) => {
  27. let location = {
  28. longitude: 0,
  29. latitude: 0,
  30. province: "",
  31. city: "",
  32. area: "",
  33. street: "",
  34. address: "",
  35. formatted_addresses:""
  36. };
  37. // 使用uni.getLocation获取经纬度
  38. uni.getLocation({
  39. type: "gcj02",
  40. isHighAccuracy: true,
  41. success(res) {
  42. location.longitude = res.longitude;
  43. location.latitude = res.latitude;
  44. // 创建实例
  45. const qqmapsdk = new QQMapWX({
  46. key: 'ONXBZ-6G2L3-7OT3O-ODZDC-K35HK-5KBF5' //这里填写自己申请的key
  47. });
  48. // 使用腾讯的逆地址解析
  49. qqmapsdk.reverseGeocoder({
  50. location,
  51. success(response) {
  52. console.log("成功!",response.result)
  53. let info = response.result;
  54. console.log(info);
  55. location.province = info.address_component.province;
  56. location.city = info.address_component.city;
  57. location.area = info.address_component.district;
  58. location.street = info.address_component.street;
  59. location.address = info.address;
  60. location.formatted_addresses = info.formatted_addresses.standard_address
  61. resolve(location);
  62. },
  63. });
  64. },
  65. fail(err) {
  66. console.log(err)
  67. resolve(location);
  68. },
  69. });
  70. });
  71. }
  72. }
  73. }
  74. </script>
  75. <style scoped>
  76. .address{
  77. width: 50px;
  78. height: 50px;
  79. background-color: aqua;
  80. }
  81. </style>

8.为了防止不同步配置,在微信小程序开发者平台检查一下,如果没有同步过来可以关了重新编译。

点击获取定位,能够成功获取到定位信息。 

 具体返回的json文件可以点开这里查看保存下来,因为请求的腾讯api每天的额度有上限(具体额度在下面有说明),双击打开保存下来可以参考使用。

9.可能存在位置发生偏移(不准确)的问题

我将获取到的经纬度拿去坐标拾取器里面复原位置是准确的,也就是说经纬度对应逆地址解析的位置是正确的,问题出现在获取到的经纬度不准确。综合来看,就是uni.getLocation的问题。

为此,查看了一下其它文章,在编辑器中获取的定位信息确实是有偏差,我这里就去真机调试了一番,我这里的结果是真机调试的位置误差小于100,而在编辑器中却是有2公里左右的误差。具体的解决方案有待讨论。 (比较菜,暂时找不到方案解决)

10.存在真机调试getLocation报错

真机调试控制台窗口

我也是多次几次才成功的! (这个位置就比较准确)

 

报错的原因可能是:

也就是说30秒内仅一次有效。  

11. 调用额度说明

具体是这个模块

这里为接口分配额度,普通开发者只有最高每天10000的额度,升级为企业级会多一些。

调用了多少,可以在这里看到,这里主要使用逆地址解析接口:

 

以上就是使用腾讯地图进行定位的完整过程,其它方案如果有好的,也欢迎分享交流。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/665387
推荐阅读