(2023进阶版)vue+h5 通过高德地图(原生) 获取当前位置定位

23 篇文章 0 订阅
3 篇文章 0 订阅

前言:因为也是用的上一个版本的代码,为了描述清楚所以就直接复制文章来更改了,这一版更加完善简洁,高德地图精确度也更高
(2021年写过的一版上线了挺长时间,2023年突然被应用市场下架,说流程走不通,就卡在获取定位失败。改了之后已上线运行

  • 经抓包发现,在本地、测试、预生产环境,利用经纬度获取地点这一块,发起了api请求https://restapi.amap.com/v3/geocode/regeo?key=。可正常返回地点信息,按照代码逻辑走
  • 正式环境,会将https://restapi.amap.com/v3/geocode/regeo?key= 直接被替换这个链接restapi.amap.com/v3/assistant/coordinate/convert?key= regeo根本没请求,所以后续代码逻辑走不通

项目需求是:获取到当前城市定位,然后显示该城市的服务项
之前做了一版百度地图,因为商业原因,公司选择了高德地图,所以要对地图进行更换。百度地图原生点这里
也不算顺利,之前做的记录都不存在了。
vue-amap是基于高德原生封装好的供vue使用,对图层的操作会更便捷一些。vue-amap点这里
上一版高德地图原生js指路

当前的需求,只需拿到当前定位。所以可以使用原生js

1.index.html文件

  • 用cdn引入
 <script  type="text/javascript" src="https://webapi.amap.com/maps?v=2.0&key=你的key&plugin=AMap.Geolocation"></script>

2.vue.config.js文件

  • 将cdn引入vue项目里
 externals: {
      // 'BMap':"BMap",
      AMap: 'AMap', // 高德地图配置
      AMapUI: 'AMapUI'
    }

3.使用的页面设置

  • 不用设置 import AMap form’AMap’
    踩得最大的坑就是这个,不晓得为什么网上这多人引入
    一会‘AMap’ is not defined
    一会出现 To install it, you can run: npm install --save AMap
    光是为解决出现的引入问题就花了大半时间

  • 尤其与之对应的 .getCurrentPosition方法更是花样报错,把所有报错轮了一遍。有博主说是在https环境下才能获取成功
    在这里插入图片描述

  • (更新):融合了HTML5 Geolocation定位接口、精确IP定位服务,以及安卓定位sdk定位。定位流程如下:

  • 开发者开启了sdk辅助定位,安卓手机上会优先尝试调用sdk的定位接口,

  • 失败之后优先调用浏览器原生定位接口进行定位

  • 浏览器定位失败之后尝试进行精确IP定位

  • IP定位获取当前城市定位

前文也说了,高德地图进行升级了,定位失败率降低,则思路如下:

  • 上一版通过定位拿到城市边缘经纬度再去请求城市中心这个操作只作为备用选项,为了防止失败。
  • 如果获取不到精确定位会返回状态码error,则在error情况下,进行城市信息获取
  • 如果获取到定位则直接进行业务逻辑编写
  • 新增了 needAddress 属性,当定位成功,可以获取返回定位信息。相应的信息也要处理。该属性藏得很深,反正找到了两份不同的文档吧
 getAmap(){
       
        const that = this;
        AMap.plugin("AMap.Geolocation", () => {
          var geolocation = new AMap.Geolocation({
            // 是否使用高精度定位,默认:true
            enableHighAccuracy: true,
            //是否使用安卓定位sdk用来进行定位,需要安卓端sdk配合
            useNative: true,
            // 设置定位超时时间,默认:无穷大
            timeout: 10000,
            needAddress : true,
          });

          geolocation.getCurrentPosition((status, result) => {  //获取用户当前的精确位置
            if (status == "complete") {
             
				 let data=result.addressComponent 
				 //重点:设置了needAddress属性 定位返回的信息回包含addressComponent对象,里面返回的内容跟regeo请求返回addressComponent 对象一致。
				 if(data.adcode){
               	//业务逻辑代码
              }else {
                that.surePosition(result.position[0],result.position[1]) //防止返回信息不同
            }
            else {
              geolocation.getCityInfo((status, result) => {   //只能获取当前用户所在城市和城市的经纬度
                if (status == "complete") {
                 //业务逻辑代码
                }else {
                  that.showCity = '未获取定位'
                  
                }
              })
            }
          })
        })
      },

4.进行api请求

  • 获取到了大致经纬度与城市,最好再一次进行逆地址编码请求
  • 逆地址编码请求结果更详细更确定城市地址。
  • extensions=all可以不设置,但设置了会获得地标信息商圈这种信息
surePosition(re0,re1){
        const that = this;
        let key='你的key'
        axios.get(`https://restapi.amap.com/v3/geocode/regeo?key=${key}&location=${re0+','+re1}&extensions=all`)
          .then( (response) => {
            console.log('response'+response.data)
            if(response.data.status){
             //业务逻辑代码
              } else {
                that.showCity = '未获取定位'
                
              }
            }
          })
      },
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vue2中,可以使用高德地图API获取当前定位。首先,需要引入高德地图的SDK,并在Vue组件中使用AMap.Geolocation来获取当前位置的经纬度信息。以下是一个示例代码: 首先,在utils文件夹中创建一个名为getLocation.js的文件,用于封装获取经纬度的公用方法。该方法使用了Promise来确保在获取到经纬度信息后再进行后续操作。具体代码如下: ```javascript function loadSDK() { if (window.AMap) return; return new Promise((resolve, reject) => { const script = document.createElement('script'); script.src = 'http://webapi.amap.com/maps?v=1.4.6&key=*****************'; // ***为申请的高德key document.head.appendChild(script); script.onload = resolve; script.onerror = reject; }); } export default async () => { await loadSDK(); return new Promise((resolve) => { AMap.plugin('AMap.Geolocation', () => { const geolocation = new AMap.Geolocation({ enableHighAccuracy: false }); geolocation.getCurrentPosition((status, result) => { const res = status === 'complete' ? result.position : { lat: 39.909187, lng: 116.397451 }; // 默认北京 116.397451、39.909187 console.log('定位结果', res); resolve(res); }); }); }); } ``` 然后,在Vue组件中,可以通过调用上述封装的方法来获取当前定位的经纬度信息。具体代码如下: ```javascript import getLocation from '@/utils/getLocation'; export default { methods: { async getCurrentLocation() { try { const position = await getLocation(); // 在这里可以使用获取到的经纬度信息进行后续操作 console.log('当前定位经纬度', position); } catch (error) { console.error('获取定位失败', error); } }, }, mounted() { this.getCurrentLocation(); }, }; ``` 以上代码中,通过调用`getLocation`方法来获取当前定位的经纬度信息,并在`getCurrentLocation`方法中进行后续操作。在Vue组件的`mounted`钩子函数中调用`getCurrentLocation`方法来获取当前定位信息。 请注意,上述代码中的高德地图SDK的引入地址和申请的key需要根据实际情况进行修改。 #### 引用[.reference_title] - *1* *2* [(2023进阶vue+h5 通过高德地图原生获取当前位置定位](https://blog.csdn.net/yangzixiansheng/article/details/131308415)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [vue使用高德地图获取当前经纬度](https://blog.csdn.net/V_AYA_V/article/details/105275063)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值