最近有个需求,需要获取手机App端用户的地理位置,不需要太精确,能获取到市就可以了。但是由谁来获取呢?服务器端还是客户端?
一、手机App端获取
经过调查,手机App端可以通过两种方式获取地理位置,GPS 和 LBS 。
- GPS(Global Positioning System,全球卫星定位系统),通过接收 GPS 卫星提供的经纬度坐标信号来进行定位。
只要该系统具有包含GPS接收器的设备,能接收4颗卫星的定位信号,就可以计算地球表面上物体或人的准确地理坐标,误差在5-10米。
优势:精确。
缺点:受天气和位置影响较大。高架桥、高楼角落、地下车库、见不到天空的场所等等,定位会受到影响,甚至无法定位。
- LBS(Location Based Service,移动位置基站系统),通过移动通信的基站信号差异来计算出手机所在的位置。
理论上说,只要计算三个基站的信号差异,就可以判断出手机所在的位置。只要用户手机处于移动通信网络的有效范围之内,就可以随时进行位置定位,而不受天气、高楼、位置等等的影响。
优点:方便;
缺点:LBS基站定位的精确度从500-5000米不等。使用范围较窄,超出手机的服务范围,或者手机所处的基站数量不足,则无法定位。还有直放站对基站数据的影响,另外数据库更新的不及时,移动通讯运营商随时都可能变更、增加、删除基站编号。
二、服务器端自行获取
手机App和即时通讯服务器是保持长连接的,只要手机App端的用户在聊天,那么即时通讯服务器就可以获取手机上网的ip地址。
// ChannelHandlerContext ctx
InetSocketAddress ipSocket = (InetSocketAddress)ctx.channel().remoteAddress();
String clientIp = ipSocket.getAddress().getHostAddress();
log.info("客户端ip地址:{}",clientIp);
一个根据本机ip获取位置的网址:
pv.sohu.com/cityjson?ie=utf-8
替换ip就可获取位置的网址:opendata.baidu.com/api.php?query=183.209.110.254&co=&resource_id=6006&t=1433920989928&ie=utf8&oe=utf-8&format=json一个自主维护ip与地址关系的git参考: https://gitee.com/lionsoul/ip2region
获取ip地址是第一步,第二步是要根据ip地址通过第三方接口获取实际的地理位置。
网上也有开源的免费插件,但是ip地址与地理位置对应的数据还要自己维护,数据不能保证准确,还是使用第三方接口可靠些。
其他参考文档:根据ip地址获取城市名的几种方法: https://blog.csdn.net/weixin_34358365/article/details/92600072
如何通过IP地址获取城市信息:
https://page.om.qq.com/page/OAV30uzMHPDj7PfDrrYHyFww0 一招教你获取当前ip地址与所处城市:https://wenku.baidu.com/view/2d3d3af687254b35eefdc8d376eeaeaad1f3160b.htmlAndroid手机获取外网ip:https://blog.csdn.net/qq_44934581/article/details/89485720 百度接口通过ip获取用户所在地:https://www.pianshen.com/article/1951171075/
三、到底是手机客户端获取,还是服务器端获取呢?
客户端获取,还需要提交给服务器,加接口加字段,麻烦!
如果客户端禁用了获取地理位置的功能,那么就没有东西提交给服务器了。
对比之下,还是服务器端获取吧!
以上便是我的调查整理,希望对你有帮助。
网友评论