0


前端获取用户地理位置定位

前端获取用户地理位置定位

前言

在很多的h5/小程序中都需要用到定位,特别是一些连锁店,充电站,共享类的业务。本期就前端如何获取用户定位做一个说明。

1.js原生geolocation

先决条件:需要https,否则运行会获取不到位置信息。或者换成的edge浏览器。由于这个api获取的经纬度不够准确,且由于受到浏览器兼容性的问题,用的比较少。
js原生的方式其实就是利用了js的api:navigator。这边直接上代码,大家可以去运行一下,这个api只能拿到经度跟纬度

if (navigator.geolocation) {
          navigator.geolocation.getCurrentPosition((position) => {
            console.log(position);
            this.$set(this.location, 0, position.coords.longitude);
            this.$set(this.location, 1, position.coords.latitude);
          });
          console.log(this.location);
        } else {
          alert('您的设备不支持定位功能');
        }

2.第三方地图

第三方的方式主要就是利用第三方的sdk,常见的如 百度地图,高德地图,腾讯地图,我这里就以百度地图为例
注册百度地图,并拿到ak,在vue的index.html中引入
image.png

 <script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak=kz26jZQiN4x1rkRAQhW0vTcnUet34OsD"></script>

在页面中执行以下代码即可拿到城市,经度,纬度

 // 获取当前城市
      const geolocation = new window.BMap.Geolocation();
      geolocation.getCurrentPosition((r) => {
        console.log(r);
        const city = r.address.city; // 返回当前城市
        this.currCity = city;
        this.$set(this.Baidulocation, 0, r.longitude);
        this.$set(this.Baidulocation, 1, r.latitude);
      });

3.微信小程序sdk定位

这里主要是用到微信小程序的getLocation这个sdk,这个sdk在开发者工具中可以直接使用,但是如果上线的话,是需要自己到小程序后台向微信提交申请,申请通过之后才能使用。
由于我这边使用的是uniapp进行开发的,下面贴的是uniapp的代码。

uniapp使用:

**1.**manifest.json中添加授权:

 /* 小程序特有相关 */
    "mp-weixin" : {
        "appid" : "wxd012ca2c1cfc762f",
        "requiredPrivateInfos": [
          "getLocation"
        ],
        "permission":{
          "scope.userLocation":{
            "desc":"授权位置信息"
          }
        },
        "setting" : {
            "urlCheck" : false
        },
        "usingComponents" : true
    },

2.使用:

const getLocation = () => {
  uni.getLocation({
    type: 'wgs84',
    success: function (res) {
      console.log(res)
      console.log('当前位置的经度:' + res.longitude)
      submitForm.latitude = res.latitude
      submitForm.longitude = res.longitude
      console.log('当前位置的纬度:' + res.latitude)
    },
  })
}

微信小程序使用:

也是分两步,1.app.json添加配置 2.直接使用 这里就不作过多说明了
可以参考:https://blog.csdn.net/qq_43886365/article/details/130286822
微信小程序定位参考的官方地址:https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.getLocation.html

补充:

1.小程序中的地图使用:

获取到用户的经纬度之后,使用map组件(微信小程序和uniapp都是map组件)传入经纬度即可。

2.小程序中用户拒绝授权后的处理:

由于微信小程序秉承的是以用户体验至上的原则,所以,用户很有可能会拒绝给到你getLocation的授权,此时就无法获取到用户的位置信息,并且重新进入小程序时,微信在一段时间内会记录用户的授权状态,导致微信的授权页面拉不起来。此时需要去引导用户打开设置页允许位置信息的授权。这里我们可以参考滴滴出行的交互,是比较科学合理的。
首次进入时,在onLoad中唤起微信的位置授权getLocation
image.png
如果用户允许,则可以获取到,如果用户拒绝,则再次提示用户需要开启定位,这里的弹出框就是我们自己写的。
image.png
里面的开启定位,实际是调用了微信的设置页,即button组件的open-type为openSetting
image.png
如果用户点击了开启定位,以下为微信引导页(不用自己写),引导用户去开启位置。
image.png
image.png
如果用户依然点击了取消,说明用户实在是不想授权,则不进行获取位置信息。地图显示一个默认的经纬度信息即可。
重新进入小程序:如果用户上一次进入小程序时,两次都拒绝了授权,那么在重新进入小程序时,只能弹出我们自己写的弹框来引导用户授权位置信息(原因为getLocation的授权被拒绝了,下一次进入即使再调用,也不会出现授权弹框,而是会告诉你直接授权失败)
image.png

三种定位对比

相对来说,直接使用js原生的navigator还是比较不好的,精度稍差。建议如果是在小程序或者公众号h5中,那么就直接使用微信小程序的定位,定位精度高。如果不是在小程序或者公众号h5中,那么就直接使用第三方的地图。

地图逆解析

经过上面三种定位的方式,发现最终的结果都大差不差只有经度跟纬度,地理位置信息的中文实际上是很模糊的。所以我们需要使用第三方地图的地址逆解析,将获取到的经纬度转换为中文的地理坐标信息。值得一提的是,微信小程序默认使用腾讯地图。

最后

demo地址:
原生和第三方获取:https://github.com/rui-rui-an/getlocation
uniapp获取:https://github.com/rui-rui-an/uniappgetlocation


本文转载自: https://blog.csdn.net/weixin_43239880/article/details/130762172
版权归原作者 吃炸鸡的前端 所有, 如有侵权,请联系我们删除。

“前端获取用户地理位置定位”的评论:

还没有评论