前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PC端网页使用微信扫码获取用户精确地理位置的一种解决方案[未测试]

PC端网页使用微信扫码获取用户精确地理位置的一种解决方案[未测试]

作者头像
双面人
发布2019-04-10 11:25:47
3K0
发布2019-04-10 11:25:47
举报
文章被收录于专栏:热爱IT热爱IT

移动互联网时代,获取用户地理位置来实现LBS当然不再话下。

在传统的PC浏览器应用领域,想获取用户的位置信息一般采用第三方的IP库,比如:淘宝IP地址库。但这种解决方案的缺陷是显而易见的:

1、只能获取大概位置,不精确;

2、不准确。尤其是使用V**网络的时候,差别几千公里。

现在,我们结合移动互联网,为PC浏览器应用领域获取用户位置信息带来精准快捷的解决方案。利用国内较快的4G网络环境、国民应用“微信”、webSocket推送技术,可以做到良好的使用体验(平均耗时1-2秒);

技术点: webSocket 、 nodejs (生成二维码服务、socket服务)、 HTML5 gpsAPI 、第三方地图解析服务。

一、PC页面

连接到webSocket,获取socketId生成二维码(使用nodejs的生成二维码服务接口、angularJs)

代码语言:javascript
复制
var socket = io.connect('https://hking.me:3001');
socket.on('connect', function(data) {  
    $scope.$apply(function(){
        $scope.wechatLocation.qr = 'https://hking.me/qrcode?text=https://蓉.我爱你/gpsLocation.html?socketId='+socket.id;
    })
});

二、mobile页面

navigator.geolocation获取GPS坐标,调用高德地图API获取对应地理位置信息。

代码语言:javascript
复制
navigator.geolocation.getCurrentPosition(
    function (position) {
        var gg_lon = position.coords.longitude;  
        var gg_lat =  position.coords.latitude; 
        var gpsLonLat = gg_lon+','+gg_lat;
        AMap.convertFrom(gpsLonLat,'GPS',function(status,result){
            var lnglatXY=new AMap.LngLat(result.locations[0].lng,result.locations[0].lat); 
            AMap.plugin('AMap.Geocoder', function () {
		var geocoder = new AMap.Geocoder({
		    radius: 100,
		    extensions: "base",
		    roadlevel: 1
		});
		geocoder.getAddress(lnglatXY, function (status, result) {
                    var data = result.regeocode;
                    $scope.$apply(function(){
                        $scope.positioning = false;
                        $scope.lData.AreaGuid =  data.addressComponent.adcode;
                        $scope.lData.UseArea  =  data.addressComponent.province + data.addressComponent.city + data.addressComponent.district;
                        $scope.lData.data = data;
                    });
                });
            });	
        });
    },
    function(err){
        location.reload();
    },
    {enableHighAccuracy:true}
);

提交数据到webSocket服务器

代码语言:javascript
复制
var socket = io.connect('https://hking.me:3001');
$scope.save = function(){
	var d = $scope.lData;
	var data = {
		socketId:socketId,
		AreaGuid: d.AreaGuid,
		UseArea: d.UseArea,
		data: JSON.stringify(d.data)
	}
	socket.emit('saveLocation',data);
	alert("保存成功!");
	WeixinJSBridge.call('closeWindow');
};

三、服务端

代码语言:javascript
复制
const fs = require('fs');
const options = {
    key: fs.readFileSync('ssl.key'),  
    cert: fs.readFileSync('ssl.pem')
};
const app = require('https').createServer(options);
const io = require('socket.io').listen(app);
app.listen(3001);
io.sockets.on('connection', function (socket) {
    socket.on('saveLocation', function (data) {
        io.sockets.connected[data.socketId].emit('getLocation',{AreaGuid: data.AreaGuid,UseArea: data.UseArea}); 
    });
});

四、PC页面接收webSocket推送回来的地理位置数据

代码语言:javascript
复制
socket.on('getLocation', function (data) {
    console.log(data);
    $scope.$apply(function(){
        $scope.wechatLocation.AreaGuid = data.addressComponent.adcode;
        $scope.wechatLocation.UseArea = data.formattedAddress;
        $scope.wechatLocation.AllData = $scope.syntaxHighlight(data);
        $scope.wechatLocation.openState = false;
    })
});

(完)

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档