前端获取用户地理定位的几种方式(Geolocation API,微信,腾讯地图)


前言

定位一般分为两种场景:移动端和PC,下面分别讲下这两个场景在使用定位过程中的一些注意事项。

  • 移动端
    移动端包括手机,pad和其它带有GPS定位芯片的智能设备(如手表、音箱等),移动端的系统包括iOS和Android。成功完成定位需要达成以下前提条件:
    • 系统GPS打开
    • 所使用的App或浏览器已获取定位权限
    • 对打开的页面允许使用定位
    • 对于iOS10以上系统和Android的一些版本已禁止在非HTTPS协议的域名下定位,请尽快将站点升级到HTTPS
  • PC端
    因为pc设备上大都缺少GPS芯片,所以在PC上的定位主要通过IP精准定位服务

一、 Geolocation API

这是HTML5新推出的地理位置API,但从性能和精确度上来,都不理想。尤其PC端精确地非常低且经常获取失败。用者甚少。

二、微信 SDK

这种适用于在微信H5场景应用(比如公众号H5),只能在微信浏览器内使用微信的SDK。

1.引入jssdk

<script src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>

2. 获取签名,注入配置

所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用。从后台获取配置信息,拿到appIdtimestampnonceStrsignature,通过wx.config注入配置信息

$http({
        method: 'GET',
        url: '/wechat/ticket/V3' + '?url=' + encodeURIComponent(location.href),
}).then(
        function successCallback (sign) {
                wx.config({
                    debug: false,
                    appId: sign.appId, // 必填,公众号的唯一标识
                    timestamp: sign.timestamp, // 必填,生成签名的时间戳
                    nonceStr: sign.nonceStr, // 必填,生成签名的随机串
                    signature: sign.signature, // 必填,签名,见附录1
                    jsApiList: [
                    	...,
                        'getLocation',
                        'openLocation',
                    ]
                });
        },
        function errorCallback (response) {
            console.info(response)
        }
);

3. 调用JS-SDK api 获取位置

    // 获取用户定位
    function getLocation() {
        return new Promise(function (resolve,reject) {
            if (browser.versions.weixin) {
                wx.ready(function () {
                    wx.getLocation({
                        type: 'gcj02', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
                        success: function (res) {
                            resolve({
                            	latitude: res.latitude,
                            	longitude: res.longitude,
                            	speed: res.speed, // 速度,以米/每秒计
            					accuracy: res.accuracy // 位置精度
                            });
                        },
                        cancel: function () {
                            reject('定位失败,请重新获取并允许定位');
                        },
                        fail: function () {
                            reject('定位失败,请检查您设备权限后重新尝试');
                        }
                    });
                });
                wx.error(function(err) {
      				// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
      				reject(`wxjsapi-error: ${err}`)
    			})
            } else {
                reject('定位失败,请在微信中打开');
            }
        })
    }

三、第三方服务(腾讯地图服务)

1.引入js文件

引入封装好的JS文件,通过调用js api的接口获取定位信息
js引入地址:https://apis.map.qq.com/tools/geolocation/min?key=yourkey&referer=myapp

key : 必填,开发密钥(key)

function loadMap() {
    var url = 'https://apis.map.qq.com/tools/geolocation/min?key=[your key]&referer=location&callback=initMap'; // 成功回调为initMap方法
    var jsapi = document.createElement('script');
    jsapi.charset = 'utf-8';
    jsapi.src = url;
    document.head.appendChild(jsapi);
}

2.获取定位

window.initMap = function () {
        var geolocation = new qq.maps.Geolocation([your key]);
        geolocation.getLocation(function success(position) {
            $scope.position = position;
        }, function error(result) {
            console.log('获取定位失败', JSON.stringify(result));
        }, {
                timeout: 15000, // 默认值为10s;
                failTipFlag: true
        });
}

定位成功返回结果:

{   "module":"geolocation",
    "nation": "中国",
    "province": "广东省",
    "city":"深圳市",
    "district":"南山区",
    "adcode":"440305", //行政区ID,六位数字, 前两位是省,中间是市,后面两位是区,比如深圳市ID为440300
    "addr":"深圳大学杜鹃山(白石路北250米)",
    "lat":22.530001, //火星坐标(gcj02),腾讯、Google、高德通用
    "lng":113.935364,
    "accuracy":13 //误差范围,以米为单位
}

总结

获取用户定位在移动端业务场景上用的非常多。

  • 15
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
要在web端使用腾讯地图API获取用户地理位置,可以使用HTML5中的Geolocation API。以下是一些简单的步骤: 1. 注册腾讯地图开发者账号并创建应用程序,然后获取密钥。 2. 在HTML页面中嵌入JavaScript代码,使用Geolocation API请求用户位置: ```javascript if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(showPosition); } else { alert("Geolocation is not supported by this browser."); } function showPosition(position) { var lat = position.coords.latitude; var lng = position.coords.longitude; // 调用腾讯地图API进行地理编码 } ``` 3. 在showPosition函数中,可以将用户的经纬度坐标传递给腾讯地图API进行地理编码,以获取用户位置的详细信息: ```javascript function showPosition(position) { var lat = position.coords.latitude; var lng = position.coords.longitude; var url = "https://apis.map.qq.com/ws/geocoder/v1/?location=" + lat + "," + lng + "&key=YOUR_KEY"; fetch(url) .then(response => response.json()) .then(data => { console.log(data.result.formatted_addresses.recommend); // 显示用户位置信息 }); } ``` 在以上代码中,需要将YOUR_KEY替换为你在腾讯地图开发者账号中生成的API密钥。 4. 最后,可以将获取到的用户位置信息显示在页面上,以便用户查看。 需要注意的是,使用Geolocation API获取用户位置需要用户授权。在请求用户授权时,可以使用下面的代码: ```javascript navigator.permissions.query({name:'geolocation'}).then(function(result) { if (result.state === 'granted') { navigator.geolocation.getCurrentPosition(showPosition); } else if (result.state === 'prompt') { navigator.geolocation.getCurrentPosition(showPosition, showError); } else if (result.state === 'denied') { showError("User denied geolocation"); } }); ``` 在以上代码中,使用permissions.query()函数查询用户是否授权Geolocation API,并根据结果调用相应的函数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值